লিনাক্সে কমান্ড ব্যবহারের অপেক্ষা করবেন?


16
#!/bin/bash
function back()
{
    sleep $1
    exit $2
}
back $1 $2 &
b=$!
if `wait $!`;then
    echo success
else
    echo failure
fi
bash-3.00# ./back 300 0
failure
bash-3.00# ./back 300 1
failure

আমি success0 পাঠানোর সময় আমি প্রস্থান স্থিতি হিসাবে প্রত্যাশা করেছিলাম তবে আমি এখনও পাচ্ছি failure

এছাড়াও, wait300 সেকেন্ডের জন্য অপেক্ষা করবেন না। পরিবর্তে, আমি অবিলম্বে বার্তাটি পেতে পারি। আমি ধরে নিয়েছি আমার স্ক্রিপ্টের $!তাত্ক্ষণিক শিশু $$। তাই না?

অপেক্ষা করার মতো প্রস্থান স্থিতি ক্যাপচার করা কি সম্ভব exit_status=$(wait $!)?

if ! ((exit_status));then
    echo sucess
else
    failure
fi

উত্তর:


20

সমস্যাটি হ'ল waitআপনি একটি সাব শীলে জারি করছেন :

if `wait $!`;then

কারণ waitএকটি বিল্টিন, কোনও কমান্ড নয়, এটি আপনার বর্তমান শেল নয়, সাব- শেলের উপর কাজ করছে।

আপনি যে আউটপুটটি দেখতে পাবেন তা কিন্তু তা নয়:

wait: pid 12344 is not a child of this shell

... 1 এর রিটার্ন স্ট্যাটাস সহ।

আপনার পরীক্ষাটি সম্পাদন করার জন্য আপনাকে সাব-শেল ব্যবহার না করে এটি করতে হবে।

#!/bin/bash
function back()
{
  sleep $1
  exit $2
}
back $1 $2 &
b=$!

wait $b && echo success || echo failure

এটি আপনার প্রত্যাশিত ফলাফল দেয় এবং যতক্ষণ আপনি প্রত্যাশা করেন:

$ time ./test.sh 3 0
success
./test.sh 3 0  0.00s user 0.01s system 0% cpu 3.012 total
$ time ./test.sh 3 1
failure
./test.sh 3 1  0.00s user 0.01s system 0% cpu 3.012 total

আপনি যে কোনও কমান্ডের প্রস্থান স্থিতি এটি দিয়ে পরীক্ষা করতে পারেন $?:

$ /bin/true
$ echo $?
0
$ /bin/false
$ echo $?
1

আপনার স্ক্রিপ্টে বেশ কয়েকটি অন্যান্য ত্রুটি ছিল। আপনার #!লাইনটি ত্রুটিযুক্ত ছিল, যা আমি স্থির করেছি। আপনি দায়িত্ব অর্পণ $!করতে $b, কিন্তু ব্যবহার করবেন না $b


12

ব্যাকটিকস সরান।

যেমনটি হ'ল, আপনি waitএকটি সাবশেলে চালাচ্ছেন, যার পিতামাতার শেলের কাজগুলিতে অ্যাক্সেস নেই, তাই এটি অবিলম্বে ব্যর্থ হবে।


আপনি যদি প্রস্থান স্থিতি চান, $?অপেক্ষা করার সাথে সাথেই এর মানটি পান ।

command_here &
wait
status=$?

2

ব্যাকটিকগুলি সরিয়ে প্রোগ্রামটি কাজ করবে তবে পুরোপুরি নয় কারণ ইতিমধ্যে চিহ্নিত কারণগুলির কারণে। এটি সত্য যে waitঅবিলম্বে ব্যর্থ হয় কারণ এটি সাবসেলে চলে এবং এর পিতামাতার প্রক্রিয়াগুলি অ্যাক্সেস করতে পারে না, তবে আপনি যদি কাজ করে এমন একটি আদেশ ব্যবহার করেন তবে প্রোগ্রামটি প্রত্যাশার মতো চলবে না।

ifবিবৃতি একটি প্রোগ্রাম এবং চেক রান তার প্রস্থান অবস্থা শূন্য বা নন-জিরো হলে। আপনি যখন ব্যাকটিক্স ব্যবহার করেন, যদি বিবৃতিটি প্রক্রিয়াটির আউটপুট নেয় , প্রোগ্রাম হিসাবে এটি চালানোর চেষ্টা করুন এবং তারপরে সেই প্রক্রিয়াটির জন্য প্রস্থান কোডটি ব্যবহার করুন। সুতরাং প্রোগ্রাম ব্যর্থ হচ্ছে না কারণ waitব্যর্থ হয়েছে, বরং এটি ব্যর্থ হয়েছে কারণ waitকোনও আউটপুট উত্পাদন করে না।

আপনি echoব্যাকটিক্সের ভিতরে ব্যবহার করে স্ক্রিপ্টটি কাজ করতে পারেন :

if `echo wait $!`; then
    echo success
else
    echo failure
fi

বা কেবল ব্যাকটিকগুলি অপসারণ করুন; সবার জন্য সহজ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.