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

В 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 объедините данные этих файлов в третьем файле.

Курс с ответами к заданиям и дополнительными уроками:
android-приложение, pdf-версия.

Введение в Linux и Bash. Курс