Стандартный ввод/вывод и их перенаправление
Третья часть головоломки Linux — связь между командами и файлами, организуемая при помощи стандартного ввода и вывода. Не пугайтесь технического термина — это понятие на самом деле касается того, как структурирована командная строка и куда отправляются результаты выполнения команды.
Linux, как и любая операционная система, при выполнении команды нуждается в информации, откуда команда будет получать данные и куда их выводить. Другие операционные системы, такие как Windows и Macintosh, самостоятельно делают предположения об источнике входных данных и назначении выходных. Зачастую так поступает и Linux. Однако, в большинстве случаев, вам самим следует подумать, откуда команда будет получать данные и куда выводить. Ниже мы объясним основы концепции стандартного ввода/вывода на примере.
Командаcat — удивительно многосторонняя команда. Она может использоваться для вывода содержимого файла на экран, добавления данных в конец файла и других операций. Она даже может быть использована в качестве простейшего текстового редактора:
$ cat
После ввода этой команды курсор переместится в следующую строку, п вы сможете вводить текст с клавиатуры. Поскольку в команде нс указано, куда должен быть отправлен вводимый текст, то Linux и командаcat предполагают, что текст должен быть выведен на экран. После того как текст выведен на экран, он потерян навсегда. Большинство команд Linux по умолчанию используют в качестве стандартного ввода клавиатуру, а в качестве стандартного вывода — экран. Поэтому командуcat саму по себе вы можете использовать для тренировки навыков ввода информации с клавиатуры, но в таком виде для какой-либо другой цели она бесполезна.
Однако область применения командыcat существенно расширяется, если вы указываете в командной строке имена файла. Командаcat с именем файла в качестве аргумента выводит содержимое этого файла на экран.
В этом примере командаcat использует в качестве стандартного ввода не клавиатуру, а указанный файл. Содержимое файла не изменяется, оно просто выводится на экран.
Вы можете использовать командуcat для записи строк в файл. Для этого вам следует использовать символы перенаправления. Эти символы позволяют любой команде использовать в качестве стандартного ввода или вывода вместо клавиатуры или экрана файл или стандартный ввод/ вывод другой команды. В следующем примере стандартный вывод командыcat вместо экрана направляется в файлkevin.report:
$ cat > kevin.report
Вводимый с клавиатуры текст построчно записывается в файлkevin.report. Нажатие клавишCtrl+D останавливает перенаправление и заканчивает выполнение команды cat.
Перенаправление может использоваться как для стандартного вывода, так и для стандартного ввода. Командаcatможет использоваться для копирования файлов следующим образом:
$ cat kevin.report > pat.report
В этом примере стандартным вводом служит файл kevin.report, а стандартным выводом — файлpat.report.Содержимое файлаkevin.report не изменяется.
Для того чтобы дописать данные в конец существующего файла, используется специальный символ перенаправления. В следующем примере содержимое файлаkevin.reportдописывается в конец файлаpat.report:
$ cat kevin.report » pat,report
Если бы в этом примере было опущено имя файла kevin.report, то командаcat дописала бы вводимый с клавиатуры текст в конец файлаpat.report. Соответствующая команда выглядит так:
$ cat » pat.report
Существуют всего четыре символа перенаправления стандартного в вода/вы вола:
• Символ > используется для перенаправления стандартного вывода команды в 4)аил. Например,cat > file запишет выводимую командойcat информацию в файл file.
• Символ < используется для переназначения стандартного ввода команды. Например, при выполнении командыcat < file в качестве стандартного вводаcatиспользуется не клавиатура, а файлfile.
• Символ » используется для дописывапия стандартного вывода команды в конец существующего файла. Например,cat » file допишет выводимую командой catинформацию в конец файлаfile.
• Символ ¦ является символом потока. Он используется, когда вы хотите передать стандартный вывод одной команды на стандартный ввод другой. Например,cat ¦ grep отправит стандартный вывод командыcat на стандартный ввод командыgrep. (Потоки более подробно обсуждаются ниже в этой главе.)
На первый взгляд может показаться, что эти символы — не что иное, как несколько способов сделать одно и то же. На самом деле символы < и > можно менять местами в командной строке, но они оба нужны. Команды, которые выглядят похоже, на самом деле могут совершенно по-разному обрабатываться операционной системой. Например, команда
$ cat pat.file выполняет те же действия, что и команда
$ cat < pat.file
Однако на самом деле это различные команды. В первом случаеpat.file — это аргумент командыcat. С точки зрения Linux аргументы — это переменные, используемые в командной строке. В данном случае получилось так, что аргумент — это файл. Во втором же примере файлpat.fileиграет роль стандартного ввода для командыcat.
Нет никаких ограничений на использование символов перенаправления в командной строке. Достаточно часто используются сразу два символа перенаправления, особенно в сценариях интерпретаторов командной строки:
$ cat < filel > file2
Эта команда использует файлfilel в качестве стандартного ввода командыcat, а файлfile2 — в качестве стандартного вывода.
Потоки
Поток, обозначаемый символом ¦, — это просто еще один способ перенаправления стандартного ввода/вывода. Использование потоков позволяет работать непосредственно с командами, передавая информацию, выводимую одной из команд, на ввод другой. Синтаксис таков:
$ commandl ¦ command2
Сочетание команд и символа потока часто также называется потоком. Потоки часто используются при подготовке файлов к печати.
|