Операционная система Linux позволяет выполнять бесконечное множество операций с данными, комбинируя ограниченный набор команд UNIX.
Содержание
- Стандартный ввод и стандартный вывод
- Перенаправление ввода и вывода
- Использование состыкованных команд
- Недеструктивное перенаправление вывода
Стандартный ввод и стандартный вывод
Многие команды системы Linux имеют так называемые стандартный ввод (standard input) и стандартный вывод (standard output), часто сокращаемые до stdin и stdout. Ввод и вывод здесь — это входная и выходная информация для данной команды. Программная оболочка делает так, что стандартным вводом является клавиатура, а стандартным выводом — экран монитора.
Приведём пример с использованием команды cat, которая обычно читает данные из всех файлов, указанных в командной строке, и посылает эту информацию непосредственно в стандартный вывод (stdout). Следовательно, команда
$ cat example1 example2
выведет на экран сначала содержимое файла example1, а затем — файла example2.
Однако, если имя файла не указано, программа cat читает входные данные из stdin и возвращает их в stdout. Приведём пример:
$ cat
Привет.
Привет.
Прощай.
Прощай.
Каждую строку, вводимую с клавиатуры, программа cat немедленно возвращает на экран. При вводе информации со стандартного ввода конец текста завершается вводом специальной комбинации клавиш, как правило Ctrl-D. Сокращённое название сигнала конца текста — EOT (end of text).
Команда sort читает строки вводимого текста (также из stdin, если имя одного или нескольких файлов не указано) и выдаёт набор этих строк в упорядоченном виде на stdout. Проверим её действие:
$ sort
Иван
Александр
Татьяна
Николай
{Ctrl-D]
Александр
Иван
Николай
Татьяна
После использования комбинации клавиш Ctrl-D строки были упорядочены в алфавитном порядке.
Перенаправление ввода и вывода
Допустим, вы хотите направить вывод команды sort в файл list, чтобы сохранить упорядоченный по алфавиту список на диске. Командная оболочка позволяет перенаправить (redirect) стандартный вывод команды в файл, используя символ >:
$ sort > list
Иван
Александр
Татьяна
Николай
Результат работы команды sort не был выведен на экран, но сохранился в файле с именем list. Выведем на экран содержимое этого файла:
$ cat list
Александр
Иван
Николай
Татьяна
Пусть теперь исходный неупорядоченный список имен находится в файле names:
$ cp list names
Этот список можно упорядочить с помощью команды sort, если указать ей, что она должна читать из данного файла, а не из своего стандартного ввода, и кроме того, перенаправить стандартный вывод в файл, как это уже выполнялось. Однако, можно поступить и иначе, перенаправив не только стандартный вывод, но и стандартный ввод, используя символ <:
$ sort < names
Александр
Иван
Николай
Татьяна
Введём понятие фильтра (filter). Фильтром является программа, читающая данные из стандартного ввода, некоторым образом их обрабатывающая и результат направляющая на стандартный вывод. Когда применяется перенаправление, в качестве стандартного ввода и вывода могут выступать файлы. Как указывалось выше, по умолчанию, stdin и stdout относятся к клавиатуре и к экрану соответственно. Программа sort является простым фильтром — она сортирует входные данные и посылает результат на стандартный вывод. Совсем простым фильтром является программа cat — она ничего не делает с входными данными, а просто пересылает их на выход.
Использование состыкованных команд
Как поступить при сортировке данных, являющихся результатом работы какой-либо другой команды, например, ls?
Решением в данной ситуации может служить создание состыкованных команд (pipelines). Стыковку осуществляет командная оболочка, направляющая stdout первой команды на stdin второй команды. В данном случае мы направляем stdout команды ls на stdin команды sort. Для стыковки используется символ |:
$ ls | sort -r
names
list
index2.html
index1.html
example2
example1
Если команда ls выводит на экран слишком длинный список файлов, то можно вывести его частями. Например:
$ ls /usr/bin | less
Недеструктивное перенаправление вывода
Эффект от использования символа > для перенаправления вывода файла является деструктивным, так какбудет уничтожено содержимое файла, а на его месте создан новый файл:
$ ls > names
$ cat names
example1
example2
index1.html
index2.html
list
names
Если же перенаправление будет сделано с помощью символов >>, то вывод будет приписан в конец указанного файла, при этом исходное содержимое файла не будет уничтожено:
$ ls >> names
$ cat names
Иван
Александр
Татьяна
Николай
example1
example2
index1.html
index2.html
list
names
Перенаправление ввода и вывода и стыкование команд осуществляется командными оболочками, которые поддерживают использование символов >, >>; и |. Сами же команды не способны воспринимать и интерпретировать эти символы.