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