Я разрабатываю программу на ncurses, которая будет читать из stdin, однако, проверяя, как это делают некоторые другие программы, я заметил, что это несовместимо. Например, следующие два работают нормально
tail file.txt | cat
tail file.txt | cat -
Хотя эти не будут работать, если я не использую -
:
cat file.txt | vim
cat file.txt | file
Есть ли причина, по которой некоторые программы позволяют передавать данные без ] -
а некоторые нет? Должны ли они поддерживать оба способа?
Программы, которые предназначены для работы в качестве потоковых фильтров , принимая данные из некоторого источника ввода и последовательно обрабатывая их и производя вывод, обычно читаемый из стандартного ввода при вызове без аргументов, не являющихся опциями. Так, например, cat
, tail
и т. Д. По умолчанию читаются со стандартного ввода. Такие инструменты, как grep
, sed
и т. Д., Требуют одного операнда (регулярное выражение для grep, сценарий для sed) и считываются со стандартного ввода, если это единственный операнд. Vi (m) не вписывается в эту форму: это интерактивная программа, а не фильтр потока, поэтому она запускается в интерактивном режиме, когда вы не передаете аргумент.
файл
является исключением: он не читает из stdin, если stdin не указан в качестве аргумента (возможно, через синтаксис -
). Я не знаю, почему ни автор, ни комитет POSIX не решили, что он не будет читать из стандартного ввода. Это может быть связано с тем, что файл
заботится не только о содержимом файла, но и о типах файлов - file foo
сообщает, является ли foo
каталогом, обычным файлом или символическая ссылка и т. д. Таким образом, это не совсем фильтр потока, как другие, хотя обычно он используется как таковой. Это на полпути между grep
(фильтр потока) и ls
(который заботится только о файле как о записи каталога, а не о содержимом файла).
( grep -r
тоже заботится о типах файлов, но это дополнение появилось намного позже, чем исходная команда.)