Làm thế nào một người có thể chạy nhiều chương trình trong nền với một lệnh duy nhất?


36

Làm thế nào một người có thể chạy nhiều chương trình trong nền với một lệnh duy nhất?

Tôi đã thử các lệnh dưới đây, nhưng chúng không hoạt động.

nohup ./script1.sh & && nohup ./script2.sh &
-bash: syntax error near unexpected token '&&'

nohup ./script1.sh & ; nohup ./script2.sh &
-bash: syntax error near unexpected token ';'

một "lệnh" duy nhất là gì? Một dòng bash?
Oluf Lorenzen


Tôi có thể thiếu một cái gì đó rõ ràng, nhưng && ngụ ý biết mã thoát của lệnh trước đó. Nếu bạn đặt nền, mã thoát sẽ không được biết. Nhu cầu chức năng ở đó là gì?
Richlv

Câu trả lời:


32

Từ quan điểm cú pháp shell, &tách các lệnh như ;/ |/ &&... (mặc dù tất nhiên với các ngữ nghĩa khác nhau). Vì vậy, nó chỉ là:

cmd1 & cmd2 & cmd3 &

1
Đây không phải là / khá / phải, ;bắt đầu lệnh tiếp theo ngay khi lệnh đầu tiên kết thúc. &thực sự đặt lệnh vào nền. hãy thử điều này:echo foo & echo bar & echo test &
Oluf Lorenzen

1
@Finkregh, tất nhiên. Không ai nghi ngờ điều đó. Tôi chỉ có nghĩa là cả hai lệnh riêng biệt (theo quan điểm cú pháp) không có ý nghĩa về cách chúng được chạy.
Stéphane Chazelas

Đó không hoàn toàn là những gì được hỏi, vì câu hỏi được chỉ định đưa ra một "lệnh duy nhất". Câu trả lời của tôi cũng không phải vì nó cũng là một chuỗi các lệnh, nhưng nó có ít nhất một ngữ nghĩa của một lệnh trong đầu ra đó được nối, có thể được chuyển hướng, v.v.
Eli Heady

"Nhiều lệnh với một lệnh" dường như là một oxymoron - điều đó có nghĩa là gì? Nếu đây là một cái gì đó giống như sudovậy, bạn chỉ có thể nhập mật khẩu một lần, sau đó bọc bash -choặc tương tự.
Richlv

12

Phần bash manpage có tên Compound Commands có hai tùy chọn sẽ hoạt động, liệt kê và lệnh nhóm.

Lệnh nhóm là một chuỗi các lệnh được đặt trong dấu ngoặc nhọn {}. Một danh sách là như nhau, được đặt trong dấu ngoặc đơn (). Cả hai có thể được sử dụng để làm nền cho nhiều lệnh bên trong và cuối cùng để làm nền cho toàn bộ bộ sưu tập dưới dạng một bộ. Danh sách xây dựng thực thi các lệnh trong một lớp con, vì vậy các phép gán biến không được bảo toàn.

Để thực hiện một nhóm các lệnh:

{ command1 & command2 & } &

Bạn cũng có thể thực hiện các lệnh của mình trong một danh sách (subshell):

( command1 & command2 ) &

1
Không có gì. Tôi đã thêm liên kết vào hướng dẫn. Lưu ý rằng ()cú pháp danh sách thực thi các lệnh kèm theo trong một lớp con, vì vậy các biến không được bảo toàn trong.
Eli Heady

3

cách khác:

$(command1 &) && command2 & 

Không, nó sẽ chạy lệnh đầu tiên sau đó sau khi kết thúc trước, sau đó nó sẽ chạy một lệnh khác
Rahul Patil

bạn đã sử dụng &&trong câu hỏi của mình, điều đó có nghĩa là lúc đầu chạy một lệnh sau đó nếu chạy thành công, hãy chạy lệnh tiếp theo. Nếu bạn không xem xét nó, bạn có thể chạycommand1 & ; command2 & ;
tiếng

Lệnh đầu tiên thành công trong bg hoặc chạy ;không sử dụng vấn đề gì với điều đó
Rahul Patil
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.