मैं एक कमांड लाइन में कई कमांड कैसे चला सकता हूं?


12

मुझे सिरदर्द की समस्या हुई है।

मैं पृष्ठभूमि में mulitple कमांड निष्पादित करना चाहता हूं, इसलिए मैं एक-एक करके उन्हें शुरू करना चाहता हूं। इस तरह से पृष्ठभूमि में linux खोल में एक कमांड शुरू करना आसान है:

myCommand &

इस तरह से कई कमांड शुरू करना आसान है:

myCommand1 && myCommand2

या

myCommand1 ; myCommand2

लेकिन अगर मैं पृष्ठभूमि में कई कमांड चलाना चाहता हूं, तो मैंने निम्न कमांड प्रारूप की कोशिश की, लेकिन असफल रहा:

myCommand1 & && myCommand2 &

या

myCommand1 & ; myCommand2 &

दोनों प्रारूप विफल। मैं &एक कमांड लाइन में कई कमांड कैसे चला सकता हूं ?


2
उन्हें एक स्क्रिप्ट में रखें और स्क्रिप्ट को पृष्ठभूमि में चलाएं
पैंथर



पैंथर, ऐसा लगता है कि उपयोग कर रहा है () स्क्रिप्ट का उपयोग करने की तुलना में इस मुद्दे को बहुत आसान बनाने में मदद कर सकता है। आइए सबसे पहले शेल द्वारा प्रदान की गई सुविधाओं का पूरा उपयोग करने का प्रयास करें, बजाय इसके कि हम खुद क्या चाहते हैं। लेकिन निश्चित रूप से, स्क्रिप्ट का उपयोग करना भी इस मुद्दे को ठीक कर सकता है। फिर भी धन्यवाद।
क्लॉक ZHONG

अगर मैं 'टेल -F <file1>> <file2>' और उसके बाद 'जॉब्स -l' चलाना चाहता हूं, जिसे फिर से '
disown

जवाबों:


24

उपयोग ()।

यदि आप उन्हें क्रमिक रूप से चलाना चाहते हैं:

(myCommand1; myCommand2) &

या

(myCommand1 &) && (myCommand2 &)

यदि आप उन्हें समानांतर चलाना चाहते हैं:

myCommand1 & myCommand2 &

बैश में आप इसका उपयोग भी कर सकते हैं ({और; पीछे अनिवार्य स्थान):

{ myCommand1 && myCommand2; } &

3
(myCommand1 &) && (myCommand2 &)असफल होने पर myCommand2भी चलेगा myCommand1
टेराडॉन

() bash को & && को अलग करने में मदद कर सकता है। जब हम & && togather का उपयोग करना चाहते हैं तो बस निष्पादन इकाई को अलग करने के लिए उपयोग करें ()।
घड़ी झोंग

16

मुझे लगता है कि आप यह चाहते हैं:

myCommand1 & myCommand2 &

यह शुरू होता है myCommand1और इसे बैकग्राउंड में भेजता है क्योंकि इसके बाद एम्परसेंड होता है, फिर तुरंत शुरू होता है myCommand2और बैकग्राउंड को भी भेजता है, इसलिए शेल को फिर से जारी करता है।

सूचियाँ

बेहतर समझ के लिए आप यहां कमांड द्वारा पाइप लाइन को स्थानापन्न कर सकते हैं।

एक सूची एक या एक से अधिक पाइपलाइनों का एक क्रम है जो ऑपरेटरों में से एक द्वारा अलग किया जाता है ; , और , && , या || , और वैकल्पिक रूप से एक द्वारा समाप्त ; , और , या

यदि नियंत्रण ऑपरेटर द्वारा एक कमांड को समाप्त किया जाता है और , शेल एक उपधारा में पृष्ठभूमि में कमांड को निष्पादित करता है। शेल कमांड के समाप्त होने की प्रतीक्षा नहीं करता है, और वापसी की स्थिति 0. है कमांड को एक से अलग किया गया है ; क्रमिक रूप से निष्पादित किया जाता है; शेल प्रत्येक कमांड के बदले में समाप्त होने का इंतजार करता है। वापसी की स्थिति निष्पादित अंतिम कमांड की निकास स्थिति है।

AND और OR सूचियाँ && और || से अलग एक या अधिक पाइपलाइनों के अनुक्रम हैं क्रमशः नियंत्रण संचालक।
स्रोत:man bash

चलिए इसे नीचे उदाहरणों में तोड़ते हैं। आप कमांड को जोड़कर और इनमें से किसी एक के साथ अलग करके एक सूची बना सकते हैं ; & && ||:

command1 ; command2  # runs sequentially
command1 && command2 # runs sequentially, runs command2 only if command1 succeeds
command1 || command2 # runs sequentially, runs command2 only if command1 fails
command1 & command2  # runs simultaneously

आप इनमें से किसी एक के साथ सूची को समाप्त कर सकते हैं: ; & <newline>
आम तौर पर आप एक कमांड या एक सूची को दबाकर निष्पादित करते हैं Enter, जो बराबर होती है <newline>। अर्धविराम ;विशेष रूप से लिपियों में एक ही उद्देश्य प्रदान करता है। &हालाँकि, Ampersand पृष्ठभूमि में एक उपश्रेणी में कमांड शुरू करता है, तुरंत शेल को रिलीज़ करता है।

आप समूह सूचियों को आगे करने के लिए गोल ()या घुंघराले कोष्ठक {}का उपयोग कर सकते हैं , अंतर यह है कि गोल कोष्ठक एक उप-भाग को घुमाने लगते हैं और घुंघराले नहीं होते हैं। घुंघराले कोष्ठक को पहले और अर्धविराम या समापन कोष्ठक से पहले एक नई रेखा के बाद एक स्थान की आवश्यकता होती है। उदाहरण के लिए:

# if c1 succeeds start a shell in the background
# and run c2 and c3 sequentially inside it
c1 && ( c2 ; c3 ) & 
# run c1 and if it succeeds c2 sequentially as a group command
# if c1 or c2 fail run c3 in the background
{ c1 && c2 ;} || c3 &

यह काफी जटिल हो सकता है, यदि आप अनिश्चित उपयोग कर रहे हैं trueऔर falseपरीक्षण कर सकते हैं कि निर्माण कार्य अपेक्षित है:

$ { true && true ;} || echo 2
$ { true && false ;} || echo 2
2

नौकरी पर नियंत्रण

jobsआदेश प्रदर्शित करता चला रहे या हाल ही में वर्तमान खोल में समाप्त कर दिया गया है पृष्ठभूमि कार्यों की सूची। नौकरी नियंत्रण के लिए कई कीबोर्ड शॉर्टकट और कमांड हैं:

  • Ctrl+ Zप्रकार निलंबित , चरित्र है कि वर्तमान में अग्रभूमि में चलने वाली प्रक्रिया का कारण बनता है बंद कर दिया जाना करने के लिए इसे समाप्त नहीं है, लेकिन में अवशेष jobsसूची
  • Ctrl+ Yप्रकार निलंबित देरी चरित्र है कि वर्तमान में अग्रभूमि में चलने वाली प्रक्रिया का कारण बनता है जब यह टर्मिनल से इनपुट को पढ़ने के लिए प्रयास करता है बंद कर दिया जाना करने के लिए
  • fg= %अग्रभूमि में एक प्रक्रिया शुरू करता है यदि आवश्यक हो, तो आप इस प्रक्रिया को निम्नानुसार निर्दिष्ट कर सकते हैं:

     %       # last process in the jobs list
     %1      # 1st process in the jobs list
     %abc    # process beginning with the string “abc”
     %?abc   # process containing the string “abc” anywhere
  • bg= %&यदि आवश्यक हो तो इसे शुरू करने वाली पृष्ठभूमि में एक प्रक्रिया लेता है:

     %&      # last process in the jobs list
     %1&     # 1st process in the jobs list
     %abc&   # process beginning with the string “abc”
     %?abc&  # process containing the string “abc” anywhere
  • wait एक पृष्ठभूमि प्रक्रिया के समाप्त होने की प्रतीक्षा करता है और अपनी समाप्ति स्थिति देता है:

     wait %1 # 1st process in the jobs list

    कल्पना करें कि आपने एक लंबी प्रक्रिया शुरू कर दी ( jobsयह संख्या 3 है) का पता चलता है और फिर एहसास होता है कि कंप्यूटर समाप्त होने पर निलंबित होना चाहता है, साथ ही echoएक संदेश भी अगर प्रक्रिया सफल नहीं हुई:

     wait %3 || echo failed ; systemctl suspend

लेकिन && के साथ सावधान रहना महत्वपूर्ण है, यह इस बात पर निर्भर करता है कि कमांड क्या देता है , इसलिए हमें यह सुनिश्चित करने की आवश्यकता है कि जिसे हम वास्तव में कुछ बैश कहते हैं वह एक सत्य मूल्य मानता है ..?
गणितज्ञ

@ मैथ्रेडलर जब तक आप कुछ खराब किए गए उपयोगकर्ता स्क्रिप्ट के बारे में बात कर रहे हैं, निकास मूल्य बहुत अच्छी तरह से परिभाषित किया गया है (देखें man bash) और मोटे तौर पर बिल्कुल उसी तरह उपयोग किया जाता है जैसा कि AFAIK का इरादा है - मैंने कभी भी कुछ अजीब अनुभव नहीं किया।
डेसर्ट

ठीक है, किसी को खराब तरीके से निर्मित उपयोगकर्ता स्क्रिप्ट के बारे में सावधान रहना चाहिए। वे मौजूद हैं और इस तरह के कीड़े को खोजने के लिए दर्द हो सकता है। आस्कुबंटु मुझे आपको "@ मिठाई" की अनुमति नहीं देता है।
मैथ्रेडलर

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