Как bash извлекает то, что было написано на терминале (без нажатия Enter)?

Как bash извлекает то, что было написано на терминале (без нажатия Enter)?

Предположим, что pingкоманда выполняется, и я набираю что-то на терминале, пока pingона выполняется.

Теперь, когда pingзавершается и bashвозвращается управление, bashна терминале будет выводиться то, что я набрал во время pingработы. Это скриншот, который показывает, что я имею в виду:

введите описание изображения здесь

Откуда bashэта информация? Я уверен, что она не от stdin, потому что когда я печатал "I typed this while ping was running", я не нажал Enter(и поэтому stdinпусто).

решение1

Башделалполучить входные данные со стандартного ввода (stdin), который является терминалом.

Терминал может находиться в одном из двух положенийрежимы:сыройилиприготовленный(также известный как «символьный режим» и «строчный режим», термины «сырой» и «приготовленный» в основном используются в мире Unix) (слово «приготовленный» было введено как каламбур, чтобы сделать противоположность «сырому»). В сыром режиме терминал немедленно передает ввод в приложение. В приготовленном режиме терминал считывает полную строку и предоставляет (очень примитивный) механизм редактирования строки и передает данные в приложение только тогда, когда пользователь нажимает Enter.

Терминалы запускаются в режиме cooking. Приложения, которым требуется больше контроля над вводом, например bash, переводят терминал в режим raw, ожидая, пока пользователь введет команду.

решение2

Я полагаю, что терминал буферизует каждую строку текста, полученную с клавиатуры, так что любая программа, имеющая файловый дескриптор (например, fd0), прикрепленный к файлу устройства терминала, не увидит никакого текста из строки, пока терминал его не «отправит», что происходит, когда вы нажимаете Enter.
(Как обходят это строковые редакторы оболочек — я не уверен, но они определенно получают текст до того, как вы нажмете Enter).

Кроме того, когда оболочка запускает дочерний процесс (в данном случае ping), она переходит в waitсостояние ожидания/ожидания, пока выполняется дочерний процесс, поэтому даже если терминал не удерживал от него текст, оболочка проигнорирует его, предположив, что он предназначен для дочернего процесса.

Итак, текст, который вы видите на экране, появляется потому, чтоТерминалотображает его, но нет программы, которая бы его перехватывала и что-либо с ним делала, пока дочерний процесс не завершится — и оболочка не «проснется» — затем текст будет отправлен в редактор строк оболочки. Хотя я не думаю, что все терминалы обязательно это делают.

Связанный контент