理解できないシェルの動作を発見しました。実行するとき
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
(バックグラウンドシェルが終了すると、メインシェルによって印刷されます。)