Сначала cat
выполняется запись в стандартный вывод, который не обязательно является терминалом, даже если он cat
был введен как часть команды для интерактивной оболочки. Если вам действительно нужно что-то записать в терминал, даже если стандартный вывод перенаправлен, это не так просто (вам нужно указать, какой терминал, и может даже не быть, если команда выполняется из скрипта), хотя один может (ab) использовать стандартный вывод ошибок, если команда является просто частью конвейера. Но так как вы указали, что на cat
самом деле выполняет свою работу, я полагаю, вы не спрашивали о такой ситуации.
Если ваша цель - отправить то, что записано в стандартный вывод, в конвейер, то использование cat
будет иметь право на награду « Бесполезное использование Cat» , поскольку cat file | pipeline
(где pipeline
обозначает любой конвейер) можно сделать более эффективно, чем <file pipeline
. Но опять же, из вашей формулировки я делаю вывод, что это не было вашим намерением.
Так что не очень понятно, о чем вы беспокоитесь. Если вы нашли cat
слишком длинный текст, вы можете определить одно- или двухсимвольный псевдоним (есть еще несколько таких имен, которые остаются неиспользованными в стандартном Unix). Однако, если вы беспокоитесь, что cat
тратите бесполезные циклы, вы не должны.
Если бы существовала программа, null
которая не принимает аргументов и просто копирует стандартный ввод в стандартный вывод (нейтральный объект для конвейеров), вы можете делать то, что хотите <file null
. Такой программы не существует, хотя ее было бы легко написать (программа на языке C с помощью однострочной main
функции может выполнить эту работу), но вызов cat
без аргументов (или, cat -
если вы хотите быть явным) делает именно это.
Если бы существовала nocat
программа, которая принимает ровно один аргумент имени файла, пытается открыть файл, жалуется на него, если не может, и в противном случае переходит к копированию из файла в стандартный вывод, тогда это будет именно то, что вы просите. Писать его немного сложнее, чем null
основная работа: открытие файла, тестирование и, возможно, жалоба (если вы дотошны, вы можете также включить тест, в котором есть только один аргумент, и пожаловаться в противном случае). Но опять же cat
, теперь с одним аргументом, это именно так, поэтому нет необходимости в какой-либо nocat
программе.
Если вам удалось написать nocat
программу, зачем останавливаться на одном аргументе? Заключение кода в цикл for(;*argp!=NULL;++argp)
на самом деле совсем не сложно, добавляет в двоичный файл не более пары машинных инструкций и позволяет избежать необходимости жаловаться на неправильное количество аргументов (что избавляет от множества других инструкций). Вуаля примитивная версия cat
, объединяющая файлы. (Если честно, нужно немного подправить его, чтобы без аргументов он вел себя как null
.)
Конечно, в реальной cat
программе они добавили несколько наворотов, потому что они всегда так делают. Но суть в том, что аспект «конкатенации» cat
затрат вообще не требует усилий ни для программиста, ни для исполняющей его машины. Тот факт, что cat
подводит итог null
и nocat
объясняет отсутствие таких программ. Избегайте использования cat
с одним аргументом, если результат попадает в конвейер, но если он используется только для отображения содержимого файла на терминале, даже страница, на которую я ссылался, признает, что это полезное использование cat
, так что не стесняйтесь.
Вы можете проверить, что cat
в действительности реализовано простым циклом вокруг гипетической nocat
функциональности, вызывая cat
несколько имен файлов, среди которых одно недопустимое имя, а не в первой позиции: вместо того, чтобы сразу жаловаться, что этот файл не существует, cat
сначала сбрасывает предыдущий допустимые файлы, а затем жалуется на неверный файл (по крайней мере, так ведет себя моя кошка).