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?
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:
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; } &
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.
{ ... ; }
là một hình thức thích hợp hơn (cách).
{ ... ; } &
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ế.