終了コマンドが他のコマンドと並行して実行されると、セッションは終了します。

終了コマンドが他のコマンドと並行して実行されると、セッションは終了します。

理解できないシェルの動作を発見しました。実行するとき

echo foo > /tmp/bar & exit

、ターミナルが閉じました。しかし、実行すると

exit & echo foo > /tmp/bar

、端末は次のように開いています。

[1] 4001

それに印刷されています。

以下を使用して別のアカウントにログインすると、最初のバージョンの出力を表示することもsuできます。su次のように進みます。

[2] 13777
exit
[1]+  Done                    exit

exit最初のコマンドでセッションが終了しないのはなぜですか?

Unixシステムでこれを再現できない場合に備えて、私はUbuntu 16.04を使用しています。

答え1

最初のコマンド、

echo foo > /tmp/bar & exit

バックグラウンドで実行するサブシェルを起動してecho foo > /tmp/bar終了します(フォアグラウンドシェル)。簡単に入力したように端末が閉じますexit。バックグラウンドシェルは長い間保持されていないため、競合は発生しません。ただし、より長く実行されるコマンドでこれを実行すると、シェルとオプションによって異なる動作が発生します。

sleep 60 & exit

終了しないかもしれませんが、ジョブを実行していると文句を言います。

どちらの場合も、シェルはフォームの1行を印刷します[1] 7149が、端末が閉じている場合はそれを見る時間がありません。

2番目のコマンドは

exit & echo foo > /tmp/bar

バックグラウンドで実行するサブシェルを起動しexit、サブシェルが終了し(サブシェルで)実行されますecho foo > /tmp/bar。したがって、「デフォルト」シェルは終了せず、端末は開いたままです。

[2] 13777

続いて

exit

(終了シェルで印刷)

[1]+  Done                    exit

(バックグラウンドシェルが終了すると、メインシェルによって印刷されます。)

関連情報