このシェルスクリプトはなぜ次のように動作しますか?
$ 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 done
。echo
curl