2012-10-25 8 views
221

में एकाधिक लिनक्स कमांड को गठबंधन करें मैं तैनाती संचालन करने के लिए एक पंक्ति में एकाधिक लिनक्स कमांड को मर्ज करने का प्रयास कर रहा हूं। उदाहरणनिष्पादन एक लाइन

cd /my_folder 
rm *.jar 
svn co path to repo 
mvn compile package install 

उत्तर

515

आप प्रत्येक आदेश केवल तभी पिछले एक सफल निष्पादित करने के लिए चाहते हैं, तो उन्हें && ऑपरेटर का उपयोग गठबंधन:

cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install 

अगर कोई एक आदेश विफल रहता है, तो अन्य सभी आदेशों के बाद यह नहीं होगा मार डाला।

आप पिछले अभियानों में विफल रहा है, चाहे या नहीं सभी आदेश पर अमल करने के लिए, उन्हें अर्धविराम से अलग करना चाहते हैं:

cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install 

आपके मामले में, मुझे लगता है कि आप पहले मामले चाहते हैं, जहां अगले आदेश के निष्पादन पिछले की सफलता पर निर्भर करता है। पंक्ति के अंत में कर रहे हैं

#! /bin/sh 
cd /my_folder \ 
&& rm *.jar \ 
&& svn co path to repo \ 
&& mvn compile package install 

(बैकस्लैश वहाँ यह सोच कर कि अगली पंक्ति एक नया आदेश है से खोल को रोकने के लिए:

तुम भी एक स्क्रिप्ट में सभी आदेशों रख दिया और है कि बजाय निष्पादित कर सकते हैं , यदि आप बैकस्लैश छोड़ देते हैं, तो आप एक पंक्ति में पूरी कमान लिखने के लिए एक फाइल करने के लिए, उदाहरण के myscript के लिए की आवश्यकता होगी)

कि सहेजें, और यह निष्पादन योग्य बनाने:

chmod +x myscript 

अब आप उस स्क्रिप्ट को मशीन पर अन्य प्रोग्रामों की तरह निष्पादित कर सकते हैं। लेकिन यदि आप इसे अपने PATH पर्यावरण चर में सूचीबद्ध निर्देशिका के अंदर नहीं रखते हैं (उदाहरण के लिए /usr/local/bin, या कुछ लिनक्स वितरण ~/bin पर), तो आपको उस स्क्रिप्ट के पथ को निर्दिष्ट करने की आवश्यकता होगी। पहले उदाहरण में आदेशों के रूप में उसी तरह काम

./myscript 

लिपि में आदेशों;: यदि यह वर्तमान निर्देशिका में है, तो आप के साथ इसे निष्पादित अगला आदेश केवल तभी निष्पादित होता है जब पिछला सफल हुआ। सभी आदेशों की बिना शर्त निष्पादन के लिए, बस अपनी पंक्ति में प्रत्येक आदेश सूची:

#! /bin/sh 
cd /my_folder 
rm *.jar 
svn co path to repo 
mvn compile package install 
+8

+1। –

+2

+1। यह वही है जो मैं खोज रहा था! –

+21

भावी पाठकों के लिए: आप अर्धविराम या '&&' के बजाय '||' का भी उपयोग कर सकते हैं यदि आप केवल अंतिम आदेश को निष्पादित करना चाहते हैं तो अंतिम विफल होने पर। इस कोशिश में, और यदि यह विफल हो जाता है, तो कोशिश करें। – DeVadder

1
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install 
+0

यह ओपी स्क्रिप्ट को एक ही नहीं है, कृपया विवरण दें: अगर आ आदेश विफल रहता है, स्क्रिप्ट गर्भपात –

+3

साथ ही, आप 'cmd1 उपयोग कर सकते हैं || cmd2' विभाजक अगर आपको 'cmd2' की आवश्यकता होती है तो केवल तभी निष्पादित किया जाए जब' cmd1' ने शून्य में शून्य-शून्य स्थिति लौटा दी हो, और आप 'cmd1 का उपयोग कर सकते हैं; cmd2' अगर आप दोनों वापसी आदेशों के बावजूद दोनों आदेशों को चलाने के लिए चाहते हैं। –

+0

@sputnick यह होना चाहिए, मैं तो बस उस में चिपकाया और && –

9

के लिए आप एक अर्द्ध बृहदान्त्र का उपयोग कर अपने आदेशों को अलग कर सकते हैं:

cd /my_folder;rm *.jar;svn co path to repo;mvn compile package install 

था कि तुम क्या मतलब है?

1

आप सभी आदेश पर अमल करने के लिए, पिछले एक निष्पादित करता है या नहीं चाहते, तो आप अर्धविराम का उपयोग करें कर सकते हैं, अलग करने के लिए() आदेश देता है।

cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install 

आप अगले आदेश पर अमल करना चाहते हैं केवल यदि पिछला आदेश सफल होता है, तो आप & & का उपयोग आदेशों को अलग कर सकते हैं।

cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install 

आपके मामले में, लगातार आदेशों के निष्पादन के पिछले आदेशों पर निर्भर करते हैं, तो दूसरे उदाहरण मैं उपयोग करने के लिए लगता है।ई। आदेशों में शामिल होने के लिए & & का उपयोग करें।

36

मैं का उपयोग कर कि मिल गया है; आदेशों को अलग करने के लिए केवल अग्रभूमि में काम करता है। उदाहरण के लिए:

cmd1; cmd2; cmd3 & - केवल पृष्ठभूमि में cmd3 निष्पादित करेगा, जबकि cmd1 && cmd2 && cmd3 & - यदि कोई त्रुटि नहीं है पृष्ठभूमि में पूरी श्रृंखला पर अमल होगा।

बिना शर्त निष्पादन के लिए पूरा करने के लिए, कोष्ठक का उपयोग कर हल करती है यह:

(cmd1; cmd2; cmd3) & - पृष्ठभूमि में आदेशों की श्रृंखला पर अमल होगा, भले ही किसी भी कदम विफल रहता है।

+1

क्या आपके उदाहरणों में पीछे की ओर एम्पर्सेंड (&) जानबूझकर था? यदि हां, तो इसके लिए क्या है? – Technophile

+4

@Technophile यह एक [पृष्ठभूमि कमांड] चलाने के लिए है (http://unix.stackexchange.com/questions/103731/run-a-command-without-making-me-wait) –

+0

एक सरल, संक्षिप्त और सीधा जवाब, आप StackExchange वेबसाइटों को अक्सर डीन का उपयोग करना चाहिए। आपके सहयोग के लिए धन्यवाद। – CPHPython

0

एक केवल एक ऐंपरसैंड की उपयोगिता क्या है? आज सुबह, मैं XFCE पैनल में एक लांचर (Manjaro + XFCE में) बनाया एक साथ 2 पासवर्ड प्रबंधकों लांच करने के लिए:

sh -c "keepassx && password-gorilla" 
or 
sh -c "keepassx; password-gorilla" 

लेकिन जैसे-जैसे मैं चाहता हूँ यह काम नहीं करता। आईई, पहली बार एप्लिकेशन शुरू होता है लेकिन दूसरी शुरू होता है केवल जब पिछले बंद कर दिया है: -/

हालांकि, मैंने पाया है कि (केवल एक एम्परसेंड):

sh -c "keepassx & password-gorilla" 

और यह काम करता मैं अब चाहते हैं। ..

संबंधित मुद्दे