Làm cách nào để chạy nhiều lệnh nền trong bash trong một dòng?


169

Tôi thường chạy nhiều lệnh với cái gì đó như thế này:

sleep 2 && sleep 3

hoặc là

sleep 2 ; sleep 3

Nhưng nếu tôi muốn chạy cả hai trong nền từ một lệnh dòng lệnh thì sao?

sleep 2 & && sleep 3 &

không hoạt động. Và cũng không thay thế&& bằng;

Có cách nào để làm điều đó?


8
Sử dụng ()để bao quanh lệnh.
nhahtdh

Câu trả lời:


318

Chính xác thì bạn muốn chúng chạy như thế nào? Nếu bạn muốn chúng được bắt đầu trong nền và chạy tuần tự , bạn sẽ làm một cái gì đó như thế này:

(sleep 2; sleep 3) &

Mặt khác, nếu bạn muốn chúng chạy song song trong nền, thay vào đó bạn có thể làm điều này:

sleep 2 & sleep 3 &

Và hai kỹ thuật có thể được kết hợp, như:

(sleep 2; echo first finished) & (sleep 3; echo second finished) &

Bash là bash, thường có vô số các kỹ thuật khác nhau để hoàn thành cùng một nhiệm vụ, mặc dù đôi khi có sự khác biệt tinh tế giữa chúng.


20
Đây là một câu trả lời ngắn gọn, được suy nghĩ kỹ lưỡng rằng "dạy một người đàn ông câu cá" suốt đời. Cảm ơn.
ambrus 18/03 '

2
Điều gì xảy ra nếu chúng ta làm gì sleep 2 && sleep 3 &? Tôi đã thử nó trong bash và nó dường như hoạt động theo cùng một cách (đã thử với echo).
Wajahat

@HakanBaba, vâng, nó thực sự tạo ra một subshell trong nền.
Douwe van der Leest

3
@Wajahat, bạn đã thử sleep 2 && echo "foo" && sleep 3 & echo "bar""chưa? Các &&nhà điều hành nói với vỏ để thực hiện lệnh trước đó, và chỉ khi đó lệnh thực thi mà không cần bất kỳ lỗi vỏ thực hiện lệnh tiếp theo. Điều này về cơ bản là khác với ;, vì ;cho phép lệnh tiếp theo thực thi bất kể trạng thái thoát của lệnh trước trừ khi đó là lỗi nghiêm trọng. Nó báo &cho shell thực thi tất cả các lệnh "được kết nối" trước nó, trong nền. "được kết nối" ở đây có nghĩa là lệnh là một phần của đường ống ( |) hoặc toán tử logic.
Douwe van der Leest

Of these list operators, ‘&&’ and ‘||’ have equal precedence, followed by ‘;’ and ‘&’, which have equal precedence.trong hướng dẫn bash.
jinbeom hong

49

Bạn cần thêm một số parens trong phiên bản cuối cùng của bạn -

(sleep 2 &) && (sleep 3 &)

hoặc điều này cũng hoạt động -

(sleep 2 &) ; (sleep 3 &)

Lưu ý: Khi danh sách được sử dụng &, trạng thái thoát của nó luôn bằng không. Vì vậy, hai trường hợp trên làm điều tương tự (Shell thực hiện lần lượt cả hai bên không đồng bộ ).
jinbeom hong

9

để chạy nhiều lệnh nền, bạn cần thêm &cuối mỗi lệnh. Ví dụ: (command1 &) && (command2 &) && (command3 &)


5

Các câu trả lời trên sử dụng dấu ngoặc đơn. Bash cũng có thể sử dụng niềng răng cho một mục đích tương tự:

{ sleep 2 && sleep 3; } &

Lưu ý rằng các dấu ngoặc nhọn cầu kỳ hơn về cú pháp - khoảng trắng sau {, khoảng trắng trước }và dấu chấm phẩy cuối cùng là bắt buộc. Trong một số trường hợp, niềng răng hiệu quả hơn vì chúng không tạo ra một nhánh con mới. Trong trường hợp này tôi không biết nếu nó làm cho một sự khác biệt.


1
Thế còn { sleep 2; sleep 3; } &?
Kenny Evitt

4

Những công việc này:

$(sleep 2 &) && sleep 3 &

Ngoài ra, bạn có thể làm:

$(sleep 2 && sleep 3) &

0

Tôi cũng có nhiệm vụ tương tự. Tôi đã thử (sleep2 ; fg )& sleep3 ; fg, nó hoạt động. Và khi bạn xác nhận ctrl + c nhân đôi, hai quá trình có thể bị dừng lại.


0

Bạn có thể sử dụng thay thế lệnh bash $(command)như thế này:

$(command1 ; command2) &

Lưu ý rằng stdin và stdout vẫn được liên kết với tiến trình cha và việc chuyển hướng ít nhất là thiết bị xuất chuẩn có thể khó khăn. Vì vậy, thay vào đó, bạn có thể xâu chuỗi các lệnh trong một dòng duy nhất sau đó chuyển chuỗi sang bashlệnh để sinh ra một quy trình mới sẽ xử lý việc thực thi.

bash -c "command1 ; command2" & 

Điều này đặc biệt hữu ích trong tập lệnh bash khi bạn cần chạy nhiều lệnh trong nền.

Hai tuyên bố này nên tương đương. Một quá trình bash được sinh ra trong cả hai trường hợp để xử lý lệnh (chuỗi lệnh) và& ở cuối sẽ loại bỏ việc thực thi.

Lần này, bạn có thể thêm vào &>/dev/nulltrước khi &kết thúc lệnh để chuyển hướng ít nhất là thiết bị xuất chuẩn và tránh đầu ra trên thiết bị xuất chuẩn của quy trình cha. Cái gì đó như:

bash -c "command1 ; command2" &>/dev/null &

-1

Nếu bạn muốn chạy nhiều lệnh liên tục , có một phương pháp thực sự đơn giản hoạt động ở mọi nơi: Tạo một tệp! Lợi ích của phương pháp này là nó sạch sẽ và đơn giản.

Đầu tiên, tạo tập tin của bạn với một tên, ví dụ commands.sh. Sau đó, đặt các lệnh của bạn ở đó. Đây là một mẫu:

commands.sh:

#!/system/bin/sh

sleep 3;
sleep 2;

OK, bây giờ chúng ta đang ở bước cuối cùng. Để chạy các lệnh trong nền (tuần tự), chỉ cần chạy:

$ sh commands.sh &
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.