
回答この問題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] %
ここでディレクトリが変更されました。
&
inのbash
優先順位がinと異なるようですzsh
。 ---私の言葉は、コマンドは次のように読み込まれているようです。
(cd /tmp && echo A) &
bash
のように
cd /tmp && (echo A &)
存在するzsh
。これは正しいですか、それとも他の行動の原因が違うのでしょうか?
答え1
明確で文書化された行動zshmisc
;
リストは、ゼロ個以上のサブリストで構成されるシーケンスであり、各サブリストは、、、または改行文字で&
終わり&|
ます&!
。リスト(...)
がまたはで複雑なコマンドとして表示される場合は、オプションでリストの最後のサブリストからこのターミネータを省略できます{...}
。サブリストがまたは改行で終わると、;
シェルは次のサブリストを実行する前にサブリストが完了するのを待ちます。サブリストがまたはで終わる場合、&
シェル&|
は&!
バックグラウンドで最後のパイプを実行し、完了するのを待ちません(バックグラウンドでサブリスト全体を実行している他のシェルとの違いに注意してください)。バックグラウンドパイプラインはゼロ状態を返します。
答え2
埋め込まれたzshmisc(1)
行は次のとおりです。
サブリストは&|または `&!' で終わると、
&',
シェルはバックグラウンドで最後のパイプを実行します。
サブリストの他のパイプが現在シェルで実行されていることを特に明示していないが、それが意味するように見え、観察された動作はその説明を裏付ける。たとえば、
$ echo $foo $bar
$ foo=3 && bar=5 && sleep 1 &
$ echo $foo $bar
3 5
また、最初の2つのパイプが現在のシェルで実行され、サブリストの最後のパイプだけが実際にバックグラウンドで実行されるという概念もサポートされています。