Tiếp tục một quy trình bị đình chỉ trong một vòng lặp for


12

Tôi đang chạy trong bash:

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

Tôi Ctrl-Zđang chạy, và sau đó fgid công việc của nó. Nhưng các lần lặp còn lại không tiếp tục kết thúc. Tôi tự hỏi tại sao?


2
Tôi có thể xác nhận rằng đối với for i in *.txt; do echo "$i"; sleep 0.5 ; done(GNU bash, Phiên bản 4.2.53)
Hauke ​​Laging

Câu trả lời:


10

Ctrl-Zđình chỉ quá trình hiện đang chạy. Trong biểu hiện

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

tất cả các lệnh trừ convert(tức là for, in, dodone) là bash's từ khóa chạy trong vỏ hiện tại và vỏ không thể ngừng bản thân (và nó không phải là ý định của bạn dù sao đi nữa). Vì vậy, khi bạn nhấn Ctrl-Zvà lệnh converttạm dừng, vòng lặp sẽ đơn giản thoát vì không còn gì để xử lý nữa.

Nếu bạn muốn có thể tạm dừng toàn bộ vòng lặp thì chỉ cần chạy nó trong môi trường subshell:

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

Shell duy nhất tôi biết có khả năng treo toàn bộ vòng lặp trong shell hiện tại là zsh.


4
Không, Ctrl-Zchỉ có thể đình chỉ một trường hợp chuyển đổi, không có lý do tại sao vòng lặp không thể tiếp tục và bắt đầu một phiên bản khác. Đối với một số lý do bashdừng vòng lặp. Khi tôi kiểm tra trong dashvòng lặp tiếp tục, các shell khác có thể làm tương tự.
Graeme

6
@Graeme tiếp tục vòng lặp với một lần lặp bị treo có vẻ nguy hiểm đối với tôi vì bước tiếp theo có thể phụ thuộc vào lần trước. Giải pháp hợp lý duy nhất đối với tôi là tạm dừng toàn bộ vòng lặp và nó có thể được thực hiện trong subshell (thực sự zshcó thể tạm dừng toàn bộ vòng lặp đang chạy trong shell hiện tại).
jimmij

3
Đó có lẽ là câu trả lời - các bashnhà phát triển có thể có cùng quan điểm với bạn. Tiếp tục vòng lặp vẫn là những gì tôi mong đợi, mặc dù vậy, khi bạn dừng quá trình và điều khiển tay quay trở lại vỏ, có vẻ như nó tự nhiên để chọn nơi nó rời đi (và có lẽ sẽ là hành vi bashnếu họ không thêm vào mã để làm một cái gì đó khác).
Graeme
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.