違いは何ですか
echo "Hello " ; echo "world"
そして
echo "Hello " && echo "world"
どちらも互いに2つのコマンドを実行しているようです。
答え1
echo "Hello" ; echo "world"
echo "world"
前のコマンドの終了状態に関係なく、コマンドが順次実行されることを示しますecho "Hello"
。つまり、echo "world"
前のコマンドが成功したかどうかに関係なく実行されますecho "Hello"
。
の場合、echo "Hello" && echo "world"
最初のコマンド()が成功した場合(つまり状態0で終了した場合)にのみ実行されますecho "world"
。echo "Hello"
これは…段落評価。
次の例は、シェルがさまざまな演算子を使用してコマンドチェーンを処理する方法を示しています。
$ false ; echo "OK"
OK
$ true ; echo "OK"
OK
$ false && echo "OK"
$ true && echo "OK"
OK
$ false || echo "OK"
OK
$ true || echo "OK"
$
最後のケースはOK
ショートして印刷されませんでしたtrue
。
簡単に言えば、;
区切り文字であり、論理&&
ANDであり、||
論理ORです(詳しくはお読みください)。ここ)。
答え2
Linux のすべてのコマンドは、実行が完了すると終了コードを返します。終了コードは特殊変数に割り当てられているため、?
最後のコマンドの状態を簡単に確認できますecho $?
。これはスクリプトでよく使用されます。コマンドが正常に完了すると終了コード0が返され、実行中にエラーが発生した場合、終了ステータスは0ではありません。以下の例をご覧ください。
$エコ「こんにちは」 こんにちは $エコ$? 0 $rm ファイルが存在しません。 rm: '存在しないファイル'を削除できません。そのファイルやディレクトリはありません。 $エコ$? 1
今これはあなたの質問につながります。これは&&
、「前のコマンドが成功した場合にのみ、次のコマンドを実行します。つまり、終了コード0を返します」を意味する特殊演算子です。前のコマンドが失敗した場合にのみ後者のコマンドを実行するリバース演算子もあります||
。つまり、ゼロ以外の値で終了します。以下の例をご覧ください。
$ echo "こんにちは" && echo "前のコマンドが成功しました" こんにちは 前のコマンドが成功しました。 $rm 存在しないファイル&& echo "この内容は印刷されません。" rm: '存在しないファイル'を削除できません。そのファイルやディレクトリはありません。 $ rm存在しないファイル|| echo「しかしこれは表示されます」 rm: '存在しないファイル'を削除できません。そのファイルやディレクトリはありません。 しかし、これは見せるでしょう。
編集:質問は2つの違いに関するものなので、&&
完全な;
答えを得るには、あるコマンドを別のコマンドと区別するためにセミコロンを追加する必要があります。終了コードは確認されないため、セミコロンで区切られた複数のコマンドがある場合は、単に順番に、つまり互いに完全に独立して1つずつ実行されます。
答え3
また@heemaylの答え、&&
(および||
)は、シェルに処理のみを実行させます。一つすべてのリンクコマンドの終了コードです。したがって、trap [...] ERR
または行がある場合は、set -o errexit
終了コード処理を実行する前にすべてのコマンドを処理します。