ฉันกำลังพยายามรวมคำสั่ง linux หลายคำสั่งในหนึ่งบรรทัดเพื่อดำเนินการปรับใช้ ตัวอย่างเช่น
cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install
ฉันกำลังพยายามรวมคำสั่ง linux หลายคำสั่งในหนึ่งบรรทัดเพื่อดำเนินการปรับใช้ ตัวอย่างเช่น
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
ในกรณีของคุณฉันคิดว่าคุณต้องการกรณีแรกที่การดำเนินการของคำสั่งถัดไปขึ้นอยู่กับความสำเร็จของคดีก่อนหน้า
คุณสามารถใส่คำสั่งทั้งหมดในสคริปต์และดำเนินการแทน:
#! /bin/sh
cd /my_folder \
&& rm *.jar \
&& svn co path to repo \
&& mvn compile package install
(แบ็กสแลชที่ท้ายบรรทัดมีไว้เพื่อป้องกันเชลล์ไม่ให้คิดว่าบรรทัดถัดไปเป็นคำสั่งใหม่หากคุณไม่ใช้แบ็กสแลชคุณจะต้องเขียนคำสั่งทั้งหมดในบรรทัดเดียว)
บันทึกไฟล์นั้นลงในไฟล์myscript
และทำให้สามารถเรียกใช้งานได้:
chmod +x myscript
ตอนนี้คุณสามารถรันสคริปต์นั้นเหมือนกับโปรแกรมอื่น ๆ ในเครื่อง แต่ถ้าคุณไม่ได้วางไว้ในไดเรกทอรีที่ระบุไว้ในPATH
ตัวแปรสภาพแวดล้อมของคุณ(ตัวอย่างเช่น/usr/local/bin
หรือใน Linux บางตัว~/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
ในกรณีของคุณการดำเนินการของคำสั่งที่ต่อเนื่องกันดูเหมือนจะขึ้นอยู่กับคำสั่งก่อนหน้าดังนั้นให้ใช้ตัวอย่างที่สองเช่นใช้ && เพื่อเข้าร่วมคำสั่ง
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
cmd1 || cmd2
ตัวคั่นได้หากคุณจำเป็นต้องcmd2
ดำเนินการเฉพาะในกรณีที่cmd1
ส่งคืนสถานะที่ไม่เป็นศูนย์ให้กับเชลล์และคุณอาจใช้cmd1 ; cmd2
หากคุณต้องการรันทั้งสองคำสั่งโดยไม่คำนึงถึงสถานะการส่งคืน
แอมเปอร์แซนด์เพียงอันเดียวคืออะไร เช้านี้ฉันได้เปิดตัวในแผง XFCE (ใน Manjaro + 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();
}
||
แทนเซมิโคลอนหรือ&&
ถ้าคุณต้องการให้คำสั่งถัดไปถูกเรียกใช้หากคำสั่งสุดท้ายล้มเหลว เช่นเดียวกับในการลองสิ่งนี้และหากล้มเหลวให้ลองทำเช่นนั้น