Коли я намагаюся щось зупинити, я використовую, ^C
а іноді і ^D
в терміналі.
Яка різниця між ними? Чому якась програма не відповідає ^C
, але ^D
. Чому Terminal.app просто закриває, коли я використовую ^D
?
Коли я намагаюся щось зупинити, я використовую, ^C
а іноді і ^D
в терміналі.
Яка різниця між ними? Чому якась програма не відповідає ^C
, але ^D
. Чому Terminal.app просто закриває, коли я використовую ^D
?
Відповіді:
CtrlCповідомляє терміналу надіслати SIGINT
поточний процес переднього плану, який за замовчуванням перетворюється на завершення програми. CtrlDповідомляє терміналу, що він повинен зареєструвати EOF на стандартному вході, що bash трактує як бажання вийти.
Ctrl+ D( ^D
) означає кінець файлу . Він працює лише на початку рядка (я трохи спрощую) і не має ефекту, якщо програма не зчитує вхід з терміналу. У своєму експерименті ^D
сказали оболонці, що ви більше не збираєтесь вводити команди, тому вона вийшла; потім термінал вийшов, оскільки його підпрограма припинилась.
Ctrl+ C( ^C
) означає «перервати», тобто припинити те, що ви робите. Технічно натискання ^C
передає сигнал INT , який за замовчуванням припиняє програму, але який у багатьох програмах означає повернутися до верхнього рівня (наприклад, в оболонці, припиніть вводити командний рядок і поверніться до незайманого рядка).
Якщо програма не відповідає ^C
, ви можете спробувати Ctrl+ \( ^\
). Це посилає сигнал QUIT , який за замовчуванням припиняє програму, і який не так багато програм перехоплює.
Ще один ключ, який надсилає сигнал, - Ctrl+ Z( ^Z
). Він посилає сигнал TSTP , який призупиняє роботу програми на передньому плані. (TSTP - короткий термін «термінальна зупинка»; він подібний до STOP, але TSTP можна ігнорувати, тоді як STOP не може.) З оболонки ви можете відновити виконання програми за допомогою fg
команди (відновити на передньому плані) або bg
команди (відновити в фон).
Всі ці клавіші можна змінити за допомогою stty
команди. Деякі програми, зокрема повноекранні програми, які мають прив'язку клавіш, відключають їх.
KeyboardInterrupt
? Він завершує роботу з ctrl + d (якщо на початку рядка) та ctrl + \.
Додавши до 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
)