По-перше, catзаписує на стандартний вихід, який не обов'язково є терміналом, навіть якщо він catбув введений як частина команди в інтерактивну оболонку. Якщо вам дійсно потрібно щось написати в термінал, навіть коли стандартний вихід перенаправлений, це не так просто (вам потрібно вказати, який термінал, а може бути навіть і один, якщо команда виконується зі сценарію), хоча один може (ab) використовувати стандартний вихід помилок, якщо команда є лише частиною конвеєра. Але оскільки ви вказали, що 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)насправді зовсім не докладає зусиль, додає до двійкового файлу максимум пару машинних інструкцій і уникає того, щоб скаржитися на неправильну кількість аргументів (що дозволяє набагато більше інструкцій). Voilà - примітивна версія catоб'єднаних файлів. (Якщо чесно, вам потрібно його трохи підправити, щоб без аргументів він поводився як null.)
Звичайно, у реальній catпрограмі вони додали кілька дзвіночків, адже вони завжди так роблять. Але суть полягає в тому, що аспект "конкатенації" catдійсно зовсім не докладає зусиль, ані програмісту, ані машині, яка його виконує. Той факт, що catвключає nullі nocatпояснює відсутність таких програм. Уникайте використання catодного аргументу, якщо результат переходить у конвеєр, але якщо він використовується лише для відображення вмісту файлів на терміналі, навіть сторінка, на яку я пов’язана, визнає, що це корисне використання cat, тому не соромтеся.
Ви можете перевірити, що catреально реалізований простим циклом навколо гіптетичного nocatфункціоналу, зателефонувавши catз кількома іменами файлів, серед яких одне недійсне ім’я, не на першій позиції: замість того, щоб відразу скаржитися на те, що цього файлу не існує, catспочатку відкидає попереднє дійсні файли, а потім скаржиться на недійсний файл (принаймні так поводиться моя кішка).