Сначала 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сначала сбрасывает предыдущий допустимые файлы, а затем жалуется на неверный файл (по крайней мере, так ведет себя моя кошка).