Почему чтение из стандартного ввода отличается в некоторых программах?

Я разрабатываю программу на ncurses, которая будет читать из stdin, однако, проверяя, как это делают некоторые другие программы, я заметил, что это несовместимо. Например, следующие два работают нормально

tail file.txt | cat
tail file.txt | cat -

Хотя эти не будут работать, если я не использую - :

cat file.txt | vim
cat file.txt | file

Есть ли причина, по которой некоторые программы позволяют передавать данные без ] - а некоторые нет? Должны ли они поддерживать оба способа?

0
20.02.2017, 08:12
1 ответ

Программы, которые предназначены для работы в качестве потоковых фильтров , принимая данные из некоторого источника ввода и последовательно обрабатывая их и производя вывод, обычно читаемый из стандартного ввода при вызове без аргументов, не являющихся опциями. Так, например, cat , tail и т. Д. По умолчанию читаются со стандартного ввода. Такие инструменты, как grep , sed и т. Д., Требуют одного операнда (регулярное выражение для grep, сценарий для sed) и считываются со стандартного ввода, если это единственный операнд. Vi (m) не вписывается в эту форму: это интерактивная программа, а не фильтр потока, поэтому она запускается в интерактивном режиме, когда вы не передаете аргумент.

файл является исключением: он не читает из stdin, если stdin не указан в качестве аргумента (возможно, через синтаксис - ). Я не знаю, почему ни автор, ни комитет POSIX не решили, что он не будет читать из стандартного ввода. Это может быть связано с тем, что файл заботится не только о содержимом файла, но и о типах файлов - file foo сообщает, является ли foo каталогом, обычным файлом или символическая ссылка и т. д. Таким образом, это не совсем фильтр потока, как другие, хотя обычно он используется как таковой. Это на полпути между grep (фильтр потока) и ls (который заботится только о файле как о записи каталога, а не о содержимом файла).

( grep -r тоже заботится о типах файлов, но это дополнение появилось намного позже, чем исходная команда.)

2
28.01.2020, 02:34

Теги

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