Многие люди используют oneliners и скрипты, содержащие код вдоль строк
cat "$MYFILE" | command1 | command2 > "$OUTPUT"
Первый catчасто называют «бесполезным использованием кошки», потому что технически это требует запуска нового процесса (часто /usr/bin/cat), где этого можно избежать, если команда была
< "$MYFILE" command1 | command2 > "$OUTPUT"
потому что тогда нужно только запустить оболочку command1и просто указать ее stdinна данный файл.
Почему оболочка не выполняет это преобразование автоматически? Я чувствую, что синтаксис «бесполезного использования кота» легче читать, и оболочка должна иметь достаточно информации, чтобы автоматически избавиться от бесполезного кота. Это catопределено в стандарте POSIX, поэтому оболочке следует разрешить реализовать его внутри, а не использовать двоичный файл в пути. Оболочка может даже содержать реализацию только для одной версии аргумента и возврата к двоичному в пути.
lseekпо-прежнему является определенным поведением и может привести к другому результату, другое поведение блокировки может быть семантически значимым и т. Д. Было бы допустимо внести изменения, если бы вы знали, что были другие команды, и знали, что им все равно, или если вы просто не заботитесь о совместимости на этом уровне, но выгода довольно мала. Я предполагаю, что отсутствие выгоды ведет к ситуации больше, чем стоимость соответствия.
catсебя, правда, или любую другую утилиту. Также разрешено знать, как работают другие утилиты, принадлежащие системе (например, он может знать, как ведет себя внешняя grepреализация , поставляемая с системой ). Это вполне жизнеспособно, поэтому справедливо задаться вопросом, почему они этого не делают.
grep. И sed. И awk. И du. А сколько сотен, если не тысяч других утилит?