Когда я пытаюсь что-то остановить, я использую ^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+ \( ^\
). Это посылает сигнал ВЫХОДА , который по умолчанию завершает приложение, и который перехватывает не так много программ.
Еще один ключ, который отправляет сигнал 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
ключ такой же, как делать Ctrl+D
)