Bas & zsh && vs & 'in önceliği


9

Cevaplama Bu soruyu ben de davranışları arasında çok komik (ve ince) farkı keşfetti bashve zsh:

İçinde 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

Gördüğünüz gibi, takma adın xyürütülmesi bir alt kabukta gerçekleştirilir ve bu nedenle geçerli dizin değişmez.

İçinde değil 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] % 

burada dizin değiştirilir.

Görünüşe göre &in bash, öncekinden farklı bir önceliğe sahip - zshyani, komut şu şekilde okunuyor gibi görünüyor

(cd /tmp && echo A) & 

içinde bashve gibi

cd /tmp && (echo A &) 

içinde zsh. Bu doğru mu yoksa farklı davranışların nedeni başka mı?

Yanıtlar:


9

Farklı, belgelenmiş davranış zshmisc

Bir liste, her alt liste ile sonlandırılır sıfır ya da daha fazla alt listelere, bir dizi olduğunda ;, &, &|, &!, ya da bir satır. Bu sonlandırıcı isteğe bağlı olarak liste (...)veya içinde karmaşık bir komut olarak göründüğünde listedeki son alt listeden çıkarılabilir {...}. Bir alt liste ;veya satırsonu tarafından sonlandırıldığında , kabuk bir sonraki alt listeyi yürütmeden önce bitmesini bekler. Bir alt liste a &, &|veya ile sonlandırılırsa &!, kabuk arka planda son boru hattını yürütür ve bitmesini beklemez (arka planda tüm alt listeyi yürüten diğer kabuklardan farkı not edin). Arka planlı bir boru hattı sıfır durumunu döndürür.


3

Gömülü zshmisc(1)şu satır:

Bir alt liste bir &',& | 'veya `&!' İle sonlandırılırsa , kabuk arka planda son boru hattını yürütür,

Alt listedeki diğer boru hatlarının geçerli kabukta yürütüldüğünü özel olarak belirtmese de, bu ima ettiği gibi görünüyor ve gözlemlediğiniz davranış bu yorumu destekliyor. Örneğin:

$ echo $foo $bar

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

ayrıca ilk iki boru hattının geçerli kabukta yürütüldüğü ve alt listenin yalnızca son boru hattının arka planda yürütüldüğü fikrini destekler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.