что подразумевается под подключением STDOUT и STDIN?


10

Я читаю книгу, в которой говорится:

У каждого процесса есть как минимум три канала связи: «стандартный ввод» (STDIN), «стандартный вывод» (STDOUT) и «стандартная ошибка» (STDERR).

Большинство команд принимают свои входные данные из STDIN и записывают свои выходные данные в STDOUT. Они пишут сообщения об ошибках в STDERR. Это соглашение позволяет объединять команды вместе, как строительные блоки, для создания составных конвейеров.

Оболочка интерпретирует символы <, >и в >>качестве инструкции для перенаправления ввода или вывода комманд или из файла.

Чтобы подключить STDOUT одной команды к STDIN другой, используйте | символ, обычно известный как канал.

ps -ef | grep httpd

Таким образом, в основном это говорит о том, что стандартный ввод - это команда, которая позволяет пользователю записывать в файл, в то время как стандартный вывод - это команда, имеющая вывод записи оболочки в bash, и стандартная ошибка аналогична выводу, но это только вызывается при возникновении ошибки в файловой системе. Затем мы переходим к соединению STDOUT и STDIN, и я заблудился.

Ответы:


25

Стандартный ввод и стандартный вывод не являются командами.

Представьте команды как машины на заводе с конвейера. Большинство машин имеют одну конвейерную ленту для подачи данных и одну конвейерную ленту для передачи данных; они являются стандартным входом и стандартным выходом соответственно. Стандартная ошибка - это отверстие на боковой части машины, где она может выдвигать отклонения.

+-------+     +------------------+       +------------------+     +------+
| input |     |    machine A     |       |    machine B     |     |output|
| reser ­­­|=====|<stdin     stdout>|=======|<stdin     stdout>|=====|bucket|
| voir |    |      stderr      |      |      stderr      |    |      |
+-------+     +------------------+       +------------------+     +------+
                      ||                          ||

На приведенной выше схеме показана конвейерная лента, проходящая через две машины. Данные поступают из входного резервуара слева, поступают в машину A, затем выходные данные передаются далее в машину B (для которой они вводятся), а выходные данные машины B помещаются в выходную емкость справа.

В терминах Unix это называется конвейером . Метафора метафора: сантехника: труба соединяет машину А с машиной Б. Синтаксис оболочки для конвейера выше

<input-file.txt commandA | commandB >output-file.txt

Символ < перенаправления указывает оболочке подключить commandAстандартный ввод к файлу input-file.txtперед запуском commandA. (Вы можете поместить перенаправление до или после имени команды.) Символ >перенаправления указывает оболочке подключать commandBстандартный вывод для подключения output-file.txt. Символ канала (" |") в середине указывает оболочке подключать commandAстандартный вывод к commandBстандартному вводу перед их запуском.

Команды могут иметь более одного ввода и более одного вывода, но это материал для другого дня .



Хорошая аналогия. Я понял концепцию потокового конвейера уже много лет, но почему-то никто никогда не использовал аналогию фабрики / конвейера, что делает ее действительно легко (и кратко) понятной. Спасибо!
Оуэн Блэкер

1
Отличная аналогия. Я позаимствую этот, если не возражаешь.
Tivie

Жиль, я задал вопрос по твоей фразе внизу: unix.stackexchange.com/q/96724/29146 . не могли бы вы уточнить?
стружка

@Gilles - Можете ли вы включить пример, иллюстрирующий возможность определения перенаправления до или после команды? Например, может ли конвейер считываться как input-file.txt> commandA или input-file.txt <commandA?
Мотивировано

6

standard input is a command that allows user to write to a file

Не команда, а поток. Стандартные входы и выходы похожи на почтовые ящики. Когда программа запускается, ей дают ящик для получения и ящик для отправки почты. Обычно ввод поступает с клавиатуры и помещается в почтовый ящик, а почта, помещенная в почтовый ящик, попадает на экран терминала.

standard output is a command that has the bash shell write output to the shell

Программа на самом деле не знает, где стандартные точки. Когда вы $ A | Bотправляете по конвейеру от A до B (как в ), когда A отправляет почту в почтовый ящик, она попадает в почтовый ящик B. B обрабатывает ввод и помещает свою собственную почту в исходящий ящик, который вы видите на терминале.

Для удаления метафоры, как уже упоминалось, стандартными входами / выходами являются потоки. Почтовый ящик или дескриптор файла является одним концом потока. К трубе стоит подключить стандарт из А к стандарту в Б.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.