TL; DR:などの区切り文字をリストし;ます。&、&&、および||解析順序を決めます。
bashのマニュアルを教えてくれる:
ANDおよびORリストは、&&および||で区切られた1つ以上のパイプラインのシーケンスです。それぞれ制御演算子。
または、Bash Hackerのwikiが簡潔にそれをどのように置いたか
<PIPELINE1> && <PIPELINE2>
したがって、cd ~/screenshots/ && ls screenshot* | head -n 5 1つのパイプラインls screenshot* | head -n 5と1つの単純なコマンドがありcd ~/screenshots/ます。マニュアルに従って
パイプラインの各コマンドは、個別のプロセスとして(つまり、サブシェルで)実行されます。
一方、(cd ~/screenshots/ && ls screenshot*) | head -n 5異なる-パイプラインが1つありますhead -n 5。左側にサブシェルがあり、右側にがあります。この場合、OPの表記法を使用すると次のようになります。(A && B) | C
別の例を見てみましょう。
$ echo foo | false && echo 123 | tr 2 5
$
ここに1つのリストがあり<pipeline1> && <pipeline2>ます。パイプラインの終了ステータスは最後のコマンドの終了ステータスと同じであり、falseネガティブステータス、つまり失敗を返すことがわかっている&&ため、右側を実行しません。
$ echo foo | true && echo 123 | tr 2 5
153
ここでは、左側のパイプラインに成功の終了ステータスがあるため、右側のパイプラインが実行され、その出力が表示されます。
シェルの文法は実際の実行順序を意味するものではないことに注意してください。ジルの答えの 1つを引用するには:
パイプコマンドは同時に実行されます。psを実行するとき| grep…、それはpsまたはgrepが最初に開始するかどうか、そしていずれにせよ続行するかについてのドローの運(またはカーネルの腸の奥深くでスケジューラーの微調整と組み合わされたシェルの動作の詳細の問題)同時に実行します。
そして、bashマニュアルから:
ANDおよびORリストは左結合で実行されます。
その中に基づいて、最初に実行されるだろう前のコマンドが成功した場合、しかし、最初のプロセスではなく生み出される彼らはパイプラインにあるので。cd ~/screenshots/ && ls screenshot* | head -n 5cd ~/screenshots/ls screenshot* | head -n 5head -n 5ls
|、LHS標準出力をRHS標準入力に適合させる単なるコネクタであることを知るのに役立つかもしれません。もしそうならcd、あなたの例では、コマンドが失敗し、それはへの出力を送信しないだろうheadが、headまだ実際に考えexecute、何を解析しないと、何も出力を返しません。