Tôi đang cố gắng hợp nhất nhiều lệnh linux trong một dòng để thực hiện thao tác triển khai. Ví dụ
cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install
Tôi đang cố gắng hợp nhất nhiều lệnh linux trong một dòng để thực hiện thao tác triển khai. Ví dụ
cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install
Câu trả lời:
Nếu bạn muốn thực hiện mỗi lệnh chỉ khi lệnh trước thành công, sau đó kết hợp chúng bằng &&
toán tử:
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
Nếu một trong các lệnh thất bại, thì tất cả các lệnh khác theo sau nó sẽ không được thực thi.
Nếu bạn muốn thực thi tất cả các lệnh bất kể các lệnh trước có thất bại hay không, hãy tách chúng bằng dấu chấm phẩy:
cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install
Trong trường hợp của bạn, tôi nghĩ rằng bạn muốn trường hợp đầu tiên trong đó việc thực thi lệnh tiếp theo phụ thuộc vào sự thành công của lệnh trước đó.
Bạn cũng có thể đặt tất cả các lệnh trong một tập lệnh và thực hiện thay vào đó:
#! /bin/sh
cd /my_folder \
&& rm *.jar \
&& svn co path to repo \
&& mvn compile package install
(Các dấu gạch chéo ngược ở cuối dòng có ở đó để ngăn shell nghĩ rằng dòng tiếp theo là một lệnh mới; nếu bạn bỏ qua dấu gạch chéo ngược, bạn sẽ cần phải viết toàn bộ lệnh trong một dòng.)
Lưu tệp đó vào một tệp, ví dụ myscript
, và làm cho nó có thể thực thi được:
chmod +x myscript
Bây giờ bạn có thể thực thi tập lệnh đó như các chương trình khác trên máy. Nhưng nếu bạn không đặt nó bên trong một thư mục được liệt kê trong PATH
biến môi trường của bạn (ví dụ: /usr/local/bin
hoặc trên một số bản phân phối Linux ~/bin
), thì bạn sẽ cần chỉ định đường dẫn đến tập lệnh đó. Nếu nó trong thư mục hiện tại, bạn thực thi nó với:
./myscript
Các lệnh trong kịch bản hoạt động giống như các lệnh trong ví dụ đầu tiên; lệnh tiếp theo chỉ thực thi nếu lệnh trước thành công. Để thực hiện vô điều kiện tất cả các lệnh, chỉ cần liệt kê từng lệnh trên dòng riêng của nó:
#! /bin/sh
cd /my_folder
rm *.jar
svn co path to repo
mvn compile package install
ls >/dev/null & ; echo $!
gây ra lỗi.
tail -f my.log & && ./myscript
không hoạt động .. vui lòng đề xuất.
{ tail -f my.log & } && ./myscript
Tuy nhiên, lưu ý rằng việc &&
này là vô ích, vì công việc đầu tiên chạy trong nền và do đó công việc thứ hai không thể biết kết quả, vì cả hai công việc sẽ bắt đầu cùng một lúc. Vì vậy, bạn cũng có thể chỉ cần viết:{ tail -f my.log & }; ./myscript
sudo
quyền để chạy một trong các lệnh thì sao? Tôi có nên đặt sudo
lệnh cầu xin tất cả các lệnh hoặc chỉ trong lệnh cần nó không? Làm thế nào tôi có thể truyền mật khẩu cho lệnh đó để nó được thực thi đúng cách?
Tôi đã thấy rằng sử dụng; để tách các lệnh chỉ hoạt động ở nền trước. ví dụ :
cmd1; cmd2; cmd3 &
- sẽ chỉ thực hiện cmd3
trong nền, trong khi
cmd1 && cmd2 && cmd3 &
- sẽ thực thi toàn bộ chuỗi trong nền NẾU không có lỗi.
Để phục vụ cho việc thực hiện vô điều kiện, sử dụng dấu ngoặc đơn sẽ giải quyết điều này:
(cmd1; cmd2; cmd3) &
- sẽ thực thi chuỗi lệnh trong nền, ngay cả khi bất kỳ bước nào thất bại.
Để chạy tất cả chúng cùng một lúc, bạn có thể sử dụng phím đường ống "|" như vậy
$ cd /my_folder | rm *.jar | svn co path to repo | mvn compile package install
Nếu bạn muốn thực thi tất cả các lệnh, cho dù lệnh trước có thực thi hay không, bạn có thể sử dụng dấu chấm phẩy (;) để phân tách các lệnh.
cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install
Nếu bạn chỉ muốn thực hiện lệnh tiếp theo nếu lệnh trước thành công, thì bạn có thể sử dụng && để tách các lệnh.
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
Trong trường hợp của bạn, việc thực hiện các lệnh liên tiếp dường như phụ thuộc vào các lệnh trước đó, vì vậy hãy sử dụng ví dụ thứ hai tức là sử dụng && để tham gia các lệnh.
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
cmd1 || cmd2
dấu phân cách nếu bạn chỉ cần cmd2
thực thi nếu cmd1
trả về trạng thái khác không cho shell và bạn có thể sử dụng cmd1 ; cmd2
nếu bạn muốn chạy cả hai lệnh bất kể trạng thái trả về của chúng.
Tiện ích của một Ampersand duy nhất là gì? Sáng nay, tôi đã tạo một trình khởi chạy trong bảng XFCE (trong Manjaro + XFCE) để khởi chạy đồng thời 2 trình quản lý mật khẩu:
sh -c "keepassx && password-gorilla"
or
sh -c "keepassx; password-gorilla"
Nhưng nó không hoạt động như tôi muốn. IE, ứng dụng đầu tiên khởi động nhưng ứng dụng thứ hai chỉ bắt đầu khi đóng trước đó
Tuy nhiên, tôi thấy rằng (chỉ có một ký hiệu):
sh -c "keepassx & password-gorilla"
và nó hoạt động như tôi muốn bây giờ ...
;
, ngoại trừ việc điều này đặt dấu phẩy trước khi nó ở chế độ nền, tức là shell sẽ không nhìn thấy đầu ra của nó.
Bạn có thể sử dụng như mã sau đây;
cd /my_folder && \
rm *.jar && \
svn co path to repo && \
mvn compile package install
Nó hoạt động ...
Tôi tìm thấy rất nhiều câu trả lời cho loại câu hỏi sai lệch này
Được sửa đổi từ bài đăng này: https://www.webmasterworld.com/linux/3613813.htm
Đoạn mã sau sẽ tạo cửa sổ bash và hoạt động chính xác như cửa sổ bash. Hi vọng điêu nay co ich. Có quá nhiều câu trả lời sai / không hoạt động ngoài kia ...
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();
}
||
thay vì dấu chấm phẩy hoặc&&
nếu bạn chỉ muốn lệnh tiếp theo được thực thi nếu lệnh cuối cùng thất bại. Như thử điều này, và nếu nó thất bại, hãy thử nó.