Ưu tiên của && vs & trong bash và zsh


9

Trả lời câu hỏi này tôi phát hiện ra một sự khác biệt rất buồn cười (và tinh tế) giữa hành vi trong bashzsh:

Trong bash:

romano@RRyS:~$ pwd
/home/romano
romano@RRyS:~$ alias x="cd /bin && ./echo A >/dev/null  &"
romano@RRyS:~$ x
[1] 16611
romano@RRyS:~$ pwd
/home/romano

Như bạn có thể thấy, việc thực hiện bí danh xđược thực hiện trong một lớp con và do đó thư mục hiện tại không thay đổi.

Không có trong zsh:

[romano:~] % pwd
/home/romano
[romano:~] % alias x="cd /bin && ./echo A >/dev/null &"
[romano:~] % x
[1] 16744
[1]  + 16744 done       ./echo A >/dev/null                                    
1& [romano:/bin] % pwd
/bin
[romano:/bin] % 

ở đây thư mục được thay đổi.

Có vẻ như &trong bashcó một ưu tiên khác so với trong zsh--- Ý tôi là, lệnh dường như được đọc là

(cd /tmp && echo A) & 

trong bashvà như

cd /tmp && (echo A &) 

trong zsh. Điều này đúng hay nguyên nhân của hành vi khác nhau là một hành vi khác?

Câu trả lời:


9

Khác nhau, hành vi tài liệu trong zshmisc

Một danh sách là một chuỗi các số không hay nhiều danh sách phụ, trong đó mỗi sublist bị chấm dứt bởi ;, &, &|, &!, hoặc một dòng mới. Bộ kết thúc này có thể được bỏ qua tùy chọn từ danh sách con cuối cùng trong danh sách khi danh sách xuất hiện dưới dạng một lệnh phức tạp bên trong (...)hoặc {...}. Khi một danh sách con bị chấm dứt bởi ;hoặc dòng mới, shell sẽ đợi nó kết thúc trước khi thực hiện danh sách con tiếp theo. Nếu một danh sách phụ 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 phụ trong nền). Một đường ống nền trả về trạng thái bằng không.


3

Chôn vào zshmisc(1)là dòng sau:

Nếu một danh sách con bị chấm dứt bởi một &',& | 'hoặc' &! ', Shell sẽ thực thi đường ống cuối cùng trong đó trong nền,

Mặc dù nó không nói rõ rằng các đường ống khác trong danh sách con được thực thi trong trình bao hiện tại, nhưng đó dường như là những gì nó ngụ ý và hành vi bạn quan sát hỗ trợ cho việc giải thích đó. Ví dụ:

$ echo $foo $bar

$ foo=3 && bar=5 && sleep 1 &
$ echo $foo $bar
3 5

cũng ủng hộ quan điểm rằng hai đường ống đầu tiên thực thi trong lớp vỏ hiện tại và chỉ đường ống cuối cùng của danh sách con thực sự thực thi trong nền.

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.