2014-11-14 17 views
6

ctrl-z (^ z) hoạt động theo cách mà tôi không hiểu khi thực hiện bên trong vòng lặp được thực hiện từ một thiết bị đầu cuối.bg/fg bên trong một vòng lặp dòng lệnh

Nói rằng tôi gõ

for ii in {0..100}; do echo $ii; sleep 1; done 

sau đó tôi nhấn^z. Tôi sẽ nhận được:

[1]+ Stopped     sleep 1 

Tôi có thể tiếp tục công việc bằng fg hoặc bg, nhưng công việc chỉ đề cập đến lệnh ngủ. Phần còn lại của vòng lặp dường như biến mất và không có số nào xuất hiện trên thiết bị đầu cuối.

tôi có thể sử dụng & sau lệnh ngay lập tức chạy nó ở chế độ nền, hoặc một giải pháp khác là để bọc toàn bộ điều trong một subshell:

(for ii in {0..100}; do echo $ii; sleep 1; done) 

rồi^z mang lại cho tôi

[1]+ Stopped     (for ii in {0..100}; 
do 
    echo $ii; sleep 1; 
done) 

Công việc này có thể được tiếp tục và mọi người đều hạnh phúc. Nhưng tôi thường không có thói quen làm điều này khi chạy một nhiệm vụ một lần, và câu hỏi tôi hỏi là tại sao hành vi đầu tiên xảy ra ngay từ đầu. Có cách nào để đình chỉ một vòng lặp dòng lệnh mà không phải là subshell'd? Và điều gì đã xảy ra với phần còn lại của vòng lặp trong ví dụ đầu tiên?

Lưu ý rằng đây là cụ thể cho các vòng lặp:

echo 1; sleep 5; echo 2 

và nhấn^z trong giấc ngủ làm cho echo 2 để thực hiện:

1 
^Z 
[2]+ Stopped     sleep 5 
2 

Hoặc nên tôi chỉ nhận được trong thói quen sử dụng & và gọi nó là ma thuật đen tối?

Trả lời

5

Bạn không thể tạm ngừng thực hiện vỏ hiện tại. Khi bạn chạy vòng lặp của bạn từ dòng lệnh, nó đang thực thi trong shell/terminal đăng nhập hiện tại của bạn. Khi bạn nhấn [ctrl + z], bạn đang yêu cầu trình bao tạm dừng quy trình hiện tại đang hoạt động. Vòng lặp của bạn chỉ đơn giản là một bộ đếm trong trình bao hiện tại, quá trình đang được thực hiện là sleep. Việc tạm ngưng chỉ hoạt động khi ngủ.

Khi bạn backgroud một quá trình hoặc thực hiện nó trong một subshell (tương đương), bạn có thể đình chỉ quá trình riêng biệt trong tổng số.

+1

Nhưng nếu tạm ngưng chỉ hoạt động trên lệnh ngủ đơn đó, tại sao các lệnh còn lại không thực thi (như trong tiếng vang 1; ngủ 5; ví dụ echo 2)? Tôi mong đợi trong trường hợp đó cho giấc ngủ đình chỉ và phần còn lại của vòng lặp để tiếp tục ngay lập tức. Dường như^z đã không chỉ bị đình chỉ ngủ mà còn giết chết vòng lặp, và đây là những gì tôi không hiểu. –

+1

Có, Nó sẽ giết chết vòng lặp. Bạn đã nói với bash để đình chỉ những gì nó đang làm. Phần duy nhất mà nó có thể đình chỉ là giấc ngủ. Phần còn lại biến mất. Tôi sẽ tìm một tài liệu tham khảo cho bạn. Đọc 'man bash (JOB CONTROL)' Lý do là, khi tạm dừng được gọi, điều khiển phải quay trở lại shell. Không có cách nào để giữ cho vòng lặp hiện đang thực thi trong khi trả về điều khiển cho trình bao, và vì nó không có đường dẫn riêng biệt có thể bị treo, nó kết thúc để trả về điều khiển cho bash. –

Các vấn đề liên quan