Многие люди используют 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
. А сколько сотен, если не тысяч других утилит?