web-dev-qa-db-ja.com

sh -eは&とどのように相互作用しますか?

私はUbuntu(明晰)でshdash)を使用していますが、マンページには-e

-e errexit対話型でない場合、テストされていないコマンドが失敗した場合はすぐに終了します。
コマンドの終了ステータスは明示的にテストされたと見なされます
 if、Elif、while、またはuntil;または
コマンドが「&&」または「||」の左側のオペランドである場合オペラ‐ 
 tor。

バックグラウンドコマンドが失敗するとどうなりますか?そして、bashはこの点で異なった振る舞いをしますか?

5
r3m0t

これをテストするのは非常に簡単です。 -e

% bash -e -c 'false & echo waiting; if wait $!; then echo success; else echo failure; fi'
waiting
failure

したがって、バックグラウンドコマンドが失敗した場合、シェルは自動的に終了しません(-e 十分ではありません)。

明示的なテストの外部でwaitを実行すると、waitは失敗したバックグラウンドプロセスのリターンコードを返します。この場合、-eが指定されている場合、シェルは終了します。

% bash -e -c 'false & echo waiting; wait $!; echo returned'   
waiting

bashまたはshまたはzshでも同じ結果になります。

5