Почему делает Ctrl-D выход (EOF) оболочка?

Поскольку во втором ln это не перестало работать, это создает a

symlink_dir/dir_2 -> dir_2

символьная ссылка

Сделайте a:

ls -l symlink_dir/dir_2

И Вы будете видеть (вероятно, поврежденный) символьная ссылка там.

Это то, как ln предназначен, чтобы работать, если цель является каталогом (или символьная ссылка на каталог).

Одна треть ln мог перестать работать, потому что уже существует a dir_2 внутри symlink_dir (иначе dir_2).

70
22.01.2014, 09:51
2 ответа

^D символ (также известный как \04 или 0x4, КОНЕЦ ПЕРЕДАЧИ в Unicode), значение по умолчанию для eof специальный параметр управляющего символа драйвера терминального или псевдотерминала в ядре (более точно tty протокол работы линии, подключенный к последовательному или pseudo-tty устройству). Это c_cc[VEOF] из termios структура передала TCSETS/TCGETS ioctl каждый выходит к оконечному устройству для влияния на поведение драйвера.

Типичная команда, которая отправляет их ioctls stty команда.

Получать все параметры:

$ stty -a
speed 38400 baud; rows 58; columns 191; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O;
min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

Это eof параметр только релевантен, когда оконечное устройство находится в icanon режим.

В том режиме терминальный драйвер (не эмулятор терминала) реализует очень простой строчный редактор, где можно ввести Клавишу Backspace для стирания символа, Ctrl-U для стирания целой строки... Когда приложение читает из оконечного устройства, оно ничего не видит, пока Вы не нажимаете Return в который точка read() возвращает сплошную линию включая последнее LF символ (по умолчанию, терминальный драйвер также переводит CR отправленный Вашим терминалом по Возврату к LF).

Теперь, если Вы хотите отправить то, что Вы ввели до сих пор, не нажимая Enter, это - то, где можно войти eof символ. После получения того символа от эмулятора терминала терминальный драйвер отправляет текущее содержание строки, так, чтобы приложение, делающее read на нем получит его, как (и это не будет включать запаздывание LF символ).

Теперь, если текущая строка была пуста, и если приложение полностью считает ранее вводимые строки, read возвратит 0 символов.

Это показывает конец файла к приложению (когда Вы читаете из файла, Вы читаете, пока нет ничего больше, чтобы быть считанным). Вот почему это звонило eof символ, потому что отправка его заставляет приложение видеть, что более вход не доступен.

Теперь, современные оболочки, при их подсказке не устанавливают терминал в icanon режим, потому что они реализуют свой собственный строчный редактор, который намного более совершенствуется, чем терминальный драйвер встроенный. Однако в их собственном строчном редакторе, чтобы не смущать пользователей, они дают ^D символ (или безотносительно терминала eof установка с некоторыми) то же значение (для выражения eof).

80
27.01.2020, 19:31
  • 1
    , который я знал, после того как я начал читать этот комментарий, что он был записан Stephane :) Вы, Stephane, являетесь моим героем Bash, и я не саркастичен. Я хотел бы пообедать с Вами и выбрать Ваш мозг, если Вы находитесь когда-нибудь в Нью-Йорк Сити, я покупаю. –  Gregg Leventhal 17.11.2017, 19:11
  • 2
    @GreggLeventhal.Спасибо. Шансы того, что я шел к Нью-Йорк Сити в ближайшее время являются довольно небольшими все же. –  Stéphane Chazelas 18.11.2017, 11:03

CTRL_D является просто сигналом, говоря, что это - конец текстового потока. Вы не заканчиваете файл им, Вы заканчиваете свой входной поток путем ввода его. Также CTRL_D не обозначает символ или байт, как можно узнать с инструментом hexdump:

# cat >test.txt
asdf# hexdump -C test.txt 
00000000  61 73 64 66                                       |asdf|
00000004
# ll test.txt 
-rw-r--r-- 1 root root 4 Jan 21 11:55 test.txt
9
27.01.2020, 19:31
  • 1
    И причина, что это заканчивает оболочку, состоит в том, что оболочка является в основном процессом, который принимает вход и действительно наполняет им. Когда Вы говорите этому, что более вход не будет прибытием, нет ничего больше, чтобы оболочка сделала. –  Jenny D 21.01.2014, 13:04
  • 2
    я понимаю, что последовательность EOF не содержится, скажем, текстовым файлом, и сгенерирован ОС, чтобы сообщить, что больше нет данных для чтения. Я думаю, что я действительно спрашиваю, то, если сессия интерактивного терминала рассматривается как реальный поток файла оболочкой, как какой-либо другой поток файла. –  Geeb 21.01.2014, 13:25
  • 3
    Просто отредактированный исходный вопрос разъясниться. –  Geeb 21.01.2014, 13:32
  • 4
    да, поток, который переходит к удару, является входным потоком как любой другой. CTRL_D сигнализирует, что входной поток в его конце, и удар может выйти. –  Thorsten Staerk 21.01.2014, 13:42

Теги

Похожие вопросы