51

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

Какая разница между этими двумя? Почему какая-то программа не отвечает на ^ C, но ^ D. Почему Terminal.app просто закрывается, когда я использую ^ D?

3 ответа3

54

Ctrl C сообщает терминалу отправить SIGINT текущему процессу переднего плана, что по умолчанию означает завершение приложения. Ctrl D сообщает терминалу, что он должен зарегистрировать EOF на стандартном вводе, который bash интерпретирует как желание выйти.

50

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

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

Если программа не отвечает на ^C , вы можете попробовать Ctrl+\ (^\). Это посылает сигнал ВЫХОДА , который по умолчанию завершает приложение, и который перехватывает не так много программ.

Еще одна клавиша, которая посылает сигнал - это Ctrl+Z (^Z). Он отправляет сигнал TSTP, который приостанавливает выполнение программы на переднем плане. (TSTP - это сокращение от терминальной остановки; оно похоже на STOP, но TSTP можно игнорировать, а STOP - нет.) Из оболочки вы можете возобновить выполнение этой программы с помощью команды fg (резюме на переднем плане) или команды bg (резюме на заднем плане).

Все эти ключи можно изменить с помощью команды stty . Некоторые программы, особенно полноэкранные программы с привязками клавиш, отключают их.

2

В добавление к 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)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .