क्या मैं किसी तरह पहले से चल रहे prog1 में "&& prog2" जोड़ सकता हूं?


87

अधिकांश गोले कुछ तरीकों से आदेशों के निष्पादन की श्रृंखला &&और ;श्रृंखला प्रदान करते हैं। लेकिन क्या होगा अगर एक कमांड पहले से ही चल रही है, क्या मैं अभी भी किसी तरह पहले के परिणाम के आधार पर निष्पादित होने के लिए एक और कमांड जोड़ सकता हूं?

कहो मैं भागा

$ /bin/myprog
some output...

लेकिन मैं वास्तव में चाहता था /bin/myprog && /usr/bin/mycleanup। मैं myprogसब कुछ नहीं मार सकता और पुनः आरंभ नहीं कर सकता क्योंकि बहुत अधिक समय खो जाएगा। मैं कर सकता हूँ Ctrl+ Zऔर fg/ bgयदि आवश्यक हो। क्या यह मुझे किसी अन्य कमांड में चेन करने की अनुमति देता है?

मुझे ज्यादातर बैश में दिलचस्पी है, लेकिन सभी सामान्य गोले के जवाब का स्वागत है!

जवाबों:


118

आप waitकमांड के साथ उसी शेल में ऐसा करने में सक्षम होना चाहिए :

$ sleep 30 &
[1] 17440

$ wait 17440 && echo hi

...30 seconds later...
[1]+  Done                    sleep 30
hi

बैश मैन पेज से अंश

wait [n ...]
     Wait for each specified process and return its termination status. Each n 
     may be a process ID or a job specification; if a job spec is given,  all 
     processes  in that job's pipeline are waited for.  If n is not given, all 
     currently active child processes are waited for, and the return status is 
     zero.  If n specifies a non-existent process or job, the return status is 
     127.  Otherwise, the return status is the exit status of the last process 
     or job waited for.

कमांड पर इंतजार कर काम करना चाहिए।
BillThor

पृष्ठभूमि की प्रक्रिया के PID में प्रवेश करने के लिए कई संक्षिप्त रूप हैं %, जैसे कि , %1और $!। पीआईडी ​​की आपूर्ति करना महत्वपूर्ण है या दूसरी कमांड हमेशा चलेगी।
बिलथोर

@BillThor - क्या आप सिर्फ जवाब क्वालिफाई कर रहे हैं या मुझे यह बता रहे हैं?
स्लम

मैं जवाब को क्वालिफाई कर रहा हूं। एक सादा waitवांछित परिणाम प्रदान करने में विफल रहेगा। छोटे रूपों का उपयोग करना आम है क्योंकि वे टाइपोस से कम हैं।
बिलचोर

2
मुझे पहली बार अपने चमकदार नया बिल्ला :) पर आप बधाई देने के लिए हो
terdon

63

fgप्रोग्राम से बाहर निकलने के कोड के साथ यह फिर से शुरू होता है। इसलिए आप अपने कार्यक्रम को स्थगित कर सकते हैं ^Zऔर fg && ...फिर इसे फिर से शुरू करने के लिए उपयोग कर सकते हैं।

$ /bin/myprog
some output...
^Z
[1]+ Stopped              /bin/myprog
$ fg && /usr/bin/mycleanup

यदि आप समाप्त होने से पहले फिर से निलंबित कर देते हैं और एक ही कार्य को एक अलग कमांड के साथ करते हैं, तो क्या माइक्लीनअप की प्रारंभिक चेनिंग को बदल दिया जाता है?
बुरहान अली

3
@BurhanAli myprogदूसरी बार निलंबित होने का कारण fgएक्जिट कोड 20 से समाप्त होना है - जो गैर-शून्य है, इसलिए जंजीर mycleanupकमांड निष्पादित नहीं किया गया है।
n.st

1

सुनिश्चित नहीं है कि आप जो पूछ रहे हैं वह संभव है, लेकिन यदि आपके पास अभी भी वह शेल है जिससे आपने प्रोग्राम शुरू किया है, तो आप हमेशा $?अंतिम प्रक्रिया के निकास की स्थिति की जांच कर सकते हैं :

$ /bin/myprog
some output...
$ if [ $? -ne 0 ];then echo "non-zero exit status";else echo "0 exit status";fi

1
यह काम करेगा, लेकिन उसे इसे मैन्युअल रूप से बाद में चलाना होगा, कमांड के पूरा होने पर वह इसे स्वचालित रूप से चलाना चाहता है।
SLM

@ एसएलएम सहमत। मेरे पास उस सटीक समस्या का हल नहीं है।
जोसेफ आर।

3
waitबाश में कमांड देखें ।
स्लम sl

1

यदि नौकरी अग्रभूमि में है, तो इनमें से कोई भी आदेश वैसा ही व्यवहार करेगा जैसा आप अपेक्षा करते हैं।

[ $? -eq 0 ] && prog2
(( $? )) || prog2

नोट: $? जब वह बाहर निकलता है तो चलने वाले प्रोग्राम की वापसी स्थिति होगी।

यह स्पष्ट रूप से बता रहा है कि यदि आपने मूल रूप से कमांड में प्रवेश किया था तो शेल क्या करेगा।

prog1 && prog2

यदि पहला कमांड नहीं पढ़ stdinरहा है और अग्रभूमि में चल रहा है, तो नई कमांड दर्ज की जा सकती है जबकि पहला कमांड चल रहा है। पहला कमांड निष्पादित होने पर शेल इसे पढ़ेगा और निष्पादित करेगा। यदि आदेश पृष्ठभूमि में चलेगा, तो यह पढ़ने की संभावना नहीं है stdin

EDIT: कार्य को पृष्ठभूमि में रखना और WAITकमांड का उपयोग करना भी उपयोग किया जा सकता है। यदि अन्य कार्य भी पृष्ठभूमि में चलाए जा रहे हैं तो यह सावधानी से किया जाना चाहिए। एक कार्य विनिर्देश के लिए आवश्यक है कि WAITजिस पद की प्रतीक्षा की जा रही है उसकी स्थिति को वापस कर दें।


यह काम करेगा, लेकिन उसे इसे मैन्युअल रूप से बाद में चलाना होगा, कमांड के पूरा होने पर वह इसे स्वचालित रूप से चलाना चाहता है।
SLM

4
@ एसएलएम जब तक कमांड स्टड नहीं पढ़ रहा है, तब तक नई कमांड दर्ज की जा सकती है जबकि पहला कमांड चल रहा है। पहली कमांड होते ही शेल इसे पढ़ लेगा।
बिलचोर

यदि वह खोल के बाद कुछ भी करता है, तो इसकी संभावना कम होने की पृष्ठभूमि में है। कम से कम प्रारंभिक के अनुसार। परीक्षण मैं इस प्रकार अब तक कर रहा हूँ!
SLM

2
@BillThor मुझे लगता है कि आपको अपने जवाब में उस टिप्पणी को जोड़ना चाहिए।
जोसेफ आर।

2
हां, उपयोग waitकरना आदर्श नहीं है। IMO का लाभ यह है कि यह हमें एक स्पष्ट API देता है जिससे हम निपट रहे हैं। कमांड लाइन पर अधिक कमांड टाइप करने के बाद जो कुछ चल रहा है वह मुझे थोड़ा हैकरी लगता है। waitअभी भी चल रहे पीआईडी ​​के लिए एक सीधा लिंक नहीं मिलने से पीड़ित है, वापसी की स्थिति। ऐसा लगता है कि एक मुद्दा अधिक w / कैसे बैश चीजों को लागू करता है: stackoverflow.com/questions/356100/… । तो यह हो सकता है जितना अच्छा हो।
SLM
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.