जवाबों:
यदि आप प्रत्येक कमांड को केवल तभी निष्पादित करना चाहते हैं यदि पिछले वाला सफल हो गया है, तो &&
ऑपरेटर का उपयोग करके उन्हें संयोजित करें :
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
ls >/dev/null & ; echo $!
कोई त्रुटि चलाता है।
tail -f my.log & && ./myscript
जो काम नहीं कर रहा है .. कृपया सुझाव दें।
{ tail -f my.log & } && ./myscript
हालाँकि, ध्यान दें कि &&
यहाँ बेकार है, क्योंकि पहली नौकरी पृष्ठभूमि में चलती है और इस प्रकार दूसरी नौकरी का परिणाम नहीं पता चल सकता है, क्योंकि दोनों नौकरियां एक ही समय में शुरू होंगी। तो आप भी लिख सकते हैं:{ tail -f my.log & }; ./myscript
sudo
किसी एक कमांड को चलाने के लिए अनुमति चाहिए ? क्या मुझे sudo
सभी आज्ञाओं के पालन में या केवल उसी की आवश्यकता है जो इसे चाहिए? मैं उस कमांड को पासवर्ड कैसे दे सकता हूं ताकि इसे ठीक से निष्पादित किया जाए?
मैंने पाया है कि उपयोग कर रहा है; अलग-अलग कमांड केवल अग्रभूमि में काम करता है। जैसे:
cmd1; cmd2; cmd3 &
- केवल cmd3
पृष्ठभूमि में निष्पादित करेगा , जबकि cmd1 && cmd2 && cmd3 &
- पृष्ठभूमि
में पूरी श्रृंखला निष्पादित करेगा यदि कोई त्रुटि नहीं है।
बिना शर्त के निष्पादन के लिए, कोष्ठक का उपयोग करके इसे हल करना:
(cmd1; cmd2; cmd3) &
- पृष्ठभूमि में आदेशों की श्रृंखला को निष्पादित करेगा, भले ही कोई भी कदम विफल हो।
उन सभी को एक साथ चलाने के लिए, आप पाइप लाइन की का उपयोग कर सकते हैं "|" इस तरह:
$ 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
यदि आप अगली कमांड को केवल तभी निष्पादित करना चाहते हैं यदि पिछली कमांड सफल हो जाती है, तो आप कमांड को अलग करने के लिए && का उपयोग कर सकते हैं।
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
cmd1 || cmd2
विभाजक का उपयोग कर सकते हैं यदि आपको cmd2
केवल cmd1
गैर-शून्य स्थिति शेल में लौटाने के लिए निष्पादित करने की आवश्यकता है , और आप उपयोग कर सकते हैं cmd1 ; cmd2
यदि आप अपनी वापसी की स्थिति के बावजूद दोनों कमांड चलाना चाहते हैं।
केवल एक Ampersand की उपयोगिता क्या है? आज सुबह, मैंने XFCE पैनल (मानजारो + XFCE में) को एक साथ 2 पासवर्ड मैनेजर लॉन्च करने के लिए बनाया:
sh -c "keepassx && password-gorilla"
or
sh -c "keepassx; password-gorilla"
लेकिन यह काम नहीं करता जैसा मैं चाहता हूं। IE, पहला ऐप शुरू होता है लेकिन दूसरा तभी शुरू होता है जब पिछला बंद होता है
हालाँकि, मैंने पाया कि (केवल एक एम्परसेंड के साथ):
sh -c "keepassx & password-gorilla"
और यह काम करता है के रूप में मैं अब चाहता हूँ ...
;
, सिवाय इसके कि यह बैकग्राउंड में कॉमन डालता है, अर्थात शेल इसका आउटपुट नहीं देखेगा।
आप निम्न कोड के रूप में उपयोग कर सकते हैं;
cd /my_folder && \
rm *.jar && \
svn co path to repo && \
mvn compile package install
यह काम करता हैं...
मुझे इस तरह के प्रश्न के लिए बहुत से उत्तर भ्रामक लगते हैं
इस पोस्ट से संशोधित: 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();
}
||
अर्धविराम के स्थान पर भी उपयोग कर सकते हैं या&&
यदि आप केवल यही चाहते हैं कि यदि अंतिम आदेश विफल हो जाए तो अगली कमांड को निष्पादित किया जाए। जैसा कि इस कोशिश में है, और अगर यह विफल रहता है, तो कोशिश करें।