По-перше, 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
спочатку відкидає попереднє дійсні файли, а потім скаржиться на недійсний файл (принаймні так поводиться моя кішка).