Перенаправление ввода/вывода в Linux


Перенаправление ввода/вывода (I/O redirection) в Linux — это удобный механизм, который позволяет управлять потоками данных между командами, файлами и устройствами. В Linux программы общаются с пользователем и друг с другом через три основных потока:

  1. stdin (стандартный ввод) — поток ввода данных (клавиатура), пронумерован как файловый дескриптор 0.
  2. stdout (стандартный вывод) — поток вывода данных (экран), пронумерован как файловый дескриптор 1.
  3. 3stderr (стандартный вывод ошибок) — поток вывода ошибок (отображение ошибок на экране), пронумерован как файловый дескриптор 2.

stdin — «слух» программы, она получает данные, которые вы вводите с клавиатуры или передаёте из файла. stdout — это «голос» программы, она выводит результаты работы на экран или в файл. stderr — это «алерт» программы, она сообщает о возникших ошибках, которые по умолчанию выводятся на экран, но могут быть перенаправлены в отдельный файл.

Этими потоками можно управлять. Например, перенаправить stdout в файл, чтобы сохранить результат работы программы, или перенаправить stderr в другой файл, чтобы информация об ошибках не переплетаталась с основным выводом. Также можно использовать конвейер, когда вывод одной программы автоматически передаётся на вход другой. Так формируются цепочки команд для сложных задач.

Вы можете комбинировать команды для решения сложных проблем. Потоки можно связывать с чем угодно: с файлами, другими программами или устройствами. В командной оболочке bash эта операция называется перенаправлением.

Основные операторы перенаправления

  1. перенаправление stdout в файл (перезапись)
  2. >> — перенаправление stdout в файл (добавление)
  3. < — перенаправление stdin из файла
  4. 2> — перенаправление stderr в файл (перезапись)
  5. 2>> — перенаправление stderr в файл (добавление)
  6. &> — перенаправление и stdout, и stderr в файл
  7. | — передача stdout одной команды на stdin другой (конвейер)

Что такое «стандартный ввод» (stdin)

Стандартный ввод — это способ, которым программа получает некие данные от пользователя или другого источника. Обычно программа с клавиатуры. Например, если вы запустите программу, которая просит вас что-то ввести, она будет использовать stdin для чтения вашего ввода.

Но стандартный ввод может работать не только с клавиатурой. Программа может получать данные из файла или даже от другой команды. Это делает stdin универсальным инструментом для передачи информации.

redirr

Как работает stdin? Когда программа читает данные через stdin, она продолжает это делать, пока не встретит специальный сигнал — EOF (End Of File), что означает «конец данных». В терминале вы можете вручную отправить сигнал EOF, нажав сочетание клавиш Ctrl+D.

Пример работы с stdin на примере команды cat

Команда cat (от слова CONCATENATE, что означает "объединить") обычно используется для вывода содержимого файлов на экран или объединения нескольких файлов. Но если вы просто запустите cat без аргументов, она будет ждать ввода данных через stdin.

Ввод с клавиатуры

Введите команду bash: cat

Напишите любой текст. Например: Привет! С вами Cloud4Y — корпоративный облачный провайдер.

Нажмите Ctrl+D, чтобы отправить сигнал EOF. Программа cat выведет на экран всё, что вы ввели:

Привет! 
С вами Cloud4Y — корпоративный облачный провайдер.

Перенаправление stdin из файла

Если вы хотите, чтобы cat читала данные не с клавиатуры, а из файла, можно использовать перенаправление:

cat < input.txt

В этом случае cat прочитает содержимое файла input.txt и выведет его на экран.

Объединение файлов

Команда cat также может объединять несколько файлов. Например:

cat file1.txt file2.txt > output.txt

Здесь cat читает содержимое file1.txt и file2.txt, объединяет их и записывает результат в output.txt.


Зачем это нужно

  • Гибкость. Вы можете передавать данные в программу разными способами: с клавиатуры, из файла или от другой команды.
  • Автоматизация. Используя перенаправление, вы можете заставить программы работать с данными без вашего участия.
  • Удобство. Команды вроде cat могут быть полезны для быстрого просмотра или обработки данных.

Что такое стандартный вывод (stdout)

Стандартный вывод — это способ, которым программа выводит результаты своей работы. Обычно программа отправляет эти данные на экран терминала. Например, когда вы запускаете команду, которая что-то вычисляет или читает файл, результат её работы выводится на экран через stdout.

Но стандартный вывод можно перенаправить. Вместо того чтобы показывать результат на экране, программа может записать его в файл или передать другой команде для дальнейшей обработки.

Команда echo

Команда echo— это простейший способ продемонстрировать работу stdout. Она выводит на экран всё, что вы ей передадите.

Вывод текста на экран:

echo "Привет, мир!"

Результат:

Привет, мир!

Если вызвать echo без аргументов, она просто выведет пустую строку:

Результат: (пустая строка).

Перенаправление stdout в файл

Вы можете перенаправить вывод команды в файл, чтобы сохранить его, а не показывать на экране.

Создадим файл с текстом:

echo "Это текст для файла" > output.txt

Теперь файл output.txt содержит строку:

Это текст для файла

Если файл уже существует, команда > перезапишет его. Чтобы добавить текст в конец файла, используйте >>:

echo "Это новая строка" >> output.txt

Теперь файл output.txt содержит:

Это текст для файла
Это новая строка

Команда cat и перенаправление stdout

Команда catчитает файлы и выводит их содержимое на экран (в stdout). Но её можно использовать и для объединения файлов.

Создадим три файла:

echo "Содержимое file1" > file1 

echo "Содержимое file2" > file2 

echo "Содержимое file3" > file3

Объединим их в один файл:

cat file1 file2 file3 > bigfile

Теперь файл bigfile содержит:

Содержимое file1
Содержимое file2
Содержимое file3

Здесь cat читает содержимое file1, file2 и file3. Вывод (stdout) перенаправляется в файл bigfile с помощью >.

Зачем это нужно

  • Сохранение результатов. Вы можете сохранить вывод команды в файл для дальнейшего использования.
  • Автоматизация. Перенаправление stdout позволяет автоматизировать задачи, например, создание логов или обработку данных.
  • Гибкость. Вы можете передавать вывод одной команды на вход другой, создавая цепочки команд для сложных операций.

Что такое стандартная ошибка (stderr)

Стандартная ошибка — поток, который программы используют для вывода сообщений об ошибках. Здесь тоже данные выводятся на экран терминала.

Пример работы с stderr

Команда lsвыводит список файлов и папок в указанной директории. Если вы укажете несуществующую директорию, команда выведет сообщение об ошибке через stderr.

Введите команду: ls %

Поскольку директории % не существует, вы увидите:

ls: cannot access %: No such file or directory

Это сообщение об ошибке выводится через stderr.

Перенаправление stderr в файл

Вы можете перенаправить stderr в файл, чтобы сохранить сообщения об ошибках для дальнейшего анализа.

Введите команду: ls % 2> error.log

Теперь сообщение об ошибке будет записано в файл error.log, а не выведено на экран. Проверьте содержимое файла:

cat error.log

Вы увидите:

ls: cannot access %: No such file or directory

Игнорирование stderr

Если вы хотите полностью игнорировать ошибки, можно перенаправить stderr в /dev/null — виртуальное устройство, которое "поглощает" данные.

Введите команду:

ls % 2> /dev/null

Сообщение об ошибке не будет выведено на экран и не сохранится.

Перенаправление потоков: >, >>, 2>, 2>>

  • > — перенаправляет stdout в файл (перезаписывает файл).
  • >> — перенаправляет stdout в файл (добавляет данные в конец файла).
  • 2> — перенаправляет stderr в файл (перезаписывает файл).
  • 2>> — перенаправляет stderr в файл (добавляет данные в конец файла).

Перезапись и добавление данных в файл

Создадим файл и запишем в него данные:

echo "Первая строка" > file1

Содержимое file1:

Первая строка

Добавим ещё одну строку:

echo "Вторая строка" >> file1

Содержимое file1:

Первая строка
Вторая строка

Перезапишем файл:

echo "Новая строка" > file1

Содержимое file1:

Новая строка

Маленькие помощники: фильтры

Фильтры — это команды, которые обрабатывают данные, поступающие на их вход (обычно через стандартный ввод), и выводят результат на стандартный вывод. Они полезны для обработки текста, поиска информации, сортировки, подсчёта и других задач. Многие из этих команд могут работать как с файлами, так и с данными, переданными через конвейер.

Основные команды-фильтры

find
Ищет файлы по имени или другим параметрам. Например: find /home -name "*.txt" найдёт все файлы с расширением .txt в папке /home.

grep
Ищет строки, содержащие определённый текст или регулярное выражение. Например: grep "error" logfile.txt выведет все строки из файла logfile.txt, содержащие слово "error".

tee
Перенаправляет данные одновременно в файл и на экран. Например: echo "Hello" | tee output.txt запишет "Hello" в файл output.txt и выведет на экран. 

tr
Заменяет или удаляет символы в тексте. Например: echo "hello" | tr 'a-z' 'A-Z' преобразует текст в верхний регистр: HELLO.

wc
Подсчитывает строки, слова и символы. Например: wc -l file.txt покажет количество строк в файле file.txt.

Другие полезные команды-фильтры

head
Показывает первые строки файла или ввода. Например: head -n 5 file.txt выведет первые 5 строк файла file.txt.

tail
Показывает последние строки файла или ввода. Например: tail -n 5 file.txt выведет последние 5 строк файла file.txt.

Особенно полезен с ключом -f для отслеживания изменений в файле (например, логов): tail -f logfile.txt

cut
Вырезает определённые столбцы или символы из текста. Например: cut -d ',' -f 1 data.csv вырежет первый столбец из CSV-файла, где разделитель — запятая.

sort
Сортирует строки. Например: sort file.txt отсортирует строки файла file.txt в алфавитном порядке.

uniq
Удаляет повторяющиеся строки. Например: sort file.txt | uniq удалит дубликаты строк, предварительно отсортировав их.

bc
Выполняет математические вычисления. Например: echo "2 + 2" | bc выведет результат: 4.

hexdump
Показывает данные в шестнадцатеричном формате. Например: hexdump file.bin выведет содержимое бинарного файла в виде шестнадцатеричных чисел.

strings
Извлекает текстовые строки из бинарных файлов. Например:strings program.bin покажет все строки, которые можно прочитать в бинарном файле.

sed
Редактирует текст с помощью скриптов. Например: echo "Hello World" | sed 's/World/Linux/' заменит "World" на "Linux": Hello Linux.

awk
Обрабатывает текстовые данные, особенно полезен для работы с таблицами. Например: awk '{print $1}' file.txt выведет первый столбец из каждой строки файла file.txt.

sh -s
Выполняет команды, переданные через стандартный ввод. Например: echo "echo Hello" | sh -s выполнит команду echo Hello и выведет Hello.

ssh
Может работать как фильтр, передавая данные на удалённый сервер. Например: echo "ls" | ssh user@remote_host выполнит команду ls на удалённом сервере и выведет результат.

Заключение

Перенаправление ввода/вывода в Linux — это мощный инструмент, который позволяет гибко управлять потоками данных. Освоение этих техник значительно упрощает работу с командами, файлами и скриптами, делая её более эффективной и автоматизированной.




Полезный материал?
1
0
Читайте нас: 
Последние статьи
Вверх!