Перенаправлення введення виводу Linux. Перенаправлення введення-виведення

Хоча зазвичай, як було сказано, введення/виведення програми пов'язані зі стандартними потоками, в оболонці існують спеціальні засоби для перенаправлення введення/виведення.

5.5.1 Оператори >,< и >>

Для позначення перенаправлення використовуються символи " > ", "< "і" >> Найчастіше використовується перенаправлення виведення команди у файл. Ось відповідний приклад:

$ ls -l > /home/jim/dir.txt

За цією командою у файлі /home/jim/dir.txt буде збережено перелік файлів та підкаталогів того каталогу, який був поточним на момент виконання команди ls; при цьому якщо зазначеного файлу не існувало, він буде створений; якщо він існував, то буде перезаписано; якщо ж ви хочете, щоб виведення команди було дописано в кінець існуючого файлу, треба замість символу > використовувати >> . При цьому наявність пробілів до або після символів > або >> несуттєво і служить лише зручності користувача.

Ви можете направити висновок не лише у файл, а й на вхід іншої команди або пристрою (наприклад, принтер). Так, для підрахунку числа слів у файлі /home/jim/report.txt можна використати таку команду:

$ cat /home/jim/report.txt > wc -w

а для виведення файлу на друк - команду:

$ cat /home/jim/report.txt > lpr

Як бачите, оператор > служить для перенаправлення вихідного потоку. По відношенню до вхідного потоку аналогічну функцію виконує оператор < . Наведений вище приклад команди для підрахунку числа слів у певному файлі можна переписати так (зверніть увагу на відсутність команди cat):

$ wc -w< /home/jim/report.txt

Цей варіант перенаправлення часто використовується в різних скриптах, стосовно тих команд, які зазвичай сприймають введення (або очікують введення) з клавіатури. У скрипті, що автоматизує якісь рутинні операції, можна дати команді необхідну інформацію з файлу, в який заздалегідь записано те, що потрібно ввести для виконання цієї команди.

Через те, що символи < , > і >> діють на стандартні потоки, їх можна використовувати не тільки тим звичним чином, як це робиться зазвичай, а й дещо по-іншому. Так, наступні команди еквівалентні:

$ cat > file

$cat>file

$ >file cat

$ > file cat

Однак сам по собі (без будь-якої команди, для якої визначено стандартні потоки) символ перенаправлення не може використовуватися, так що не можна, наприклад, ввівши в командному рядку

$file1 > file2

отримати копію якогось файлу. Але це не зменшує значення цього механізму, адже стандартні потоки визначені для будь-якої команди. У цьому перенаправити можна як стандартне введення і виведення, а й інші потоки. Для цього треба вказати номер перенаправленого потоку перед символом перенаправлення. Стандартне введення stdin має номер 0, стандартне виведення stdout — номер 1, стандартний потік повідомлень про помилки stderr — номер 2. Тобто повний формат команди перенаправлення має вигляд (нагадаємо, що пробіли біля > не обов'язкові):

command N > M

де Nі M- Номери стандартних потоків (0,1,2) або імена файлів. Вживання у деяких випадках символів < , > і >> без вказівки номера каналу або імені файлу можливо лише тому, що замість відсутнього номера за замовчуванням підставляється 1, тобто стандартний висновок. Так, оператор > без зазначення номера інтерпретується як 1 > .

Крім простого перенаправлення стандартних потоків, існує ще можливість не просто перенаправити потік у той чи інший канал, а зробити копію вмісту стандартного потоку. Для цього є спеціальний символ & , який ставиться перед номером каналу, на який перенаправляється потік:

command N > &M

Така команда означає, що вихід каналу з номером Nспрямовується як на стандартний висновок, так і дублюється в канал із номером M. Наприклад, щоб повідомлення про помилки дублювалися на стандартний висновок, треба дати команду 2>&1, в той час як 1>&2 дублює stdout у stderr. Така можливість особливо корисна при перенаправленні виведення на файл, оскільки ми тоді одночасно бачимо повідомлення на екрані, і зберігаємо їх у файлі.

5.5.2 Оператор |

Особливим варіантом перенаправлення виведення є організація програмного каналу (іноді називає трубопроводом чи конвеєром). Для цього дві або кілька команд, таких, що виведення попередньої служить введенням для наступної, з'єднуються (або поділяються, якщо вам це більше подобається) символом вертикальної межі - "|". При цьому стандартний вихідний потік команди, розташованої зліва від символу | , спрямовується на стандартне введення програми, розташованої праворуч від символу | . Наприклад:

$cat myfile | grep Linux | wc -l

Цей рядок означає, що виведення команди cat, тобто текст із файлу myfile, буде спрямований на вхід команди grep, яка виділить лише рядки, що містять слово "Linux". Виведення команди grepбуде, у свою чергу, спрямований на вхід команди wc -l, яка підрахує кількість таких рядків.

Програмні канали використовуються для того, щоб скомбінувати декілька маленьких програм, кожна з яких виконує лише певні перетворення над своїм вхідним потоком, для створення узагальненої команди, результатом якої буде якесь складніше перетворення.

Слід зазначити, що оболонка одночасно викликає виконання всі команди, включені в конвеєр, запускаючи кожної з команд окремий екземпляр оболонки, отже як перша програма починає щось видавати у свій вихідний потік, наступна команда починає його обробляти. Так само кожна наступна команда виконує свою операцію, чекаючи даних від попередньої команди і видаючи свої результати на вхід наступної. Якщо ви бажаєте, щоб якась команда повністю завершилася до початку виконання наступної, ви можете використовувати в одному рядку як символ конвеєра | , так і крапку з комою ; . Перед кожною точкою з комою оболонка зупинятиметься і чекатиме, поки завершиться виконання всіх попередніх команд, включених до конвеєра.

Статус виходу (логічне значення, що повертається після завершення роботи програми) з каналу, збігається зі статусом виходу, що повертається останньою командою конвеєра. Перед першою командою конвеєра можна встановити символ "!", тоді статус виходу з конвеєра буде логічним запереченням статусу виходу з останньої команди. Оболонка очікує завершення всіх команд конвеєра, перш ніж встановити значення, що повертається.

5.5.3 Фільтри

Останній із наведених вище прикладів (з командою grep) можна використовувати для ілюстрації ще одного важливого поняття, а саме програми-фільтра. Фільтри - це команди (або програми), які сприймають вхідний потік даних, роблять над ним деякі перетворення та видають результат на стандартний висновок (звідки його можна перенаправити ще кудись за бажанням користувача). До команд-фільтрів відносяться вже згадувані вище команди cat, more, less, wc, cmp, diff, і наступні команди.

Таблиця 5.1.Команди-фільтри

Команда

Короткий опис

grep, fgrep, egrep

Шукають у вхідному файлі або даних зі стандартного введення рядка, що містять вказаний шаблон, і видають їх на стандартний висновок

Замінює у вхідному потоці всі символи, що перебувають у заданому переліку, на відповідні символи з другого заданого переліку

comm

Порівнює два файли по рядках і видає на стандартний висновок 3 колонки: в одному - рядки, які зустрічаються тільки в 1 файлі, в другому - рядки, які зустрічаються тільки в 2-му файлі: і в третьому - рядки, що є в обох файлах

Форматує для друку текстовий файл або вміст стандартного введення

sed

Рядковий редактор, який використовується для виконання деяких перетворень над вхідним потоком даних (береться з файлу або зі стандартного введення)

Особливим фільтром є команда tee, Що "роздвоює" вхідний потік, з одного боку направляючи його на стандартний висновок, а з іншого - у файл (ім'я якого ви повинні задати). Легко бачити, що за своєю дією команда teeаналогічна оператору перенаправлення 1>&file.

Можливості фільтрів можна істотно розширити за рахунок використання регулярних виразів, що дозволяють організувати, наприклад, пошук за різними, часто дуже складними шаблонами.

Про перенаправлення та фільтри можна було б говорити дуже багато. Але цей матеріал є у більшості книг з UNIX і Linux, наприклад, у Петерсена [П1.4] і Келлі-Бутла [П1.8] . Тому обмежимося сказаним і перейдемо до розгляду так званого середовища або оточення, створюваного оболонкою.

В. Костромін (kos at rus-linux dot net) – 5.5. Перенаправлення вводу/виводу, канали та фільтри

Ви вже знайомі з двома методами роботи з тим, що виводять сценарії командного рядка:

  • Відображення даних, що відображаються на екрані.
  • Перенаправлення виводу у файл.
Іноді щось треба показати на екрані, а щось – записати у файл, тому потрібно розібратися з тим, як у Linux обробляється введення та висновок, а значить – навчитися відправляти результати роботи сценаріїв туди, куди потрібно. Почнемо з розмови про стандартні дескриптори файлів.

Стандартні дескриптори файлів

Все в Linux - це файли, у тому числі - введення та виведення. Операційна система ідентифікує файли за допомогою дескрипторів.

Кожному процесу можна мати до дев'яти відкритих дескрипторів файлів. Оболонка bash резервує перші три дескриптори з ідентифікаторами 0, 1 та 2. Ось що вони означають.

  • 0, STDIN - стандартний потік введення.
  • 1, STDOUT - стандартний потік виведення.
  • 2, STDERR - стандартний потік помилок.
Ці три спеціальні дескриптори обробляють введення та виведення даних у сценарії.
Вам потрібно добре розібратися в стандартних потоках. Їх можна порівняти з фундаментом, на якому будується взаємодія скриптів із зовнішнім світом. Розглянемо подробиці про них.

STDIN

STDIN – це стандартний потік введення оболонки. Для терміналу стандартне введення - це клавіатура. Коли сценарії використовують символ перенаправлення введення -< , Linux заменяет дескриптор файла стандартного ввода на тот, который указан в команде. Система читает файл и обрабатывает данные так, будто они введены с клавиатуры.

Багато команд bash приймають введення з STDIN , якщо командний рядок не вказаний файл, з якого треба брати дані. Наприклад, це справедливо для команди cat.

Коли ви вводите команду cat у командному рядку, не задаючи параметрів, вона приймає введення зі STDIN . Після того, як ви вводите черговий рядок, просто виводить її на екран.

STDOUT

STDOUT – стандартний потік виведення оболонки. За замовчуванням це екран. Більшість bash-команд виводять дані в STDOUT, що призводить до появи в консолі. Дані можна перенаправити в файл, приєднуючи їх до вмісту, для цього служить команда >> .

Отже, у нас є файл з даними, до якого ми можемо додати інші дані за допомогою цієї команди:

Pwd >> myfile
Те, що виведе pwd , буде додано до файлу myfile , причому дані нікуди не подінуться.

Перенаправлення виведення команди у файл

Поки що все добре, але якщо спробувати виконати щось на зразок показаного нижче, звернувшись до неіснуючого файлу xfile , замислюючи все це для того, щоб у файл myfile потрапило повідомлення про помилку.

Ls -l xfile > myfile
Після виконання цієї команди ми побачимо повідомлення про помилки на екрані.


Спроба звернення до неіснуючого файлу

При спробі звернення до неіснуючого файлу генерується помилка, але оболонка не перенаправила повідомлення про помилки файл, вивівши їх на екран. Але ми хотіли, щоб повідомлення про помилки потрапили до файлу. Що робити? Відповідь проста - скористатися третім стандартним дескриптором.

STDERR

STDERR є стандартним потоком помилок оболонки. За замовчуванням цей дескриптор вказує на те саме, на що вказує STDOUT, тому при виникненні помилки ми бачимо повідомлення на екрані.

Отже, припустимо, що треба перенаправити повідомлення про помилки, скажімо, в лог-файл, або ще кудись, замість того, щоб виводити їх на екран.

▍ Перенаправлення потоку помилок

Як ви вже знаєте, дескриптор STDERR - 2. Ми можемо перенаправити помилки, розмістивши цей дескриптор перед командою перенаправлення:

Ls -l xfile 2>myfile cat ./myfile
Повідомлення про помилку тепер потрапить у файл myfile.


Перенаправлення повідомлення про помилку у файл

▍ Перенаправлення потоків помилок та виводу

При написанні сценаріїв командного рядка може виникнути ситуація, коли потрібно організувати і перенаправлення повідомлень про помилки, і перенаправлення стандартного виводу. Для того, щоб цього досягти, потрібно використовувати команди перенаправлення для відповідних дескрипторів із зазначенням файлів, куди повинні потрапляти помилки та стандартний висновок:

Ls –l myfile xfile anotherfile 2> errorcontent 1> correctcontent

Перенаправлення помилок та стандартного виведення

Оболонка перенаправить те, що команда ls зазвичай відправляє в STDOUT у файл коректного вмісту завдяки конструкції 1> . Повідомлення про помилки, які потрапили б у STDERR, виявляються у файлі errorcontent з-за команди перенаправлення 2> .

Якщо треба, і STDERR , і STDOUT можна перенаправити в той самий файл, скориставшись командою &> :


Перенаправлення STDERR і STDOUT в один і той же файл

Після виконання команди те, що призначено для STDERR і STDOUT, виявляється у файлі content.

Перенаправлення виведення у скриптах

Існує два методи перенаправлення виведення у сценаріях командного рядка:
  • Тимчасове перенаправлення або перенаправлення виводу одного рядка.
  • Постійне перенаправлення, або перенаправлення всього виводу в скрипті або в його частині.

▍Тимчасове перенаправлення виводу

У скрипті можна перенаправити виведення окремого рядка STDERR . Для того щоб це зробити, достатньо використовувати команду перенаправлення, вказавши дескриптор STDERR , при цьому перед номером дескриптора треба поставити символ амперсанда (&):

#!/bin/bash echo "Ця помилка" >&2 echo "Ця помилка"
Якщо запустити скрипт, обидва рядки потраплять на екран, оскільки, як ви вже знаєте, помилки виводяться туди ж, куди і звичайні дані.


Тимчасовий перенапрямок

Запустимо скрипт так, щоб виведення STDERR потрапляло у файл.

./myscript 2> myfile
Як видно, тепер звичайний висновок робиться в консоль, а повідомлення про помилки потрапляють у файл.


Повідомлення про помилки записуються у файл

▍Постійне перенаправлення виводу

Якщо в скрипті потрібно перенаправляти багато даних, що виводяться на екран, додавати відповідну команду до кожного виклику echo незручно. Натомість можна задати перенаправлення виведення в певний дескриптор на час виконання скрипту, скориставшись командою exec:

#!/bin/bash exec 1>outfile echo "Тим є test redirecting all output" echo "від shell script до іншого файлу." echo "без будь-якої реdirect every line"
Запустимо скрипт.


Перенаправлення всього виводу на файл

Якщо переглянути файл, вказаний у команді перенаправлення виводу, виявиться, що все, що виводилося командами echo, потрапило до файлу.

Команду exec можна використовувати не лише на початку скрипту, а й в інших місцях:

#!/bin/bash exec 2>myerror echo "Тим є start of the script" echo "завжди redirecting all output to another location" exec 1>myfile echo "Цей слід йти до файлу myfile" echo "and this should go to the myerror file" >&2
Ось що вийде після запуску скрипту та перегляду файлів, у які ми перенаправляли висновок.


Перенаправлення виведення в різні файли

Спочатку команда exec задає перенаправлення виведення зі STDERR у файл myerror. Потім виведення кількох команд echo відправляється у STDOUT і виводиться на екран. Після цього команда exec задає відправку того, що потрапляє в STDOUT , файл myfile , і, нарешті, ми користуємося командою перенаправлення в STDERR в команді echo , що призводить до запису відповідного рядка файл myerror.

Освоївши це, ви зможете перенаправляти висновок туди, куди потрібно. Тепер поговоримо про перенаправлення введення.

Перенаправлення введення у скриптах

Для перенаправлення введення можна скористатися тією ж методикою, що ми застосовували для перенаправлення виведення. Наприклад, команда exec дозволяє зробити джерелом даних для STDIN якийсь файл:

Exec 0< myfile
Ця команда вказує оболонці те що, що джерелом введених даних має стати файл myfile , а чи не звичайний STDIN . Подивимося на перенаправлення введення в дію:

#!/bin/bash exec 0< testfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done
Ось що з'явиться після запуску скрипта.


Перенаправлення введення

В одному з попередніх матеріалів ви дізналися про те, як використовувати команду read для читання даних, які користувач вводить з клавіатури. Якщо перенаправити введення, зробивши джерелом даних файл, то команда read при спробі прочитати дані з STDIN буде читати їх з файлу, а не з клавіатури.

Деякі адміністратори Linux використовують цей підхід для читання та подальшої обробки лог-файлів.

Створення власного перенаправлення висновку

Перенаправляючи введення та виведення у сценаріях, ви не обмежені трьома стандартними дескрипторами файлів. Як мовилося раніше, можна мати до дев'яти відкритих дескрипторів. Інші шість, з номерами від 3 до 8, можна використовувати для перенаправлення введення або виведення. Будь-який з них можна призначити файлу та використовувати у коді скрипта.

Призначити дескриптор для виведення даних можна за допомогою команди exec:

#!/bin/bash exec 3>myfile echo "Цей слід відтворити на екрані" echo "і це слід переглянути в файлі" >&3 echo "Інший цей повинен бути на екрані"
Після запуску скрипта частина виводу потрапить на екран, частина - файл з дескриптором 3 .


Перенаправлення виводу, використовуючи власний дескриптор

Створення дескрипторів файлів для введення даних

Перенаправити введення в скрипті можна так само, як і висновок. Збережіть STDIN в іншому дескрипторі, перш ніж перенаправляти введення даних.

Після закінчення читання файлу можна відновити STDIN і користуватися ним як завжди:

#!/bin/bash exec 6<&0 exec 0< myfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done exec 0<&6 read -p "Are you done now? " answer case $answer in y) echo "Goodbye";; n) echo "Sorry, this is the end.";; esac
Випробуємо сценарій.


Перенаправлення введення

У цьому прикладі дескриптор файлу 6 використовувався для зберігання посилання на STDIN. Потім було перенаправлено введення, джерелом даних для STDIN став файл. Після цього вхідні дані команди read надходили з перенаправленого STDIN , тобто з файла.

Після прочитання файлу ми повертаємо STDIN у вихідний стан, перенаправляючи його в дескриптор 6 . Тепер, щоб перевірити, що все працює правильно, скрипт ставить користувачеві питання, чекає введення з клавіатури та обробляє те, що введено.

Закриття дескрипторів файлів

Оболонка автоматично закриває дескриптори файлів після роботи скрипта. Однак, у деяких випадках потрібно закривати дескриптори вручну, перш ніж скрипт закінчить роботу. Щоб закрити дескриптор, його потрібно перенаправити в &- . Виглядає це так:

#!/bin/bash exec 3> myfile echo "Тим є test line of data" >&3 exec 3>&- echo "Цим є">&3
Після виконання скрипту ми отримаємо повідомлення про помилку.


Спроба звернення до закритого дескриптора файлу

Справа в тому, що ми спробували звернутися до неіснуючого дескриптора.

Будьте уважними, закриваючи дескриптори файлів у сценаріях. Якщо ви відправляли дані у файл, потім закрили дескриптор, потім відкрили знову, оболонка замінить існуючий файл новим. Тобто все те, що було записано в цей файл, буде втрачено.

Отримання відомостей про відкритих дескрипторів

Для того, щоб отримати список всіх відкритих у Linux дескрипторів, можна скористатися командою lsof. У багатьох дистрибутивах, як Fedora, утиліта lsof знаходиться в /usr/sbin . Ця команда дуже корисна, тому що вона виводить відомості про кожного дескриптора, відкритого в системі. Сюди входить і те, що відкрили процеси, що їх виконують у фоні, і те, що відкрито користувачами, що увійшли до системи.

Ця команда має безліч ключів, розглянемо найважливіші.

  • -p Дозволяє вказати ID процесу.
  • -d Дозволяє вказати номер дескриптора, про який потрібно отримати відомості.
Щоб дізнатися PID поточного процесу, можна використовувати спеціальну змінну оточення $$ , у якому оболонка записує поточний PID .

Ключ -a використовується для виконання операції логічного І над результатами, повернутими завдяки використанню двох інших ключів:

Lsof -a -p $$ -d 0,1,2

Висновок відомостей про відкритих дескрипторів

Тип файлів, пов'язаних з STDIN, STDOUT та STDERR - CHR (character mode, символьний режим). Оскільки вони вказують на термінал, ім'я файлу відповідає імені пристрою, призначеного терміналу. Всі три стандартні файли доступні і для читання, і для запису.

Подивимося на виклик команди lsof зі скрипту, в якому відкриті, на додаток до стандартних, інші дескриптори:

#!/bin/bash exec 3> myfile1 exec 6> myfile2 exec 7< myfile3 lsof -a -p $$ -d 0,1,2,3,6,7
Ось що вийде, якщо цей сценарій запустити.


Перегляд дескрипторів файлів, відкритих скриптом

Скрипт відкрив два дескриптори для виведення (3 та 6) і один – для введення (7). Тут же показані шляхи до файлів, використаних для налаштування дескрипторів.

Придушення висновку

Іноді треба зробити так, щоб команди у скрипті, який, наприклад, може виконуватися як фоновий процес, нічого не виводили на екран. Для цього можна перенаправити висновок /dev/null . Це щось на кшталт «чорної дірки».

Ось, наприклад, як придушити висновок повідомлень про помилки:

Ls -al badfile anotherfile 2> /dev/null
Той самий підхід використовується, якщо, наприклад, треба очистити файл, не видаляючи його:

Cat /dev/null > myfile

Підсумки

Сьогодні ви дізналися про те, як у сценаріях командного рядка працюють введення та виведення. Тепер ви вмієте поводитися з дескрипторами файлів, створювати, переглядати та закривати їх, знаєте про перенаправлення потоків введення, виведення та помилок. Все це дуже важливо для розробки bash-скриптів.

Наступного разу поговоримо про сигнали Linux, про те, як обробляти їх у сценаріях, про запуск завдань за розкладом та про фонові завдання.

Шановні читачі! У цьому матеріалі дано основи роботи з потоками введення, виведення та помилок. Упевнені, серед вас є професіонали, які можуть розповісти про все це те, що приходить лише з досвідом. Якщо так – передаємо слово вам.

Для того, щоб записати дані в файлабо прочитати їх звідти, процесу необхідно спочатку відкрити цей файл (при відкритті на запис, можливо, доведеться створити його). При цьому процес отримує дескриптор(описувач) відкритого файлу - унікальне для цього процесу число, яке він буде використовувати у всіх операціях запису. Перший відкритий файл отримає дескриптор, другий – 1 і так далі. Закінчивши роботу з файлом, процес закриваєйого при цьому дескриптор звільняється і може бути використаний повторно. Якщо процес завершується, не закривши файли, це робить система. Строго кажучи, тільки в операції відкриття дескриптора вказується, який файл буде використовуватися. Як "файл" використовуються і звичайні файли, і файли-дірки (найчастіше - термінали), і канали, описані в розділі Pipeline. Конвеєр. Подальші операції - читання, запис та закриття, працюють з дескриптором, як з потоком даних, А куди саме веде цей потік, не має значення.

Кожен процес Linux отримує при старті три"файлу", відкритих для нього системою. Перший з них (дескриптор) відкрито читання, це стандартне введенняпроцесу. Саме зі стандартним введенням працюють усі операції читання, якщо в них не вказано дескриптор файлу. Другий (дескриптор 1) – відкритий на запис, це стандартний висновокпроцесу. З ним працюють усі операції запису, якщо дескриптор файлу не зазначений у них явно. Нарешті, третій потік даних (дескриптор 2) призначається виведення діагностичних повідомлень, він називається стандартне виведення помилок. Оскільки ці три дескриптори вже відкриті на момент запуску процесу, перший файл, відкритий самим процесом, швидше за все, матиме дескриптор 3 .

Дескриптор Описувач потоку даних, відкритий процесом. Дескриптори нумеруються починаючи з. При відкритті нового потоку даних його дескриптор отримує найменший номерів, що не використовуються в цей момент. Три заздалегідь відкритих дескриптори: стандартне введення (), стандартний висновок(1) та стандартне виведення помилок(2) процесу видаються під час запуску.

Механізм копіювання оточення, описаний у лекції , передбачає, серед іншого, копіювання всіх відкритих дескрипторів батьківського процесу дочірньому. В результаті, і батьківський, і дочірній процес мають під однаковими дескрипторами одні й самі потоки даних. Коли запускається стартовий командний інтерпретатор, всі три заздалегідь відкритих дескриптори пов'язані у нього з терміналом(точніше, з відповідним файлом-діркою типу tty): користувач вводить команди з клавіатури та бачить повідомлення на екрані. Отже, будь-яка команда, яка запускається з командної оболонки, виводитиме на той же термінал, а будь-яка команда, запущена інтерактивно(Не в фоні) - вводити звідти.

Стандартний висновок

Мефодій вже стикався з тим, що деякі програми вміють виводити не тільки на термінал, а й у файл, наприклад, info при вказівці параметричного ключа" -o " з ім'ям файлу виведе текст посібника до файлу, замість відображати його на моніторі. Навіть якщо розробниками програми не передбачений такий ключ, Мефодію відомий і інший спосіб зберегти виведення програми у файлі замість того, щоб виводити його на монітор: поставити знак ">" і вказати ім'я файлу. Таким чином, Мефодій вже створював короткі текстові файли (сценарії) за допомогою утиліти cat (див. лекцію Доступ процесів до файлів і каталогів).

$ cat > textfile Це файл для прикладів. ^D $ ls -l textfile -rw-r--r-- 1 methody methody 23 Лис 15 16:06 textfile

Приклад 2. Перенаправлення стандартного виведення на файл

Від використання символу ">" можливості самої утиліти cat, звичайно, не розширилися. Більш того, cat у цьому прикладі не отримала від командної оболонкиніяких параметрів: ні знака ">", ні наступного імені файлу. У цьому випадку cat працювала як завжди, не знаючи (і навіть не цікавлячись!), куди потраплять виведені дані: на екран монітора, у файл або ще кудись. Замість самої забезпечувати доставку виведення до кінцевого адресата (чи то людина чи файл), cat відправляє всі дані на стандартний висновок(скорочено – stdout).

Підміна стандартного висновку – завдання командної оболонки (shell). У цьому прикладі shell створює порожній файл, ім'я якого вказано після знака «>», і дескриптор цього файлу передається програмі cat під номером 1 ( стандартний висновок). Робиться це дуже просто. У лекції Доступ процесів до файлів і каталогів було розказано, як запускаються команди з оболонки. Зокрема, після виконання fork() з'являється два однакові процеси, один з яких - дочірній - повинен запустити замість себе команду (виконати exec()). Так ось, перед цим він закриваєстандартний висновок (дескриптор 1 звільняється) та відкриваєфайл (з ним зв'язується першийвільний дескриптор, т. е. 1), а команді, що запускається, нічого знати і не треба: її стандартний висновок вже підмінений. Ця операція називається перенапрямкомстандартного виводу. Якщо файл вже існує, shell запише його заново, повністю знищивши все, що в ньому містилося до цього. Тому Мефодію, щоб продовжити записувати дані в textfile, буде потрібна інша операція - «>>».

$ cat >> textfile Приклад 1. ^D $ cat textfile Це файл для прикладів. Приклад 1. $

Приклад 3. Недеструктивне перенаправлення стандартного висновку

Мефодій отримав саме той результат, який йому був потрібний: додав у кінець вже існуючого файлу дані зі стандартного виведення чергової команди.

Стандартний висновок Потік даних, який відкривається системою для кожного процесу в момент його запуску, і призначений для даних, що виводяться процесом.

Стандартне введення

Аналогічно для передачі даних на вхід програмі може бути використаний стандартне введення(скорочено – stdin). При роботі з командним рядком стандартне введення – це символи, що вводяться користувачем з клавіатури. Стандартне введення можна перенаправити за допомогою командної оболонки, подавши на нього дані з файлу. Символ «< » служит для перенаправления содержимого файла на стандартный ввод программе. Например, если вызвать утилиту sort без параметра, она будет читать строки со стандартного ввода. Команда « sort < имя_файла» подасть на введення sort дані файлу.

$ sort< textfile Пример 1. Это файл для примеров. $

Приклад 4. Перенаправлення стандартного введення з файлу

Результат дії цієї команди абсолютно аналогічний команді sort textfile , різниця в тому, що коли використовується< », sort получает данные со стандартного ввода, ничего не зная о файле « textfile », откуда они поступают. Механизм работы shell в данном случае тот же, что и при перенаправлении вывода: shell читает данные из файла « textfile », запускает утилиту sort и передаёт ей на стандартный ввод содержимое файла.

Варто пам'ятати, що операція деструктивна: вона завжди створює файл нульової довжини Тому для, припустимо, сортування даних у файлітреба застосовувати послідовно sort < файл >новий_файлта mv новий_файл файл. Команда виду команда< файл >той_же_файлпросто уріже його до нульової довжини!

Стандартне введення Потік даних, який відкривається системою для кожного процесу в момент його запуску, і призначений для введення даних.

Стандартне виведення помилок

Як перший приклад і вправи на перенаправлення Мефодій вирішив записати посібник з cat у свій файл cat.info:

$ info cat > cat.info info: Запис ноди (coreutils.info.bz2) cat invocation... info: Завершено. $ head -1 cat.info File: coreutils.info, Номер: cat invocation, Next: tac invocation, Up: Output of entire files $

Приклад 5. Стандартне виведення помилок

Здивований Мефодій виявив, що попри його вказівку відправлятися у файл два рядки, виведені командою info, все одно проникли на термінал. Очевидно, ці рядки не потрапили на стандартний висновоктому, що не належать безпосередньо до посібника, яке має вивести програма, вони інформують користувача про хід виконання роботи: запис керівництва у файл. Для такого роду діагностичних повідомлень, а також для повідомлень про помилки, що виникли під час виконання програми, в Linux передбачено стандартне виведення помилок(скорочено – stderr).

Стандартне виведення помилок Потік даних, що відкривається системою для кожного процесу в момент його запуску, і призначений для діагностичних повідомлень, що виводяться процесом.

Використання стандартного виведення помилок поряд зі стандартним висновком дозволяє відокремити власне результат роботи програми від різноманітної інформації, що супроводжує, наприклад, направивши їх в різні файли. Стандартне виведення помилок може бути перенаправлене так само, як і стандартне введення/виведення, для цього використовується комбінація символів «2».

$ info cat > cat.info 2> cat.stderr $ cat cat.stderr info: Запис ноди (coreutils.info.bz2) cat invocation... info: Завершено. $

Приклад 6. Перенаправлення стандартного виведення помилок

Цього разу на термінал вже нічого не потрапило, стандартний висновок відправився у файл cat.info, стандартний висновок помилок – у cat.stderr. Замість «>» та «2» Мефодій міг би написати «1>» та «2>». Цифри в даному випадку позначають номери дескрипторів відкриваютьсяфайлів. Якщо якась утиліта очікує отримати відкритийдескриптор з номером, допустимо, 4 , то щоб її запустити обов'язковопотрібно використовувати поєднання «4».

Іноді, однак, потрібно об'єднати стандартний висновок і видавати помилку в одному файлі, а не розділяти їх. У командній оболонці bash для цього є спеціальна послідовність "2> & 1". Це означає «направити стандартний висновок помилок туди, куди і стандартний висновок»:

$ info cat > cat.info 2>&1 $ head -3 cat.info info: Запис ноди (coreutils.info.bz2)cat invocation... info: Завершено. File: coreutils.info, Node: cat invocation, Next: tac invocation, Up: Output of entire files $

Приклад 7. Об'єднання стандартного виводу та стандартного виведення помилок

У цьому прикладі важливим є порядок перенаправлень: у командному рядку Мефодій спочатку вказав, куди перенаправити стандартний висновок («>cat.info») і тільки потім наказав направити туди ж стандартний висновок помилок. Зроби він навпаки («2>&1 > cat.info»), результат вийшов би несподіваний: у файл потрапив би лише стандартний висновок, а діагностичні повідомлення з'явилися б на терміналі. Однак логіка тут залізна: на момент виконання операції "2>&1" стандартний висновок був пов'язаний з терміналом, отже, післяїї виконання стандартний висновок помилок теж пов'язані з терміналом. А наступне перенаправлення стандартного виведення на файл, звичайно, ніяк не позначиться на стандартному виведенні помилок. Номер у конструкції «&номер» - це номер відкритогодескриптора. Якби згадана вище утиліта, що записує в четвертий дескриптор, була написана на shell, у ній використовувалися б перенаправлення виду « >&4 ». Щоб не набирати громіздку конструкцію "> файл 2>&1" в bash використовуються скорочення: "&> файл" або, що те ж саме, ">& файл".

Перенаправлення в нікуди

Іноді відомо, що якісь дані, виведені програмою, не знадобляться. Наприклад, попередження зі стандартного виведення помилок. У цьому випадку можна перенаправити стандартне виведення помилок у файл-діркуспеціально призначений для знищення даних - /dev/null . Все, що записується в цей файл, просто буде викинуто і ніде не збережеться.

$info cat > cat.info 2> /dev/null $

Приклад 8. Перенаправлення в /dev/null

Так само можна позбутися і стандартного висновку, відправивши його в /dev/null .

Вбудовані можливості перенаправлення в Linux надають вам широкий набір інструментів, які використовуються для спрощення всіх видів завдань. Вміння керувати різними потоками вводу-виводу значно збільшить продуктивність, як при розробці складного програмного забезпечення, так і при керуванні файлами за допомогою командного рядка.

Потоки введення-виводу

Введення та виведення в оточенні Linux розподіляється між трьома потоками:

  • Стандартне введення (standard input, stdin, потік номер 0)
  • Стандартний висновок (standard output, stdout, номер 1)
  • Стандартна помилка або потік діагностики (standard error, stderr, номер 2)

При взаємодії користувача з терміналом стандартне введення передається через клавіатуру користувача. Стандартний висновок та стандартна помилка відображаються на терміналі користувача у вигляді тексту. Всі ці три потоки називають стандартними потоками.

Стандартне введення

Стандартний вхідний потік зазвичай передає дані користувача до програми. Програми, які передбачають стандартне введення, зазвичай отримують вхідні дані від пристрою (наприклад, клавіатури). Стандартне введення припиняється після досягнення EOF (end-of-file, кінець файлу). EOF вказує на те, що більше даних для читання немає.

Щоб побачити, як працює стандартне введення, запустіть програму cat. Назва цього інструменту означає "concatenate" (пов'язати або об'єднати будь-що). Зазвичай цей інструмент використовується для об'єднання двох файлів. При запуску без аргументів cat відкриває командний рядок та приймає зміст стандартного введення.

Тепер введіть кілька цифр:

1
2
3
ctrl-d

Вводячи цифру та натискаючи enter, ви відправляєте стандартне введення запущеної програми cat, яка приймає ці дані. У свою чергу, програма cat відображає отримане введення у стандартному виведенні.

Користувач може встановити EOF, натиснувши ctrl-d, після чого програма cat зупиниться.

Стандартний висновок

Стандартний висновок записує дані, згенеровані програмою. Якщо стандартний вихідний потік був перенаправлений, він виведе текст до терміналу. Спробуйте запустити наступну команду для прикладу:

echo Sent to the terminal through standard output

Команда echo без додаткових опцій відображає на екрані всі аргументи, передані їй у командному рядку.

Тепер запустіть echo без аргументів:

Команда поверне порожній рядок.

Стандартна помилка

Цей стандартний потік записує помилки, створювані програмою, що вийшла з ладу. Як і стандартний висновок, цей потік надсилає дані в термінал.

Розглянемо приклад потоку помилок команди ls. Команда ls відображає вміст каталогів.

Без аргументів, ця команда повертає вміст поточного каталогу. Якщо вказати як аргумент ls ім'я каталогу, команда поверне його вміст.

Оскільки каталог % не існує, команда поверне стандартну помилку:

ls: cannot access %: Немає такого файлу або directory

Перенаправлення потоків

Linux надає спеціальні команди для перенаправлення кожного потоку. Ці команди записують стандартний вивід у файл. Якщо висновок перенаправлений у неіснуючий файл, команда створить новий файл з таким ім'ям і збереже перенаправлений висновок.

Команди з однією кутовою дужкою переписують існуючий контент цільового файлу:

  • > - стандартний висновок
  • < — стандартный ввод
  • 2> - стандартна помилка

Команди з подвійними кутовими дужками не переписують вміст цільового файлу:

  • >> - стандартний висновок
  • << — стандартный ввод
  • 2>> - стандартна помилка

Розглянемо наступний приклад:

cat > write_to_me.txt
a
b
c
ctrl-d

У цьому прикладі команда cat використовується для запису вихідних даних файлу.

Перегляньте вміст write_to_me.txt:

cat write_to_me.txt

Команда має повернути:

Знову перенаправте cat у файл write_to_me.txt і введіть три цифри.

cat > write_to_me.txt
1
2
3
ctrl-d

Тепер перевірте вміст файлу.

cat write_to_me.txt

Команда має повернути:

Як бачите, файл містить лише останні вихідні дані, оскільки в команді, яка перенаправляє вихід, використовувалася одна кутова дужка.

Тепер спробуйте запустити ту саму команду з двома кутовими дужками:

cat >> write_to_me.txt
a
b
c
ctrl-d

Відкрийте write_to_me.txt:

1
2
3
a
b
c

Команди з подвійними кутовими дужками не перезаписують існуючий контент, а доповнюють його.

Конвеєри

Конвеєри (pipes) перенаправляють потоки виведення однієї команди на інший вхід. При цьому дані, які передаються другій програмі, не відображаються в терміналі. На екрані дані з'являться лише після обробки другою програмою.

Конвеєри в Linux представлені вертикальною межею.

Наприклад:

Така команда передасть виведення ls (вміст поточного каталогу) програмі less, яка відображає дані, що передаються їй рядково. Як правило, ls виводить вміст каталогів поспіль, не розбиваючи рядки. Якщо перенаправити виведення ls на less, то остання команда розділить висновок на рядки.

Як бачите, конвеєр може перенаправити виведення однієї команди на вхід іншої, на відміну > і >>, які перенаправляють дані лише файли.

Фільтри

Фільтри – це команди, які можуть змінити перенаправлення та виведення конвеєра.

Примітка: Фільтри також є стандартними командами Linux, які можна використовувати без конвеєра.

  • find – шукає файл на ім'я.
  • grep – шукає текст за заданим шаблоном.
  • tee - перенаправляє стандартне введення в стандартний висновок і один або кілька файлів.
  • tr – пошук та заміна рядків.
  • wc – підрахунок символів, рядків та слів.

Приклади перенаправлення введення-виводу

Тепер, коли ви ознайомилися з основними поняттями та механізмами перенаправлення, розглянемо кілька базових прикладів їхнього використання.

команда > файл

Такий шаблон перенаправляє стандартне виведення команди у файл.

ls ~ > root_dir_contents.txt

Ця команда передає вміст root каталогу системи як стандартний висновок і записує висновок у файл root_dir_contents. Це видаляє весь попередній вміст у файлі, оскільки в команді використана одна кутова дужка.

команда > /dev/null

/dev/null – це спеціальний файл (так званий порожній пристрій), який використовується для придушення стандартного потоку виведення або діагностики, щоб уникнути небажаного виведення в консоль. Усі дані, що потрапляють у /dev/null, скидаються. Перенаправлення /dev/null зазвичай використовується в сценаріях оболонки.

ls > /dev/null

Така команда скидає стандартний вихідний потік, що повертається командою ls, передавши його /dev/null.

команда 2 > файл

Цей шаблон перенаправляє стандартний потік помилок команди на файл, перезаписуючи його поточний вміст.

mkdir "" 2> mkdir_log.txt

Ця команда перенаправить помилку, викликану невірним ім'ям каталогу, і запише їх у log.txt. Зверніть увагу: помилка, як і раніше, відображається в терміналі.

команда >> файл

Цей шаблон перенаправляє стандартний вихід команди до файлу, не переписуючи поточний вміст файлу.

echo Written to a new file > data.txt
echo Appended to an existing file"s contents >> data.txt

Ця пара команд спочатку перенаправляє введений користувачем текст новий файл, а потім вставляє його в існуючий файл, не переписуючи його вмісту.

команда 2>>файл

Цей шаблон перенаправляє стандартний потік помилок команди на файл, не перезаписуючи існуючого вмісту файлу. Він підходить для створення логів помилок програми або сервісу, оскільки вміст не буде постійно оновлюватися.

find "" 2> stderr_log.txt
wc "" 2>> stderr_log.txt

Наведена вище команда перенаправляє повідомлення про помилку, викликане невірним аргументом find, файл stderr_log.txt, а потім додає до нього повідомлення про помилку, викликану недійсним аргументом wc.

команда | команда

Цей шаблон перенаправляє стандартний вихід першої команди стандартний вхід другої команди.

find/var lib | grep deb

Ця команда шукає в каталозі /var та його підкаталогах імена файлів та розширення deb та повертає шляхи до файлів, виділяючи шаблон пошуку червоним кольором.

команда | tee файл

Такий шаблон перенаправляє стандартне виведення команди у файл і переписує його вміст, а потім відображає перенаправлений вихід у терміналі. Якщо вказаного файлу немає, він створює новий файл.

У цьому шаблоні команда tee зазвичай використовується для перегляду виведення програми та одночасного збереження його у файл.

wc /etc/magic | tee magic_count.txt

Така команда передає кількість символів, рядків та слів у файлі magic (Linux використовує його для визначення типів файлів) команді tee, яка відправляє ці дані в термінал та файл magic_count.txt.

команда | команда | команда >> файл

Цей шаблон перенаправляє стандартний висновок першої команди і фільтрує її через дві команди, а потім додає остаточний результат у файл.

ls ~ | grep * tar | tr e E >> ls_log.txt

Така команда відправляє висновок ls для каталогу root команді grep. У свою чергу grep шукає в отриманих даних файли tar. Після цього результат grep передається команді tr, яка замінить всі символи е символом Е. Отриманий результат буде додано файл ls_log.txt (якщо такого файлу не існує, команда створить його автоматично).

Висновок

Функції перенаправлення вводу-виводу на Linux спочатку здаються занадто складними. Проте робота з перенапрямком – одна з найважливіших навичок системного адміністратора.

Щоб дізнатися більше про будь-яку команду, використовуйте:

man command | less

Наприклад:

Така команда поверне повний перелік команд для tee.

Tags:
  • Переклад

Якщо ви вже опанували основи терміналу, можливо, ви вже готові до того, щоб комбінувати вивчені команди. Іноді виконання команд оболонки по одній цілком достатньо для вирішення якогось завдання, але в деяких випадках вводити команду за командою занадто стомливо і нераціонально. У подібній ситуації нам знадобляться деякі особливі символи, на зразок кутових дужок.

Для оболонки, інтерпретатора команд Linux, ці додаткові символи – не пуста трата місця на екрані. Вони - потужні команди, які можуть пов'язувати докупи різні фрагменти інформації, розділяти те, що було до цього цілісним, і робити ще багато всього. Одна з найпростіших і водночас потужних і широко використовуваних можливостей оболонки - це перенаправлення стандартних потоків введення/виводу.

Три стандартні потоки введення/виводу

Для того, щоб зрозуміти те, про що ми тут говоритимемо, важливо знати, звідки беруться дані, які можна перенаправляти, і куди вони йдуть. У Linux існує три стандартні потоки введення/виведення даних.

Перший – це стандартний потік введення (standard input). У системі це - потік №0 (оскільки у комп'ютерах рахунок зазвичай починається з нуля). Номери потоків називають дескрипторами. Цей потік є деякою інформацією, що передається в термінал, зокрема - інструкції, передані в оболонку для виконання. Зазвичай дані у цей потік потрапляють під час введення їх користувачем з клавіатури.

Другий потік - це стандартний потік виведення (standard output), йому надано номер 1. Це потік даних, які оболонка виводить після виконання якихось дій. Зазвичай ці дані потрапляють до того ж вікна терміналу, де було введено команду, яка викликала їхню появу.

І, нарешті, третій потік - це стандартний потік помилок (standard error), він має дескриптор 2. Цей потік схожий на стандартний потік виведення, оскільки зазвичай те, що потрапляє, виявляється на екрані терміналу. Однак, він, за своєю суттю, відрізняється від стандартного висновку, як результат, цими потоками, за бажання, можна керувати окремо. Це корисно, наприклад, у такій ситуації. Є команда, яка обробляє великий обсяг даних, виконуючи складну і схильну до помилок операцію. Потрібно, щоб корисні дані, які генерує ця команда, не поєднувалися з повідомленнями про помилки. Реалізується це завдяки окремому перенаправленню потоків виводу та помилок.

Як ви, мабуть, вже здогадалися, перенаправлення вводу/виводу означає роботу з вищеописаними потоками та перенаправлення даних туди, куди потрібно програмісту. Робиться це за допомогою символів > і< в различных комбинациях, применение которых зависит от того, куда, в итоге, должны попасть перенаправляемые данные.

Перенаправлення стандартного потоку виводу

Припустимо, ви хочете створити файл, до якого буде записано поточну дату та час. Справа спрощує те, що є команда, вдало названа date, яка повертає те, що нам потрібно. Зазвичай команди виводять дані у стандартний потік виведення. Щоб ці дані опинилися у файлі, потрібно додати символ > після команди, перед ім'ям цільового файла. До і після потрібно поставити пробіл.

При використанні перенаправлення будь-який файл, вказаний після > буде перезаписано. Якщо у файлі немає нічого цінного і його вміст можна втратити, в нашій конструкції можна використовувати вже існуючий файл. Зазвичай краще використовувати в такому випадку ім'я файлу, якого поки не існує. Цей файл буде створено після виконання команди. Назвемо його date.txt. Розширення файлу після точки зазвичай особливої ​​ролі не відіграє, але розширення допомагають підтримувати порядок. Отже, ось наша команда:

$ date > date.txt
Не можна сказати, що сама по собі ця команда неймовірно корисна, проте, ґрунтуючись на ній, ми вже можемо зробити щось цікавіше. Скажімо, ви хочете дізнатися, як змінюються маршрути вашого трафіку, що йде через інтернет до якоїсь кінцевої точки, щоденно записуючи відповідні дані. У вирішенні цього завдання допоможе команда traceroute , яка повідомляє про маршрут трафіку між нашим комп'ютером і кінцевою точкою, що задається при виклику команди у вигляді URL. Дані включають відомості про всіх маршрутизаторів, через які проходить трафік.

Оскільки файл з датою ми вже маємо, буде цілком виправдано просто приєднати до цього файлу дані, отримані від traceroute . Для того щоб це зробити, треба використовувати два символи > , поставлені один за одним. В результаті нова команда, яка перенаправляє виведення у файл, але не перезаписує його, а додає нові дані після старих, буде виглядати так:

$ traceroute google.com >> date.txt
Тепер нам залишилося лише змінити ім'я файлу на щось більш осмислене, використовуючи команду mv, якою, як перший аргумент, передається вихідне ім'я файлу, а як друге - нове:

$mv date.txt trace1.txt

Перенаправлення стандартного потоку введення

Використовуючи знак< вместо >ми можемо перенаправити стандартне введення, замінивши його вмістом файлу.

Припустимо, є два файли: list1.txt і list2.txt , кожен із яких містить невідсортований список рядків. У кожному списку є унікальні для нього елементи, але деякі з елементів список збігаються. Ми можемо знайти рядки, які є і в першому, і в другому списках, застосувавши команду comm, але перш ніж використовувати її, списки треба відсортувати.

Існує команда sort , яка повертає відсортований список у термінал, не зберігаючи відсортовані дані файл, з якого вони були взяті. Можна надіслати відсортовану версію кожного списку до нового файлу, використовуючи команду > , а потім скористатися командою comm. Однак такий підхід вимагатиме як мінімум двох команд, хоча те ж саме можна зробити в одному рядку, не створюючи при цьому непотрібних файлів.

Отже, ми можемо скористатися командою< для перенаправления отсортированной версии каждого файла команде comm . Вот что у нас получилось:

$ comm<(sort list1.txt) <(sort list2.txt)
Круглі дужки тут мають той самий сенс, що у математиці. Оболонка спочатку обробляє команди у дужках, а потім все інше. У нашому прикладі спочатку проводиться сортування рядків із файлів, а потім те, що вийшло, передається команді comm, яка потім виводить результат порівняння списків.

Перенаправлення стандартного потоку помилок

І, нарешті, поговоримо про перенаправлення стандартного потоку помилок. Це може знадобитися, наприклад, для створення лог-файлів з помилками або об'єднання в одному файлі повідомлень про помилки та повернутих командою даних.

Наприклад, якщо потрібно провести пошук у всій системі відомостей про бездротові інтерфейси, які доступні користувачам, у яких немає прав суперкористувача? Для того щоб це зробити, можна скористатися потужною командою find .

Зазвичай, коли звичайний користувач запускає команду find по всій системі, вона виводить у термінал корисні дані та помилки. При цьому останніх зазвичай більше, ніж перших, що ускладнює знаходження у висновку команди того, що потрібно. Вирішити цю проблему досить просто: достатньо перенаправити стандартний потік помилок у файл, використовуючи команду 2> (нагадаємо, 2 - це дескриптор стандартного потоку помилок). В результаті на екран потрапить тільки те, що команда відправляє стандартний висновок:

$ find / -name wireless 2> denied.txt
Як бути, якщо потрібно зберегти результати команди в окремий файл, не змішуючи ці дані з відомостями про помилки? Так як потоки можна перенаправляти незалежно один від одного, в кінець нашої конструкції можна додати команду перенаправлення стандартного виводу потоку в файл:

$ find / -name wireless 2> denied.txt > found.txt
Перша кутова дужка йде з номером - 2> , а друга без нього. Це тому, що стандартний висновок має дескриптор 1, і команда > має на увазі перенаправлення стандартного виведення, якщо номер дескриптора не вказано.

І, нарешті, якщо потрібно, щоб все, що виведе команда, потрапило в один файл, можна перенаправити обидва потоки в те саме місце, скориставшись командою &> :

$ find / -name wireless &> results.txt

Підсумки

Тут ми розібрали лише основи механізму перенаправлення потоків в інтерпретаторі командного рядка Linux, проте навіть те, що ви сьогодні дізналися, дає вам практично необмежені можливості. І, до речі, як і решта, що стосується роботи в терміналі, освоєння перенаправлення потоків вимагає практики. Тому рекомендуємо вам приступити до власних експериментів з > і< .

Шановні читачі! Чи знаєте ви цікаві приклади використання перенаправлення потоків у Linux, які допоможуть новачкам краще опанувати цей прийом роботи в терміналі?