Перед тим, як оболонка виконає cat
команду в командному рядку, вона шукає перенаправлення.
Є два перенаправлення:
>file1
Це призведе до переходу стандартного виводу команди file1
.
<file2
Це зробить стандартний вхід команди file2
.
Те, що ці переадресації розміщуються у неяскравому місці в командному рядку, не має значення.
$ cat <file2 >file1
те саме, що
$ <file2 cat >file1
що те саме
$ <file2 >file1 cat
тощо¹
Зауважте, що cat
утиліта у всіх цих екземплярах виконується без аргументів командного рядка . Перенаправлення не є операндами для cat
команди, це вказівки оболонці для встановлення переадресації в команду та вихід із неї (підключення її стандартного вводу та виводу до файлів). Оболонка встановлює перенаправлення перед викликом команди.
Різниця між cat file
і cat <file
(або, якщо ви хочете <file cat
) полягає в тому, що в першому випадку cat
утиліта сама відкриває файл для подання читання в якості операнду в командному рядку, тоді як у другому випадку оболонка буде відкрийте файл і підключіть cat
до нього потік введення². У другому випадку cat
помітить, що йому не було надано файлу операнду, і він автоматично перейде до зчитування зі свого стандартного вводу. Це і особливості cat
, і деякі інші утиліти, а не те, що всі комунальні послуги роблять.
cat
також буде читати зі свого стандартного входу, якщо йому надано операнд -
. Знову ж таки, це особливе лише для cat
деяких інших утиліт (тобто нічого, що робить оболонка ). Для використання cat
у файлі в поточному каталозі, ім'я якого - -
, додайте шлях до імені файлу, наприклад ./-
.
¹ Порядок переадресацій все ще важливий за певних обставин; З cat <file2 >file1
, наприклад, file1
НЕ буде обрізано , якщо file2
недоступний (в перепризначення обробляються зліва направо). Однак відносне розміщення слова cat
все ще довільне і на це не вплине.
² Див. Також питання " кішка дає різні помилки під час відкриття неіснуючого файлу ".
Справа в тому, що оболонка встановлює перенаправлення перед тим, як навіть виконати команду в командному рядку, тому такі речі не вдається, і ви закінчуєтесь порожнім вихідним файлом:
$ sort file >file
Тут оболонка буде усікати (порожній) файл file
перед виконанням sort file
та підключенням sort
стандартного виводу до файлу. Потім sort
утиліта відкриє file
і сортуватиме її вміст (що нічого). Результат (нічого) передається через стандартний вихідний потік до file
.
Засіб у цьому конкретному випадку (для сортування файлу "на місці") є
$ sort -o file file
або
$ sort file >file.sorted && mv file.sorted file
що є більш-менш тим, sort
що використовується при використанні -o
файла для визначення імені вихідного файлу.
Просто для резервного копіювання твердження про те, що перенаправлення можуть передувати фактичній назві утиліти в командному рядку:
"Проста команда" - це послідовність необов'язкових присвоювань змінних та перенаправлень у будь-якій послідовності, необов'язково слідуючи за словами та перенаправленнями, завершеними оператором управління. [ref: Мова командної оболонки POSIX 2.9.1 Прості команди]
А також про перенаправлення, що не входить до операндів утиліти:
Необов'язковий номер, оператор переадресації та слово не повинні відображатися в аргументах, наданих команді, яка виконується (якщо така є). [ref: POSIX Shell Command Language 2.7 Перенаправлення]