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

62

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

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

prosseek
источник
К вашему сведению: см. На страницах Википедии: символ КОНЕЦ ТЕКСТА U + 0003, созданный Control + C, и символ КОНЕЦ ПЕРЕДАЧИ U + 0004, созданный Control + D.
Василий Бурк

Ответы:

61

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

Игнасио Васкес-Абрамс
источник
63

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

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

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

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

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

Жиль "ТАК - перестань быть злым"
источник
Небольшая поправка: Control-Z отправляет сигнал TSTP (остановка терминала). Это может быть поймано или проигнорировано процессами, тогда как сигнал STOP не может быть.
Крис Пейдж
Нужно это! это застряло, и я не мог выйти
анбизкад
1
Просто предложение относительно CTRL-D: это означает «очистить введенный мною ввод», и если строка пуста, read () возвращает ноль, и это интерпретируется как «конец файла».
Лука
Это супер важная и полезная информация; спасибо за исчерпывающее и понятное объяснение
Ионо
Просто любопытно, почему прога python, запускаемая в shell, не закрывается с помощью 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ключ такой же, как делать Ctrl+D)

Сиддхартха
источник
Я ценю этот ответ. Тем не менее, я обнаружил некоторые неточности, когда попробовал это для себя. Пока ssh'd подключался к удаленной машине и выполнял процесс python, Ctrl + D вышел из python и вернул меня к приглашению удаленной машины, но он не вышел из машины. Кроме того, клавиша Delete не работала так же, как Ctrl + D в любом случае, при запуске python, в удаленном приглашении или в моем локальном приглашении. Похоже, он ничего не делал, за исключением фактического удаления символов при вводе на python, конечно. Однако Ctrl + D действовал как клавиша Delete при наборе текста, он удалял символы.
Stack Underflow
1
Это интересно, я думаю, это может зависеть от типа используемой вами оболочки (bash, ksh и т. Д.).
Сиддхартха