पृष्ठभूमि में एक ही कमांड को कई बार चलाएं


14

कई आदेशों को चलाने और उन्हें बैश का उपयोग करके पृष्ठभूमि में कैसे संभव है?

उदाहरण के लिए:

$ for i in {1..10}; do wait file$i &; done

जहां प्रतीक्षा एक कस्टम बाइनरी है।

अभी मुझे एक त्रुटि मिली है:

syntax error near unexpected token `;'

जब ऊपर आदेश चल रहा है।

एक बार पृष्ठभूमि के अनुसार कमांड समानांतर में चलना चाहिए।


1
आपकी बात नहीं मानते हुए: nohupआप पृष्ठभूमि में एक आदेश पर अमल करने की इजाजत दे रहे हैं
डेव हैमिल्टन

3
त्रुटि आप कर रहे हैं देखने की वजह से है &और ;दोनों "कमांड टर्मिनेटर्स" कर रहे हैं। आपको दोनों का उपयोग करने की आवश्यकता नहीं है: for ...; do wait $arg & doneकाम करेगा।
ग्लेन जैकमैन

@ ग्लेन जैकमैन हां, मैंने सवाल पोस्ट करने के बाद वास्तव में इसे आजमाया। दोनों की कोई जरूरत नहीं है; और
सेबी

3
भविष्य के पाठकों के लिए, दस्तावेज़ीकरण की एक कड़ी : "एक सूची एक या एक से अधिक पाइपलाइनों का एक अनुक्रम है जो ऑपरेटरों में से एक द्वारा अलग की गई है? ',' & ',' && ', या' || ', और वैकल्पिक रूप से एक द्वारा समाप्त ',', 'और' या एक नई पंक्ति। " (जोर मेरा)
ग्लेन जैकमैन

जवाबों:


21

की &तरह ;, एक सूची टर्मिनेटर ऑपरेटर है। उनके पास एक ही वाक्यविन्यास है और इसे परस्पर विनिमय (आप क्या करना चाहते हैं इसके आधार पर) का उपयोग किया जा सकता है। इसका मतलब है कि आप नहीं चाहते हैं, या जरूरत है, command1 &; command2आप सभी की जरूरत है command1 & command2

इसलिए, आपके उदाहरण में, आप बस लिख सकते हैं:

for i in {1..10}; do wait file$i & done

और प्रत्येक waitकमांड को पृष्ठभूमि में लॉन्च किया जाएगा और लूप तुरंत अगले पर जाएगा।


4

अनुकूलता के लिए विस्तार के बजाय पॉज़िक्स फॉर्म का उपयोग करें:

for i in $(seq 1 10); do (./wait file$i &); done

1
ध्यान दें कि seqPOSIX कमांड नहीं है और आम तौर पर केवल GNU सिस्टम पर पाया जाता है। व्यवहार या $(...)(और $i) के वर्तमान मूल्य पर निर्भर करता है $IFS। यह भी ध्यान दें कि ऐसा करने से (cmd &), cmdएक उप- वर्ग का बच्चा हो जाएगा, इसलिए आप उदाहरण के लिए इसके बाहर निकलने की स्थिति का इंतजार नहीं कर पाएंगे।
स्टीफन चेजालस

2

आप कमांड्स को ग्रुप कर सकते हैं और ग्रुपेड कमांड्स को बैकग्राउंड में रख सकते हैं। पसंद :

$ for i in {1..10}; do ((wait file$i)&); done

वहाँ भीतरी कोष्ठक का उपयोग करने के लिए कोई जरूरत नहीं है ...
मार्क

यदि आप प्रश्न में पूछे गए पृष्ठभूमि को कई कमांड में रखना चाहते हैं, तो केवल आंतरिक कोष्ठक का उपयोग करने की आवश्यकता है। जैसे (नींद 1; प्रतीक्षा फ़ाइल $ i) &);
mazs

2

क्या आपके बाइनरी का नाम वास्तव में है wait? मैं ऐसा करने की सिफारिश नहीं करता, क्योंकि waitशेल शेल है।

मेरा मानना ​​है कि बैश अच्छी तरह से एक-लाइन लूप को पार्स नहीं करता है जो पृष्ठभूमि प्रक्रियाओं को लॉन्च करता है। मैं आपको सुझाव देता हूं कि आप इस कोड को बदल सकते हैं:

$ for i in {1..10}; do ./wait file$i & echo "Running 'wait' using PID=$!..."; done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.