एक लाइन में कई लिनक्स कमांड को निष्पादित करें


329

मैं एक लाइन में कई लाइन कमांड को मर्ज करने के लिए तैनाती ऑपरेशन करने की कोशिश कर रहा हूं। उदाहरण के लिए

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

जवाबों:


717

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

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

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

3
हम्म, अर्धविराम हमेशा काम नहीं करते हैं। जैसे ls >/dev/null & ; echo $!कोई त्रुटि चलाता है।
हाय-एंजेल

1
और क्या होगा अगर मैं बैकग्राउंड में पहला कमांड चलाना चाहता हूं और दूसरा फोरग्राउंड में .. मैं यह कोशिश कर रहा हूं tail -f my.log & && ./myscriptजो काम नहीं कर रहा है .. कृपया सुझाव दें।
ओवरट्रस्ट्ज

4
@Pareshkumar बैश के साथ, आप यह कर सकते हैं: { tail -f my.log & } && ./myscriptहालाँकि, ध्यान दें कि &&यहाँ बेकार है, क्योंकि पहली नौकरी पृष्ठभूमि में चलती है और इस प्रकार दूसरी नौकरी का परिणाम नहीं पता चल सकता है, क्योंकि दोनों नौकरियां एक ही समय में शुरू होंगी। तो आप भी लिख सकते हैं:{ tail -f my.log & }; ./myscript
Nikos C.

क्या होगा यदि मुझे sudoकिसी एक कमांड को चलाने के लिए अनुमति चाहिए ? क्या मुझे sudoसभी आज्ञाओं के पालन में या केवल उसी की आवश्यकता है जो इसे चाहिए? मैं उस कमांड को पासवर्ड कैसे दे सकता हूं ताकि इसे ठीक से निष्पादित किया जाए?
Drubio

46

मैंने पाया है कि उपयोग कर रहा है; अलग-अलग कमांड केवल अग्रभूमि में काम करता है। जैसे:

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

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

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


1
क्या आपके उदाहरणों में अनुगामी एम्परसेंड (और) जानबूझकर था? यदि हां, तो इसके लिए क्या है?
टेक्नोफाइल


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

10

आप एक अर्ध उपनिवेश का उपयोग करके अपनी आज्ञाओं को अलग कर सकते हैं:

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

क्या आपका यही मतलब था?


3

उन सभी को एक साथ चलाने के लिए, आप पाइप लाइन की का उपयोग कर सकते हैं "|" इस तरह:

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

1
इनपुट के रूप में अगले कमांड को आपकी कमांड का आउटपुट देने के लिए पाइपलाइन का उपयोग किया जा रहा है। उदाहरण के लिए: X | Y -> X कमांड आउटपुट Y कमांड के लिए इनपुट के रूप में काम करेगा
Arpan सैनी

2

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

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

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


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

यह ओपी स्क्रिप्ट के समान नहीं है, कृपया समझाएं: यदि कोई कमांड विफल रहता है, तो स्क्रिप्ट गर्भपात
गाइल्स क्वेनोट

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

@sputnick यह होना चाहिए, मैं बस में इसे चिपकाया और आज्ञाओं के साथ &&
मार्क स्टीवंस

3
@MarkStevens यह एक बेहतर कार्यान्वयन है, लेकिन यह उसी तरह के परिणामों के लिए नहीं होगा जैसे कि कमांड क्रमिक रूप से चलाए गए थे, मुझे लगता है कि स्पुतनिक का मतलब है।
andrux

1

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

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

लेकिन यह काम नहीं करता जैसा मैं चाहता हूं। IE, पहला ऐप शुरू होता है लेकिन दूसरा तभी शुरू होता है जब पिछला बंद होता है

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

sh -c "keepassx & password-gorilla"

और यह काम करता है के रूप में मैं अब चाहता हूँ ...


1
Ampersand कमांड टर्मिनेटर के समान कार्य करता है ;, सिवाय इसके कि यह बैकग्राउंड में कॉमन डालता है, अर्थात शेल इसका आउटपुट नहीं देखेगा।
सर्गी कोलोडियाज़नी

-1

आप निम्न कोड के रूप में उपयोग कर सकते हैं;

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

यह काम करता हैं...


-1

मुझे इस तरह के प्रश्न के लिए बहुत से उत्तर भ्रामक लगते हैं

इस पोस्ट से संशोधित: https://www.webmasterworld.com/linux/3613813.htm

निम्नलिखित कोड बैश विंडो बनाएगा और बिल्कुल बैश विंडो के रूप में काम करेगा। उम्मीद है की यह मदद करेगा। बहुत सारे गलत / काम नहीं करने वाले उत्तर ...

            Process proc;
            try {
                //create a bash window
                proc = Runtime.getRuntime().exec("/bin/bash");
                if (proc != null) {
                       BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
                       PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
                       BufferedReader err = new BufferedReader(new InputStreamReader(
                       proc.getErrorStream()));
                       //input into the bash window
                       out.println("cd /my_folder");
                       out.println("rm *.jar");
                       out.println("svn co path to repo");
                       out.println("mvn compile package install");
                       out.println("exit");
                       String line;
                        System.out.println("----printing output-----");
                          while ((line = in.readLine()) != null) {
                             System.out.println(line);
                          }
                          while((line = err.readLine()) != null) {
                             //read errors
                          }
                          proc.waitFor();
                          in.close();
                          out.close();
                          err.close();
                          proc.destroy();
                }

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.