ctrl-z (^z) は、端末から実行されるループ内で行われると、理解できない方法で動作します。
私がタイプすると言う
for ii in {0..100}; do echo $ii; sleep 1; done
次に ^z を押します。私は得るでしょう:
[1]+ Stopped sleep 1
fg または bg を使用してジョブを再開できますが、ジョブはスリープ コマンドのみを参照します。ループの残りの部分は明らかに消えており、端末には数字が表示されません。
コマンドの後に & を使用して、バックグラウンドですぐに実行することもできます。または、別の解決策として、すべてをサブシェルでラップすることもできます。
( for ii in {0..100}; do echo $ii; sleep 1; done )
それから ^z は私に与えます
[1]+ Stopped ( for ii in {0..100};
do
echo $ii; sleep 1;
done )
この仕事が再開できて、みんな幸せです。しかし、私は通常、1 回限りのタスクを実行するときにこれを行う習慣はありません。私が尋ねているのは、そもそもなぜ最初の動作が発生するのかということです。サブシェル化されていないコマンドライン ループを一時停止する方法はありますか? 最初の例の残りのループはどうなったでしょうか?
これはループに固有のものであることに注意してください。
echo 1; sleep 5; echo 2
スリープ中に ^z を押すと、echo 2
が実行されます。
1
^Z
[2]+ Stopped sleep 5
2
それとも、 & を使う習慣を身につけて、それを闇の魔法と呼ぶべきですか?