Перевага && vs & bash та zsh


9

Відповідаючи на це запитання, я виявив дуже смішну (і тонку) різницю між поведінкою bashта zsh:

В 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

Як бачимо, виконання псевдоніму xвиконується в підрозділі, і тому поточний каталог не змінюється.

Не в 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] % 

тут каталог змінюється.

Схоже , що &в bashмають свої пріоритети , ніж в zsh--- Я маю в виду, команда , здається, читається як

(cd /tmp && echo A) & 

в bashі як

cd /tmp && (echo A &) 

в zsh. Це правильно чи причина різної поведінки - інша?

Відповіді:


9

Різна, задокументована поведінка в Росії zshmisc

Список являє собою послідовність з нуля або більше подсписков, в якому кожен подсписок завершується ;, &, &|, &!, або новий рядок. Цей термінатор необов'язково може бути пропущений із останнього списку у списку, коли список відображається як складна команда всередині (...)або {...}. Коли підпис припиняється ;або новий рядок, оболонка чекає, коли він закінчиться, перш ніж виконати наступний підпис. Якщо під-список закінчується a &, &|або &!, оболонка виконує останній трубопровід у фоновому режимі, і не чекає, коли він закінчиться (зверніть увагу на відмінність від інших оболонок, які виконують весь підпис у фоновому режимі). Фоновий трубопровід повертає статус нуля.


3

Похований у zshmisc(1)наступному рядку:

Якщо підспіл закінчується &',& | ', або `&!', Оболонка виконує останній конвеєр у ньому у фоновому режимі,

Хоча в ньому конкретно не зазначено, що інші трубопроводи в підсписі виконуються в поточній оболонці, але це, мабуть, те, що мається на увазі, і поведінка, яку ви спостерігаєте, підтримує цю інтерпретацію. Наприклад:

$ echo $foo $bar

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

також підтримує уявлення про те, що перші два трубопроводи виконуються в поточній оболонці, і лише останній трубопровід підспису фактично виконується у фоновому режимі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.