Операционная система 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
Перенаправление ввода и вывода и стыкование команд осуществляется командными оболочками, которые поддерживают использование символов >
, >>
; и |
. Сами же команды не способны воспринимать и интерпретировать эти символы.