Перенаправление ввода-вывода в Bash
В Bash реализована возможность перенаправления потоков ввода и вывода. Что это значит?
В стандартный поток ввода поступают данные, которые вводятся с клавиатуры. Стандартным потоком вывода является экран монитора. Другими словами, в командную строку Bash'а поступают данные, вводимые с клавиатуры. Если команда предполагает текстовый вывод, Bash выводит данные на экран.
Однако такое поведение по-умолчанию можно изменить. Данные могут поступать, например, из файла, а не с клавиатуры. Аналогично, они могут выводиться в файл, а не на экран.
Предположим, мы хотим, не выходя из терминала в графический режим, записать в файл заметку. Для этого не обязательно использовать консольный текстовый редактор. Это можно сделать с помощью программы cat
, перенаправив ее вывод в файл. Вспомним, что cat
без аргументов работает в интерактивном режиме, и все, что мы вводим, тут же выводится на экран.

В Bash знак больше >
обозначает перенаправление стандартного потока вывода. В данном случае в файл. То есть cat
по-умолчанию выводит данные на экран, но поскольку они были перенаправлены, то данные на экран выводиться не будут. На экране видны только вводимые строки, выводимые оказываются в файле.
Пусть далее мы хотим добавить к заметке сегодняшнюю дату. Перенаправим вывод команды date
в тот же файл.

Два знака больше >>
– это тоже перенаправление вывода, но такое, когда данные добавляются в конец файла, если он существует. Используй мы только один знак больше, файл был бы перезаписан.
На скрине выше командой cat note.txt
файл читается. Так устроена команда cat
, что если ей передается аргумент, то она не будет работать в интерактивном режиме, а возьмет данные из указанного файла и выведет их на экран. Поэтому это равносильно cat < note.txt
, где знак меньше <
обозначает перенаправление ввода.
Однако равносильно по результату – не значит равносильно по механизму реализации. При использовании знака именно командная оболочка, в данном случае Bash, занимается перенаправлением данных из файла. В то время как программа cat
(или любая другая) работает в обычном режиме, "думая" что данные она получает со стандартного ввода.
Можно было бы ожидать, что если команде ls
, которая выводит содержимое каталога, передать файл, содержащий адрес каталога, то она выведет объекты этого каталога. Однако это не так.

Такое перенаправление не работает. А там где "работает" можно обойтись и без него, то есть команда сама "знает", что если передается имя файла, или она употребима только с именем файла, то данные надо брать из него.

Здесь команда grep
ищет первый аргумент во втором. Если находит, возвращает строку с ним. Программа wc
считает количество строк, слов и символов в файле. С помощью sort
строки сортируются.
Когда все же требуется выполнить список заранее подготовленных команд, то их записывают в файл и делают его исполняемым.
С другой стороны, выводы в файл команд ls
и других работают.

В Unix-подобных операционных системах перенаправлять получение/передачу данных можно не только со стандартных ввода-вывода на файл. Данные могут поступать из, так называемого, программного канала. Равно и выводиться в него.
Канал – это способ соединения программ таким образом, чтобы вывод одной тут же передавался на вход другой. В результате создается программный конвейер, состоящий из двух и более программ. В командной оболочке для создания конвейера используется символ вертикальной черты – |
.
Программные каналы позволяют избежать излишнего создания файлов с промежуточными данными. Рассмотрим пример. Команда wc
считает количество строк, слов и символов в файле. С ключом -l
– только количество строк (линий). Пусть нам надо узнать общее количество файлов, содержащихся в каталоге.
В случае перенаправления ввода-вывода в файл, потребовалось бы сначала направить вывод программы ls
в файл, после чего передать его программе wc
. При этом был посчитан и этот файл (если он был сохранен в каталоге, который анализируется).
В случае же программного конвейера между ls
и wc
создается канал. В результате данные, отправляемые ls
на стандартный вывод, то есть монитор, оболочка Bash "перехватывает" и отправляет в канал, из которого данные передаются оболочкой на ввод wc
.
pl@comp:~$ ls | wc -l 13
Задание:
Имя команды cat
– это сокращение от "catenate" (связывать, соединять). Если в качестве аргументов программе передать несколько файлов, то их содержимое будет соединено и выведено на экран.
Создайте два текстовых файла с какими-либо данными. С помощью программы cat
объедините данные этих файлов в третьем файле.