Яка різниця між ^ C і ^ D для терміналу UNIX / Mac OS X?


61

Коли я намагаюся щось зупинити, я використовую, ^Cа іноді і ^Dв терміналі.

Яка різниця між ними? Чому якась програма не відповідає ^C, але ^D. Чому Terminal.app просто закриває, коли я використовую ^D?


FYI: Див. Сторінки Вікіпедії для: символ END + TEXT U + 0003, створений Control + C, і END OF TRANSMISSION U + 0004, створений Control + D.
Василь Бурк

Відповіді:


60

CtrlCповідомляє терміналу надіслати SIGINTпоточний процес переднього плану, який за замовчуванням перетворюється на завершення програми. CtrlDповідомляє терміналу, що він повинен зареєструвати EOF на стандартному вході, що bash трактує як бажання вийти.


62

Ctrl+ D( ^D) означає кінець файлу . Він працює лише на початку рядка (я трохи спрощую) і не має ефекту, якщо програма не зчитує вхід з терміналу. У своєму експерименті ^Dсказали оболонці, що ви більше не збираєтесь вводити команди, тому вона вийшла; потім термінал вийшов, оскільки його підпрограма припинилась.

Ctrl+ C( ^C) означає «перервати», тобто припинити те, що ви робите. Технічно натискання ^Cпередає сигнал INT , який за замовчуванням припиняє програму, але який у багатьох програмах означає повернутися до верхнього рівня (наприклад, в оболонці, припиніть вводити командний рядок і поверніться до незайманого рядка).

Якщо програма не відповідає ^C, ви можете спробувати Ctrl+ \( ^\). Це посилає сигнал QUIT , який за замовчуванням припиняє програму, і який не так багато програм перехоплює.

Ще один ключ, який надсилає сигнал, - Ctrl+ Z( ^Z). Він посилає сигнал TSTP , який призупиняє роботу програми на передньому плані. (TSTP - короткий термін «термінальна зупинка»; він подібний до STOP, але TSTP можна ігнорувати, тоді як STOP не може.) З оболонки ви можете відновити виконання програми за допомогою fgкоманди (відновити на передньому плані) або bgкоманди (відновити в фон).

Всі ці клавіші можна змінити за допомогою sttyкоманди. Деякі програми, зокрема повноекранні програми, які мають прив'язку клавіш, відключають їх.


Невелика корекція: Control-Z посилає сигнал TSTP (термінальна зупинка). Це може бути зафіксовано або проігноровано процесами, тоді як сигнал STOP не може бути.
Кріс Пейдж

Потрібно це! він застряг, і я не міг вибратися
ahnbizcad

1
Лише пропозиція щодо CTRL-D: вона означає "промити введений я до цього часу", а якщо рядок порожній, то read () повертається з нулем, і це інтерпретується як "кінець файлу".
Лука

Це надзвичайно важлива та корисна інформація; дякую за всебічне та чітке пояснення
iono

Цікаво, чому прога python, який працює в оболонці, не виходить із ctrl + c, а замість цього підказує KeyboardInterrupt? Він завершує роботу з ctrl + d (якщо на початку рядка) та ctrl + \.
Рік

2

Додавши до 2 дійсно хороших відповідей вище, ось приклад:

Якщо ви введете pythonоболонку, вона переведе вас у підказку >>> python.

Тепер, якщо ви натиснете Ctrl+C, він скаже KeyboardInterruptі залишиться в >>>.
Якщо ви введете цикл for, наприклад, ввівши for x in (text):його, ви чекаєте подальшого введення, показавши підказку ..., якщо ви натиснете Ctrl+Cзараз, він вийде з оператора for і повернеться до підказки >>>
Якщо ви натиснете Ctrl+Dв будь-який момент, чи в >>> чи ..., він вийде із запиту python і повернеться до початкової оболонки.

Аналогічно, якщо ssh'ed в іншу машину, a Ctrl+Cприпинить будь-які існуючі команди, Ctrl+Dзробить це і вийде з машини. (Також Deleteключ є таким же, як і виконувати a Ctrl+D)


Я ціную цю відповідь. Однак я виявив деякі неточності, коли випробував це на собі. Поки ssh'ed у віддаленій машині і запускав процес python, Ctrl + D вийшов з python і повернув мене до підказок віддаленої машини, він не вийшов з машини. Також ключ Delete не працював так само, як Ctrl + D, у будь-якому випадку, запускаючи python, у віддаленому запиті або в моєму локальному запиті. Здавалося, це нічого не робило, крім фактичного видалення символів під час набору в python. Однак Ctrl + D виконував роль клавіші Delete під час введення, вона видаляла символи.
Стік Underflow

1
Це цікаво, я думаю, що це може залежати від типу оболонки, яку ви використовуєте (bash, ksh тощо).
Сіддхартха
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.