bashでセミコロンを一時停止

bashでセミコロンを一時停止

このシェルスクリプトはなぜ次のように動作しますか?

$ curl -d "asd" 0.0.0.0/abc & echo "abc";

enter再びシェルに入る前にそれを押す必要があることがわかりました。これはcurl単純なWebサーバーへの公開要求にすぎませんabc

ただし、このスクリプトでは、シェルに戻る前にEnterキーを押す必要はありません。

$ echo "abc" & echo "abc"

答え1

&コマンドをcurlバックグラウンドで送信すると、実行中にバックグラウンドで実行されます。シェルはこれを待ちません(ジョブ番号とPIDが印刷されます)。代わりに、シェルは引き続き実行されます。echoおそらく組み込まれているので、実行するよりも速いでしょう。curlしたがって、シェルが終了echoし、プロンプトが印刷されます。今後 curlすべての出力を生成します。

たとえば、Bash を使用して得られた結果は次のとおりです。

bash ~ $ curl -d "asd" 0.0.0.0/abc & echo "abc";
[1] 26757
abc
bash ~ $ curl: (7) Failed to connect to 0.0.0.0 port 80: Connection refused

最後の行の先頭にヒントがあります。

ここをクリックすると、Enterシェルは別のプロンプトを印刷します。この時点で、バックグラウンドジョブが完了したことを確認し、関連する説明を印刷します。

[1]+  Exit 7                  curl -d "asd" 0.0.0.0/abc
bash ~ $ 

今何をしているのかわかりませんが、バックグラウンドジョブを端末に印刷するのは少しぎこちないので、curl出力を別の場所にリダイレクトしたり、フォアグラウンドで実行したりすることをお勧めします。たとえば、最初にcurl something; echo curl done実行しcurlてから実行echoし、エラーがない場合にのみ実行しますcurl something && echo curl doneechocurl

関連情報