forループで中断されたプロセスを再開する


12

私はbashで実行しています:

for i in ull-*.pbm; do convert $i tmp2/$i.pdf ; done

Ctrl-Z実行中の私、そしてfgそのジョブID。ただし、残りの反復は終了しません。なぜだろうか?


2
for i in *.txt; do echo "$i"; sleep 0.5 ; done(GNU bash、バージョン4.2.53)
Hauke Laging 14

回答:


10

Ctrl-Z現在実行中のプロセスを中断します。式で

for i in ull-*.pbm; do convert "$i" "tmp2/$i.pdf" ; done

除くすべてのコマンドconvert(すなわちforindo及びdone)あるbashのは、現在のシェルとシェルで実行されているキーワードは、自分自身を中断することはできません(それはとにかくあなたの意図ではありません)。したがって、を押してCtrl-Zコマンドをconvert中断すると、処理するものがなくなるため、ループは単純に終了します。

ループ全体を中断できるようにしたい場合は、サブシェル環境で実行するだけです。

(for i in ull-*.pbm; do convert "$i" "tmp2/$i.pdf" ; done)

私が知っている唯一のシェルは、現在のシェルでループ全体を中断できることですzsh


4
いいえ、Ctrl-Z1つの変換インスタンスを中断するだけで済みます。ループが続行できず、別のインスタンスを開始できなかった理由はありません。何らかの理由bashでループが停止します。dashループでテストを続けると、他のシェルもおそらく同じことをします。
グレアム14

6
@Graemeが1つの反復を中断してループを継続することは、次のステップが前のステップに依存する可能性があるため、私にとって危険なようです。私にとって唯一の合理的な解決策は、ループ全体を中断することであり、サブシェルで実行できます(実際にzshは、現在のシェルで実行されているループ全体を中断できます)。
jimmij

3
それがおそらく答えでしょう- bash開発者はおそらくあなたと同じ意見を持っていました。しかし、ループを継続することは私が期待していたことですが、プロセスを停止してシェルに戻ってハンドコントロールすると、中断したところから再開するのが自然なようです(bash追加しない場合の動作になる可能性があります)他の何かをするためのコード)。
グレアム14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.