Khi tôi cố gắng ngăn chặn một cái gì đó, tôi sử dụng ^C
và đôi khi ^D
trong thiết bị đầu cuối.
Sự khác biệt giữa hai là gì? Tại sao một số chương trình không đáp ứng ^C
, nhưng ^D
. Tại sao Terminal.app chỉ thoát khi tôi sử dụng ^D
?
Khi tôi cố gắng ngăn chặn một cái gì đó, tôi sử dụng ^C
và đôi khi ^D
trong thiết bị đầu cuối.
Sự khác biệt giữa hai là gì? Tại sao một số chương trình không đáp ứng ^C
, nhưng ^D
. Tại sao Terminal.app chỉ thoát khi tôi sử dụng ^D
?
Câu trả lời:
CtrlCyêu cầu thiết bị đầu cuối gửi một SIGINT
quy trình tiền cảnh hiện tại, theo mặc định, nó chuyển thành chấm dứt ứng dụng. CtrlDnói với thiết bị đầu cuối rằng nó nên đăng ký EOF trên đầu vào tiêu chuẩn, điều này bash diễn giải như một mong muốn để thoát.
Ctrl+ D( ^D
) có nghĩa là kết thúc tập tin . Nó chỉ hoạt động ở đầu một dòng (tôi đơn giản hóa một chút) và không có tác dụng nếu chương trình không đọc đầu vào từ thiết bị đầu cuối. Trong thử nghiệm của bạn, ^D
đã nói với trình bao rằng bạn sẽ không nhập thêm bất kỳ lệnh nào nữa, vì vậy nó đã thoát; sau đó thiết bị đầu cuối thoát vì chương trình con của nó đã kết thúc.
Ctrl+ C( ^C
) có nghĩa là gián đoạn của người Viking, tức là dừng những gì bạn đang làm. Về mặt kỹ thuật, nhấn ^C
gửi tín hiệu INT , theo mặc định sẽ chấm dứt một ứng dụng, nhưng trong nhiều chương trình có nghĩa là quay trở lại mức cao nhất (ví dụ: trong trình bao, dừng gõ một dòng lệnh và quay lại dấu nhắc nguyên sơ).
Nếu một chương trình không phản hồi ^C
, bạn có thể thử Ctrl+ \( ^\
). Điều này sẽ gửi tín hiệu QUIT , theo mặc định sẽ chấm dứt một ứng dụng và không có quá nhiều chương trình chặn.
Một khóa khác gửi tín hiệu là Ctrl+ Z( ^Z
). Nó sẽ gửi tín hiệu TSTP , tạm dừng chương trình đang chạy ở nền trước. (TSTP là viết tắt của thiết bị đầu cuối của dòng đình đám, có thể tương tự như STOP nhưng TSTP có thể bị bỏ qua trong khi STOP không thể.) Từ trình bao, bạn có thể tiếp tục thực thi chương trình đó bằng fg
lệnh (tiếp tục ở nền trước) hoặc bg
lệnh (tiếp tục trong lý lịch).
Tất cả các phím này có thể được thay đổi bằng stty
lệnh. Một số chương trình, đặc biệt là các chương trình toàn màn hình có các ràng buộc chính, vô hiệu hóa chúng.
KeyboardInterrupt
? Nó không thoát với ctrl + d (nếu ở đầu dòng) và với ctrl + \.
Thêm vào 2 câu trả lời thực sự tốt ở trên, đây là một ví dụ:
Nếu bạn gõ python
vào shell, nó sẽ đưa bạn vào dấu nhắc >>> của python.
Bây giờ, nếu bạn nhấn Ctrl+C
, nó sẽ nói KeyboardInterrupt
và ở lại >>>.
Nếu bạn nhập vào một vòng lặp for, ví dụ bằng cách gõ for x in (text):
nó sẽ đợi bạn gõ thêm bằng cách hiển thị dấu nhắc ..., nếu bạn nhấn Ctrl+C
ngay bây giờ, nó sẽ thoát khỏi câu lệnh for và quay lại dấu nhắc >>>
Nếu bạn nhấn Ctrl+D
tại bất kỳ thời điểm nào, cho dù trong >>> hoặc ... nó sẽ thoát khỏi dấu nhắc python và trở về vỏ ban đầu.
Tương tự, nếu ssh'ed vào một máy khác, a Ctrl+C
sẽ chấm dứt mọi lệnh hiện có, Ctrl+D
cũng sẽ thực hiện điều đó và thoát khỏi máy. (Ngoài ra, Delete
chìa khóa cũng giống như làm a Ctrl+D
)