लिनक्स में कमांड के उपयोग की प्रतीक्षा करें?


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

successजब मैं 0 भेजता था, तो मुझे बाहर निकलने की स्थिति के रूप में उम्मीद थी , लेकिन मुझे अभी भी मिल रहा है 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कोई आउटपुट नहीं देता है।

आप echobackticks के अंदर का उपयोग करके स्क्रिप्ट काम कर सकते हैं :

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

या सिर्फ बैकटिक्स को हटा दें; सभी के लिए आसान।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.