Когда я пытаюсь что-то остановить, я использую ^ C, а иногда и ^ D в терминале.
Какая разница между этими двумя? Почему какая-то программа не отвечает на ^ C, но ^ D. Почему Terminal.app просто закрывается, когда я использую ^ D?
Когда я пытаюсь что-то остановить, я использую ^ C, а иногда и ^ D в терминале.
Какая разница между этими двумя? Почему какая-то программа не отвечает на ^ C, но ^ D. Почему Terminal.app просто закрывается, когда я использую ^ D?
Ctrl C сообщает терминалу отправить SIGINT
текущему процессу переднего плана, что по умолчанию означает завершение приложения. Ctrl D сообщает терминалу, что он должен зарегистрировать EOF на стандартном вводе, который bash интерпретирует как желание выйти.
Ctrl+D (^D
) означает конец файла. Он работает только в начале строки (я немного упрощаю) и не действует, если программа не читает ввод с терминала. В вашем эксперименте ^D
сказал оболочке, что вы не собираетесь больше вводить команды, поэтому он завершился; затем терминал вышел, потому что его подпрограмма была завершена.
Ctrl+C (^C
) означает «прервать», то есть остановить то, что вы делаете. Технически, нажатие ^C
отправляет сигнал INT, который по умолчанию завершает приложение, но который во многих программах означает возврат на верхний уровень (например, в оболочке, прекращение ввода командной строки и возврат к первоначальному приглашению).
Если программа не отвечает на ^C
, вы можете попробовать Ctrl+\ (^\
). Это посылает сигнал ВЫХОДА , который по умолчанию завершает приложение, и который перехватывает не так много программ.
Еще одна клавиша, которая посылает сигнал - это Ctrl+Z (^Z
). Он отправляет сигнал TSTP, который приостанавливает выполнение программы на переднем плане. (TSTP - это сокращение от терминальной остановки; оно похоже на STOP, но TSTP можно игнорировать, а STOP - нет.) Из оболочки вы можете возобновить выполнение этой программы с помощью команды fg
(резюме на переднем плане) или команды bg
(резюме на заднем плане).
Все эти ключи можно изменить с помощью команды stty
. Некоторые программы, особенно полноэкранные программы с привязками клавиш, отключают их.
В добавление к 2 действительно хорошим ответам выше, вот пример:
Если вы python
в оболочку, вы попадете в приглашение python >>>.
Теперь, если вы нажмете Ctrl+C
, он скажет KeyboardInterrupt
и останется в >>>.
Если вы входите в цикл for, например, набирая for x in (text):
он ждет, пока вы наберете текст , отображая приглашение ..., если вы нажмете Ctrl+C
сейчас, он выйдет из оператора for и вернуться к приглашению >>>
Если вы в любой момент нажмете Ctrl+D
, будь то в >>> или ..., он выйдет из приглашения python и вернется в исходную оболочку.
Точно так же, если ssh'ed на другой машине, Ctrl+C
прервет любые существующие команды, Ctrl+D
сделает это и также выйдет из машины. (Кроме того, клавиша Delete
аналогична Ctrl+D
)