Làm thế nào để nền một chuỗi lệnh?


15

Tôi muốn nền một chuỗi lệnh như thế nào cp a b && mv b c && rm a.

Tôi đã cố gắng làm cp a b && mv b c && rm a &nhưng điều này chỉ nền tảng quá trình cuối cùng.

Làm thế nào để tôi nền một chuỗi lệnh?

Câu trả lời:


22

cp a b && mv b c && rm a &đúng. &có quyền ưu tiên thấp hơn &&. Trong thực tế &có mức độ ưu tiên thấp hơn bất kỳ thứ gì khác ngoài ;và dòng mới: &nằm trong cùng một loại cú pháp ;, sự khác biệt là ;chạy danh sách lệnh ở phía trước trong khi &chạy nó ở chế độ nền. Bạn có thể tự kiểm tra điều này:

$ dash -c 'sleep 2 && echo waited & echo backgrounded'
backgrounded
$ waited

Tương tự với pdksh, ksh93, bash, csh, tcsh.

Ngoại lệ là zsh, không tương thích một cách kỳ lạ. Điều này được ghi lại trong hướng dẫn :

Nếu một danh sách con bị chấm dứt bởi a &, &|hoặc &!, shell sẽ thực thi đường ống cuối cùng trong nền đó và không đợi nó kết thúc (lưu ý sự khác biệt so với các shell khác thực thi toàn bộ danh sách con trong nền).

Thật không may, zsh hoạt động theo cách này ngay cả trong chế độ tương thích sh hoặc ksh. Để đảm bảo rằng toàn bộ lệnh được thực thi trong nền, hãy đặt dấu ngoặc hoặc dấu ngoặc quanh nó. Dấu ngoặc đơn tạo ra một lớp con trong khi dấu ngoặc nhọn thì không, nhưng điều này không liên quan (ngoại trừ việc tối ưu hóa vi mô trong một số shell) vì dù sao một lệnh nền nằm trong một lớp con.

{ cp a b && mv b c && rm a; } &

8
Ùnder bash , { ... ; } &thực hiện một ngã ba ở cấp quy trình hiện tại, trong khi ( ... ) &thực hiện một ngã ba từ một mạng con ... Kết quả là như nhau, nhưng dù sao cũng có một sự khác biệt tinh tế.
F. Hauri

14

bạn có thể đặt nó vào các ví dụ như (cp a b && mv b c && rm a )&bao gồm toàn bộ chuỗi.


2
Và quan trọng là điều này cho thấy rõ rằng toàn bộ chuỗi đã được làm nền, ngay cả với một người có thể không biết các quy tắc về cách các nhà khai thác bị ràng buộc
jackweirdy

2
Nhìn vào bình luận của tôi để trả lời của @ Gilles, tôi nghĩ { ... ; }là một hình thức thích hợp hơn (cách).
F. Hauri
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.