Sự khác biệt giữa ^ C và ^ D đối với thiết bị đầu cuối UNIX / Mac OS X là gì?


61

Khi tôi cố gắng ngăn chặn một cái gì đó, tôi sử dụng ^Cvà đôi khi ^Dtrong 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?


FYI: Xem các trang Wikipedia để biết: KẾT THÚC ký tự U + 0003 được tạo bởi Control + C và KẾT THÚC ký tự U + 0004 được tạo bởi Control + D.
Basil Bourque

Câu trả lời:


60

CtrlCyêu cầu thiết bị đầu cuối gửi một SIGINTquy 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.


62

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 ^Cgử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 fglệnh (tiếp tục ở nền trước) hoặc bglệ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 sttylệ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.


Một hiệu chỉnh nhỏ: Control-Z gửi tín hiệu TSTP (dừng cuối). Điều này có thể bị bắt hoặc bỏ qua bởi các quá trình, trong khi tín hiệu STOP không thể.
Chris Trang

Cần cái này! nó bị kẹt và tôi không thể thoát ra được
ahnbizcad

1
Chỉ là một gợi ý liên quan đến CTRL-D: nó có nghĩa là "tuôn ra đầu vào tôi đã nhập từ trước đến nay" và nếu dòng trống, thì read () trả về 0 và được hiểu là "cuối tệp".
luca

Đây là thông tin siêu quan trọng và hữu ích; cảm ơn vì lời giải thích toàn diện và rõ ràng
iono

Chỉ tò mò, tại sao progam python chạy trong shell không thoát bằng ctrl + c, thay vào đó nó lại nhắc KeyboardInterrupt? Nó không thoát với ctrl + d (nếu ở đầu dòng) và với ctrl + \.
Rick

2

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õ pythonvà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 KeyboardInterruptvà ở 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+Cngay 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+Dtạ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+Csẽ chấm dứt mọi lệnh hiện có, Ctrl+Dcũng sẽ thực hiện điều đó và thoát khỏi máy. (Ngoài ra, Deletechìa khóa cũng giống như làm a Ctrl+D)


Tôi đánh giá cao câu trả lời này. Tuy nhiên, tôi đã tìm thấy một số điểm không chính xác khi tự mình thử nó. Trong khi ssh'ed vào một máy từ xa và chạy quy trình python, Ctrl + D đã thoát khỏi python và đưa tôi trở lại dấu nhắc của máy từ xa, nó không thoát khỏi máy. Ngoài ra, phím Xoá không hoạt động giống như Ctrl + D trong mọi trường hợp, chạy python, tại dấu nhắc từ xa hoặc tại dấu nhắc cục bộ của tôi. Nó dường như không làm gì cả, ngoại trừ thực sự xóa các ký tự trong khi gõ bằng python, tất nhiên. Tuy nhiên, Ctrl + D đã hoạt động như phím Xóa khi gõ, nó đã xóa các ký tự.
Stack Underflow

1
Điều đó thật thú vị, tôi nghĩ nó có thể phụ thuộc vào loại vỏ bạn đang sử dụng (bash, ksh, v.v.).
Siddhartha
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.