Lanjutkan proses yang ditangguhkan dalam for for


12

Saya menjalankan bash:

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

Saya Ctrl-Zdi tengah berjalan, dan kemudian fgid tugasnya. Namun iterasi yang tersisa tidak terus selesai. Kenapa ya?


2
Saya dapat mengkonfirmasi bahwa untuk for i in *.txt; do echo "$i"; sleep 0.5 ; done(GNU bash, Versi 4.2.53)
Hauke ​​Laging

Jawaban:


10

Ctrl-Zmenunda proses yang sedang berjalan. Dalam ekspresi

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

semua perintah kecuali convert(mis for. in, dodan done) adalah bashkata kunci yang berjalan di shell saat ini dan shell tidak dapat menangguhkan dirinya sendiri (dan bagaimanapun juga bukan maksud Anda). Jadi ketika Anda menekan Ctrl-Z, dan perintah convertditangguhkan, loop hanya akan berhenti karena tidak ada yang diproses lagi.

Jika Anda ingin dapat menangguhkan seluruh loop maka jalankan saja di lingkungan subkulit:

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

Satu-satunya shell yang saya tahu yang mampu menangguhkan seluruh loop di shell saat ini adalah zsh.


4
Tidak, Ctrl-Zhanya dapat menangguhkan instance satu konversi, tidak ada alasan mengapa loop tidak dapat melanjutkan dan memulai yang lain. Untuk beberapa alasan bashmenghentikan loop. Ketika saya menguji dalam dashloop terus, kerang lain mungkin melakukan hal yang sama.
Graeme

6
@Graeme melanjutkan loop dengan satu iterasi ditangguhkan tampaknya berbahaya bagi saya karena langkah selanjutnya dapat bergantung pada sebelumnya. Satu-satunya solusi yang masuk akal bagi saya adalah untuk menangguhkan seluruh loop dan itu bisa dilakukan secara subshell (sebenarnya zshdapat menunda seluruh loop berjalan di shell saat ini).
jimmij

3
Itu mungkin jawabannya - para bashpengembang kemungkinan memiliki pendapat yang sama dengan Anda. Melanjutkan pengulangan masih seperti yang saya perkirakan, ketika Anda menghentikan proses dan mengembalikan kontrol ke shell, tampaknya wajar jika ia mengambil dari tempatnya (dan mungkin akan menjadi perilaku bashjika mereka tidak menambahkan kode untuk melakukan sesuatu yang lain).
Graeme
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.