Терминал работает, когда мы открываем его.
luvpreet@DHARI-Inspiron-3542:/$
Я только что открыл его. Так, когда я нажимаю Ctrl+C, почему он не уничтожает себя и закрывает терминал??
Ctrl + C является сигналом прерывания. При вводе этого в терминале удар отправляет SIGINT в задание на переднем плане. Если нет никакого задания (который имеет место, когда Вы только что открыли терминал), ничего не происходит. Программа эмулятора терминала не является заданием, работающим в оболочке, таким образом, это не получает сигнал и не закрывается.
, Если Вы хотите закрыть терминал с клавишей CTRL, используйте Ctrl + D (EOF), который заставляет удар выходить (и закрывает терминал также).
См. также: Руководство Новичка Bash по сигналам и в большей глубине , Как обработка сигнала работает
примечание: этот ответ был отредактирован, так как комментарии были добавлены
Нажатие клавиши ^C , как другие нажатия клавиш*, не является волшебным - оно отправляет код клавиши в то, какой бы ни программа фокусируется. (В X, код клавиши 54 для C с модификатором 0x4 для Ctrl .) Программа это получает поток ключей, ответственно за то, что сделало, что-то соответствующее с ними - помнят, что во многих приложениях GUI, нажатие клавиши копирует в буфер обмена.
, Когда эмулятор терминала GUI (например, Konsole) или виртуальный терминал получает нажатие клавиши, которое он интерпретирует как ^C , это может сделать одну из трех вещей. Если терминал находится в режим без предварительной обработки , то под управлением программа попросила, чтобы терминал не работал любой обработка специальных ключей сама и передал их прямо программе. Некоторые программы, которые поддерживают расширенные функции как редактирование строки, получают ввод с клавиатуры в некоторой конфигурации промежуточные полные необработанные нажатия клавиш и обработанные строки текста; bash
, например, получает нажатия клавиш по одному. ^C интерпретируется терминалом, но клавиша Backspace отправляется в оболочку как есть.
Большинство программ, однако, использует режим с обработкой (потому что это не сырые данные), где терминал интерпретирует некоторые основные нажатия клавиш прежде на самом деле отправить их в программу (это - то, почему можно использовать клавишу Backspace в cat
). В этом режиме сам терминал переводит нажатие клавиши ^C в SIGINT
сигнал и отправляет его в дочерний процесс. Так как терминал сгенерировал сигнал, он не запутается и завершится.
^C обычно отображается (см. stty -a
) к SIGINT
сигнал (см. man 7 signal
).
непойманное SIGINT
прерывания рабочий процесс, НО...
SIGINT
один из сигналов, что процесс может указать поведение для ("Ловля сигнала").
, Что Вы называете "терминальными" выгодами SIGINT
и возвращаетесь к работе.
Когда я был новичком, я пропускал часть, что, когда я использовал командную строку, я на самом деле использовал две отдельных программы, терминал и оболочку (например, удар)
, оболочка - то, что Вы уже, вероятно, знаете, программа, которая берет в качестве входных команд или сценариев, выполняет их и печатает их вывод.
терминал с другой стороны похож на человека в середине между пользователем и программой (какая программа обычно является оболочкой как удар или рыба). То, что делает терминал, должно считать вход, например, из клавиатуры, возможно, обработать тот вход в некотором роде и перенаправить его к другой программе (удар).
Также это работает в другом слишком, когда другая программа производит что-то, что что-то перенаправляется к терминалу, затем это - задание терминала для вывода этого что-то на экран. Промежуточный вводимый и печатающий его на экран терминал может интерпретировать вход, который это получает различными путями.
, Например, если программа производит следующую последовательность:
\e[0;31m some extra foobar text
терминал выведет на экран "некоторый дополнительный foobar текст" с красными буквами. Это вызвано тем, что терминал принимает решение рассматривать тот странный код специальным способом , которые кодируют подсказки он для печати следующего вывода красного цвета.
Так же, когда пользователь нажимает Ctrl - C
, единственная специальная вещь об этом состоит в том, что терминал принимает решение рассматривать его специальным способом, нет ничего другого специального предложения об этом сочетании клавиш. Конкретно это подсказывает он отправленному сигнал прерывания (SIGINT) к процессу, который работает в терминале, который является оболочкой. Если в тот момент существует какая-либо программа, которая была порождена оболочкой и в настоящее время работает на переднем плане, она также получает сигнал. Теперь оболочка имеет специальный обработчик для этого сигнала, и ничего не происходит. Но большинство программ имеет обработчики по умолчанию, которые в случае SIGINT просто выходят.
Каждому сигналу связали действие по умолчанию с ним. Действие по умолчанию для сигнала является действием, которое выполняют сценарий или программа, когда это получает сигнал.
Ctrl+C отправляет сигнал "прерывания" (SIGINT), который значения по умолчанию к завершению процесса к заданию, работающему на переднем плане.
Ctrl+D говорит терминалу, что он должен зарегистрировать EOF на стандартном входе, который удар интерпретирует как требование выйти.
Процесс может принять решение проигнорировать сигнал INT, и Bash делает так, когда он работает в интерактивном режиме.
Из руководства:
То, когда удар является интерактивным, в отсутствие любых прерываний, он игнорирует SIGTERM (так, чтобы уничтожили 0, не уничтожает интерактивную оболочку), и SIGINT пойман и обработан (так, чтобы встроенное ожидание было прерываемо). Во всех случаях удар игнорирует SIGQUIT. Если управление заданиями в действительности, удар игнорирует SIGTTIN, SIGTTOU и SIGTSTP.
прерывание является функцией, встроенной в оболочку, которая отвечает на аппаратные сигналы и другие события. Это определяет и активирует обработчики, которые будут выполнены, когда оболочка получает сигналы или другие особые условия.
trap [-lp] [arg] [sigspec …]
-l
распечатайте список имен сигнала и их соответствующих чисел.
-p
отобразите команды прерывания, связанные с каждым SIGNAL_SPEC.аргумент должен быть считан и выполнен, когда оболочка получает сигнал sigspec. Каждый sigspec является или именем сигнала или числом сигнала. Имена сигнала нечувствительны к регистру, и префикс SIG является дополнительным.
Если sigspec 0 или ВЫХОД, аргумент выполняется, когда оболочка выходит. Для понимания этого закройте терминал и откройте его после редактирования после строки в .bashrc
файл.
trap 'notify-send "Ctrl D pressed"' 0
Ctrl D подобен exit
управляйте для выхода от терминала.
Если Вы хотите, чтобы Bash вышел после получения сигнала INT, даже в интерактивном режиме, можно добавить следующее к Вашему ~/.bashrc
:
trap 'exit' INT
или
trap 'exit' 2