6

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

それとも、 & を使う習慣を身につけて、それを闇の魔法と呼ぶべきですか?

4

1 に答える 1