Вы буквально «заканчиваете файл», вводя эту escape-последовательность, т.е. является ли сеанс интерактивной оболочки воспринимается оболочкой как реальный файловый поток, как и любой другой файловый поток? Если да, то какой файл?
Или сигнал Ctrl+ Dявляется просто заполнителем, который означает, что «пользователь завершил ввод данных, и вы можете завершить работу»?
set -o ignoreeof
изменить это поведение.Ответы:
Символ
^D
(также известный как\04
или 0x4, END OF TRANSMISSION в Unicode) является значением по умолчанию для параметраeof
специального управляющего символа терминала или драйвера псевдотерминала в ядре (точнее,tty
дисциплины строки, прикрепленной к последовательному или псевдотерминалу). устройство tty ). Этоc_cc[VEOF]
частьtermios
структуры , передаваемой в TCSETS / TCGETSioctl
один на вопросы терминального устройства , чтобы повлиять на поведение водителя.Типичная команда, которая отправляет те,
ioctls
являетсяstty
командой.Чтобы получить все параметры:
Этот
eof
параметр имеет значение только тогда, когда терминальное устройство находится вicanon
режиме.В этом режиме в драйвере терминала (не в эмуляторе терминала) реализован очень простой редактор строк , в котором вы можете напечатать, Backspaceчтобы стереть символ, Ctrl-Uстереть всю строку ... Когда приложение читает с терминального устройства, оно ничего не видит, пока Вы нажимаете, Returnв какой момент
read()
возвращается полная строка, включая последнийLF
символ (по умолчанию драйвер терминала также переводитCR
отправленные вашим терминалом значения ReturnвLF
).Теперь, если вы хотите отправить то, что вы печатали до сих пор, не нажимая Enter, вы можете ввести
eof
символ. Получив этот символ от эмулятора терминала, драйвер терминала отправляет текущее содержимое строки, чтобы приложение, выполняющееread
его, получало его как есть (и оно не будет содержать завершающийLF
символ).Теперь, если текущая строка была пустой и при условии, что приложение полностью прочитало ранее введенные строки,
read
будет возвращен символ 0.Это означает конец файла для приложения (когда вы читаете из файла, вы читаете, пока больше нечего читать). Вот почему он называется
eof
символом, потому что его отправка заставляет приложение видеть, что больше нет ввода.Теперь современные оболочки, по их подсказке, не устанавливают терминал в
icanon
режим, потому что они реализуют свой собственный линейный редактор, который намного более продвинут, чем встроенный драйвер терминала. Тем не менее, в своем собственном редакторе строк , чтобы не запутать пользователей, они дают^D
символу (или какому-либо другомуeof
настройку терминала ) то же значение (для обозначенияeof
).источник
CTRL_D - просто сигнал о том, что это конец текстового потока. Вы не заканчиваете файл этим, вы заканчиваете свой поток ввода, печатая его. Также CTRL_D не обозначает какой-либо символ или байт, как вы можете узнать с помощью инструмента hexdump:
источник