मैं एक ही लाइन में bash में कई बैकग्राउंड कमांड कैसे चला सकता हूं?


169

मैं सामान्य रूप से कुछ इस तरह से कई कमांड चलाता हूं:

sleep 2 && sleep 3

या

sleep 2 ; sleep 3

लेकिन क्या होगा अगर मैं उन दोनों को एक कमांड लाइन कमांड से पृष्ठभूमि में चलाना चाहता हूं?

sleep 2 & && sleep 3 &

काम नहीं करता है। और न ही &&साथ प्रतिस्थापित करता है;

क्या इसे करने का कोई तरीका है?


8
()कमांड को घेरने के लिए उपयोग करें ।
नाहतध

जवाबों:


319

वास्तव में आप उन्हें कैसे चलाना चाहते हैं? यदि आप चाहते हैं कि उन्हें पृष्ठभूमि में शुरू किया जाए और क्रमिक रूप से चलाया जाए , तो आप कुछ इस तरह करेंगे:

(sleep 2; sleep 3) &

यदि, दूसरी ओर, आप उन्हें पृष्ठभूमि में समानांतर में चलाना चाहेंगे, तो आप ऐसा कर सकते हैं:

sleep 2 & sleep 3 &

और दो तकनीकों को जोड़ा जा सकता है, जैसे:

(sleep 2; echo first finished) & (sleep 3; echo second finished) &

बैश होने के नाते, एक ही कार्य को पूरा करने के लिए अक्सर विभिन्न तकनीकों की भीड़ होती है, हालांकि कभी-कभी उनके बीच सूक्ष्म अंतर भी होता है।


20
यह एक संक्षिप्त, सुविचारित उत्तर है जो जीवन के लिए "मनुष्य को मछली बनाना सिखाता है"। धन्यवाद।
अम्ब्रस

2
अगर हम करते हैं तो क्या होता है sleep 2 && sleep 3 &? मैंने इसे बैश में आज़माया और यह उसी तरह से काम करने लगता है (इको के साथ कोशिश की गई)।
वजाहत

@ हाकनबाबा, हां यह वास्तव में पृष्ठभूमि में एक उपखंड बनाता है।
डौवे वैन डेर लेएस्ट

3
@ वजाहत, क्या आपने कोशिश की sleep 2 && echo "foo" && sleep 3 & echo "bar""? &&ऑपरेटर यह पहले आदेश पर अमल करने खोल बताता है, और केवल यदि कोई त्रुटि के बिना कि कमांड निष्पादित खोल बाद आदेश निष्पादित करता है। यह अनिवार्य रूप से अलग है ;, क्योंकि ;जब तक कि यह एक घातक त्रुटि नहीं थी, तब तक बाद के कमांड को पिछली कमांड की निकास स्थिति की परवाह किए बिना निष्पादित करने देता है। &"जुड़ा" आदेशों के सभी यह पूर्ववर्ती निष्पादित करने के लिए, पृष्ठभूमि में खोल बताता है। यहां "कनेक्ट" का अर्थ है कि कमांड एक पाइप ( |) या एक तार्किक ऑपरेटर का हिस्सा है।
डौवे वैन डेर लेएस्ट

Of these list operators, ‘&&’ and ‘||’ have equal precedence, followed by ‘;’ and ‘&’, which have equal precedence.बाश मैनुअल में।
जिनबीम होंग

49

आपको अपने अंतिम संस्करण में कुछ पार्न्स जोड़ने की आवश्यकता है -

(sleep 2 &) && (sleep 3 &)

या यह भी काम करता है -

(sleep 2 &) ; (sleep 3 &)

नोट: जब किसी सूची का उपयोग किया जाता है &, तो उसकी निकास स्थिति हमेशा शून्य होती है। तो, दो मामलों से ऊपर एक ही बात (खोल बदले में दोनों पक्षों को निष्पादित कर एसिंक्रोनस रूप से )।
जिनबीम होंग

9

कई पृष्ठभूमि कमांड चलाने के लिए आपको &प्रत्येक कमांड के अंत को जोड़ना होगा। उदाहरण के लिए: (command1 &) && (command2 &) && (command3 &)


5

ऊपर दिए गए उत्तर कोष्ठक का उपयोग करते हैं। बैश भी एक समान उद्देश्य के लिए ब्रेसिज़ का उपयोग कर सकते हैं:

{ sleep 2 && sleep 3; } &

ध्यान दें कि सिंटैक्स के बारे में ब्रेसिज़ अधिक उपयुक्त हैं - अंतरिक्ष के बाद {, पहले का स्थान }, और अंतिम अर्धविराम आवश्यक हैं। कुछ स्थितियों में ब्रेसिज़ अधिक कुशल होते हैं क्योंकि वे एक नया उप-समूह नहीं बनाते हैं। इस मामले में मुझे नहीं पता कि क्या इससे कोई फर्क पड़ता है।


1
किस बारे में { sleep 2; sleep 3; } &?
केनी एविट

4

यह काम:

$(sleep 2 &) && sleep 3 &

इसके अलावा आप कर सकते हैं:

$(sleep 2 && sleep 3) &

0

मेरा भी यही मिशन है। मेरे पास कोशिश है (sleep2 ; fg )& sleep3 ; fg, यह काम कर रहा है। और जब आप ctrl + c को दोगुना करते हैं, तो दो प्रक्रिया को रोका जा सकता है।


0

आप $(command)इस तरह से bash कमांड प्रतिस्थापन का उपयोग कर सकते हैं :

$(command1 ; command2) &

ध्यान दें कि स्टड और स्टडआउट अभी भी मूल प्रक्रिया से जुड़े हुए हैं और कम से कम स्टडआउट को पुनर्निर्देशित करना मुश्किल हो सकता है। इसलिए वैकल्पिक रूप से आप एक ही लाइन में कमांड्स को चेन कर सकते हैं फिर bashएक नई प्रक्रिया को स्पॉन करने के लिए कमांड को स्ट्रिंग पास करें जो निष्पादन को हैंडल करेगा।

bash -c "command1 ; command2" & 

यह बैश स्क्रिप्ट में विशेष रूप से उपयोगी है जब आपको पृष्ठभूमि में कई कमांड चलाने की आवश्यकता होती है।

यह दो कथन समतुल्य होने चाहिए। कमांड (आदेशों की श्रृंखला) और संभालने के लिए दोनों मामलों में एक बैश प्रक्रिया स्पॉन है& अंत में निष्पादन को समाप्त कर देता है।

इस बार आप कमांड के अंत में कम से कम स्टडआउट को रीडायरेक्ट करने से &>/dev/nullपहले जोड़ सकते हैं &और मूल प्रक्रिया के स्टडआउट पर आउटपुट से बच सकते हैं। कुछ इस तरह:

bash -c "command1 ; command2" &>/dev/null &

-1

यदि आप क्रमिक रूप से कई कमांड चलाना चाहते हैं , तो वास्तव में एक सरल विधि है जो हर जगह काम करती है: एक फ़ाइल बनाना! इस पद्धति का लाभ यह है कि यह साफ और सरल है।

सबसे पहले, एक नाम के साथ अपनी फ़ाइल बनाएं, जैसे commands.sh। फिर, अपने आदेशों को वहां रखें। यहाँ एक नमूना है:

commands.sh:

#!/system/bin/sh

sleep 3;
sleep 2;

ठीक है, अब हम अंतिम चरण में हैं। पृष्ठभूमि (क्रमिक रूप से) में कमांड चलाने के लिए, बस दौड़ें:

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