bashおよびzshにおける&& vs&の優先順位


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

リストには、各サブリストをすることによって終了されたゼロ個以上のサブリストの配列であり;&&|&!、または改行。リストが(...)または内で複雑なコマンドとして表示される場合、このターミネータはオプションでリストの最後のサブリストから省略できます{...}。サブリストが;改行または改行で終了すると、シェルは次のサブリストを実行する前にサブリストが終了するのを待ちます。サブリストが、、またはで終了している&場合&|&!シェルはその最後のパイプラインをバックグラウンドで実行し、終了するのを待ちません(サブリスト全体をバックグラウンドで実行する他のシェルとの違いに注意してください)。バックグラウンドパイプラインはゼロのステータスを返します。


3

埋められるのzshmisc(1)は次の行です。

サブリストが&',&| 'または `&!'で終了している場合、シェルはその中の最後のパイプラインをバックグラウンドで実行します。

サブリスト内の他のパイプラインが現在のシェルで実行されることは特に明記されていませんが、それはそれが意味しているようであり、観察した動作がその解釈をサポートしています。例えば:

$ echo $foo $bar

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

また、最初の2つのパイプラインが現在のシェルで実行され、サブリストの最後のパイプラインのみが実際にバックグラウンドで実行されるという概念もサポートしています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.