Spec-Zone.ru › Bash

Перенаправления

​

Перед выполнением команды её ввод и вывод могут быть перенаправлены с помощью специальной записи, интерпретируемой оболочкой. Перенаправление позволяет дублировать файловые дескрипторы команд, открывать и закрывать их, связывать с другими файлами, а также изменять файлы, из которых команда читает данные и в которые записывает их. При использовании со встроенной командой exec перенаправления изменяют файловые дескрипторы в текущей среде выполнения оболочки. Следующие операторы перенаправления могут располагаться перед простой командой, в любом месте внутри неё или после неё. Перенаправления обрабатываются в порядке следования, слева направо.

Перед каждым перенаправлением, которому может предшествовать номер файлового дескриптора, вместо него может указываться слово вида {varname}. В этом случае для каждого оператора перенаправления, кроме >&- и <&-, оболочка выделяет файловый дескриптор с номером не меньше 10 и присваивает его переменной {varname}. Если перед >&- или <&- указано {varname}, значение varname определяет файловый дескриптор, который нужно закрыть. Если указано {varname}, перенаправление сохраняется и после завершения команды, что позволяет программисту оболочки вручную управлять временем жизни файлового дескриптора без использования встроенной команды exec. Поведение управляется параметром оболочки varredir_close (см. Встроенная команда Shopt).

В приведённых ниже описаниях, если номер файлового дескриптора не указан и первый символ оператора перенаправления — ‘<’, перенаправление относится к стандартному вводу (файловый дескриптор 0). Если первый символ оператора перенаправления — ‘>’, перенаправление относится к стандартному выводу (файловый дескриптор 1).

Если не указано иное, word, следующее за оператором перенаправления в приведённых ниже описаниях, подвергается подстановке фигурных скобок, подстановке тильды, подстановке параметров и переменных, подстановке команды, арифметической подстановке, удалению кавычек, подстановке имён файлов и разбиению на слова. Если в результате получается больше одного слова, Bash сообщает об ошибке.

Порядок перенаправлений имеет значение. Например, команда

ls > dirlist 2>&1

направляет и стандартный вывод (файловый дескриптор 1), и стандартный вывод ошибок (файловый дескриптор 2) в файл dirlist, тогда как команда

ls 2>&1 > dirlist

направляет в файл dirlist только стандартный вывод, поскольку стандартный вывод ошибок был скопирован со стандартного вывода до того, как стандартный вывод был перенаправлен в dirlist.

Bash обрабатывает некоторые имена файлов особым образом, когда они используются при перенаправлении, как описано в следующей таблице. Если операционная система, в которой запущен Bash, предоставляет эти специальные файлы, Bash использует их; в противном случае он эмулирует их внутри, обеспечивая описанное ниже поведение.

/dev/fd/fd

Если fd — допустимое целое число, дублирует файловый дескриптор fd.

/dev/stdin

Дублируется файловый дескриптор 0.

/dev/stdout

Дублируется файловый дескриптор 1.

/dev/stderr

Дублируется файловый дескриптор 2.

/dev/tcp/host/port

Если host — допустимое имя узла или интернет-адрес, а port — целочисленный номер порта или имя службы, Bash пытается открыть соответствующий сокет TCP.

/dev/udp/host/port

Если host — допустимое имя узла или интернет-адрес, а port — целочисленный номер порта или имя службы, Bash пытается открыть соответствующий сокет UDP.

Если файл не удаётся открыть или создать, перенаправление завершается ошибкой.

Файловые дескрипторы с номерами больше 9 следует использовать с осторожностью, так как они могут конфликтовать с файловыми дескрипторами, которые оболочка использует внутри.

  • Перенаправление ввода
  • Перенаправление вывода
  • Добавление перенаправленного вывода
  • Перенаправление стандартного вывода и стандартного вывода ошибок
  • Добавление стандартного вывода и стандартного вывода ошибок
  • Here-документы
  • Here-строки
  • Дублирование файловых дескрипторов
  • Перемещение файловых дескрипторов
  • Открытие файловых дескрипторов для чтения и записи

3.6.1 Перенаправление ввода

При перенаправлении ввода файл, имя которого получается в результате раскрытия word, открывается для чтения через файловый дескриптор n либо через стандартный ввод (файловый дескриптор 0), если n не указан.

Общий формат перенаправления ввода:

[n]<word

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

При перенаправлении вывода файл, имя которого получается в результате раскрытия word, открывается для записи через файловый дескриптор n либо через стандартный вывод (файловый дескриптор 1), если n не указан. Если файла не существует, он создаётся; если он существует, его размер обнуляется.

Общий формат перенаправления вывода:

[n]>[|]word

Если оператор перенаправления — ‘>’ и включён параметр noclobber встроенной команды set, перенаправление завершается ошибкой, если файл, имя которого получается в результате раскрытия word, существует и является обычным файлом. Если оператор перенаправления — ‘>|’ или оператор перенаправления — ‘>’, а параметр noclobber встроенной команды set не включён, Bash пытается выполнить перенаправление, даже если файл с именем, заданным в word, уже существует.

3.6.3 Добавление перенаправленного вывода

При таком перенаправлении вывода файл, имя которого получается в результате раскрытия word, открывается для добавления данных через файловый дескриптор n либо через стандартный вывод (файловый дескриптор 1), если n не указан. Если файла не существует, он создаётся.

Общий формат добавления вывода:

[n]>>word

3.6.4 Перенаправление стандартного вывода и стандартного вывода ошибок

Эта конструкция перенаправляет и стандартный вывод (файловый дескриптор 1), и стандартный вывод ошибок (файловый дескриптор 2) в файл, имя которого получается в результате раскрытия word.

Существуют два формата перенаправления стандартного вывода и стандартного вывода ошибок:

&>word

и

>&word

Из этих двух форм предпочтительна первая. Семантически она эквивалентна следующей записи:

>word 2>&1

При использовании второй формы word не может раскрываться в число или ‘-’. В таком случае из соображений совместимости применяются другие операторы перенаправления (см. раздел «Дублирование файловых дескрипторов» ниже).

3.6.5 Добавление стандартного вывода и стандартного вывода ошибок

Эта конструкция добавляет стандартный вывод (файловый дескриптор 1) и стандартный вывод ошибок (файловый дескриптор 2) в файл, имя которого получается в результате раскрытия word.

Формат добавления стандартного вывода и стандартного вывода ошибок:

&>>word

Семантически эта запись эквивалентна следующей:

>>word 2>&1

(см. раздел «Дублирование файловых дескрипторов» ниже).

3.6.6 Here-документы

Этот тип перенаправления указывает оболочке считывать ввод из текущего источника, пока она не встретит строку, содержащую только delimiter (без завершающих пробелов). Все считанные до этого момента строки становятся стандартным вводом команды (либо вводом через файловый дескриптор n, если указан n).

Формат here-документов:

[n]<<[−]word
        here-document
delimiter

Оболочка не выполняет подстановку параметров и переменных, подстановку команды, арифметическую подстановку или подстановку имён файлов для word.

Если какая-либо часть word заключена в кавычки, delimiter становится результатом удаления кавычек из word, а строки here-документа не раскрываются. Если word не заключено в кавычки, delimiter — это само word, а текст here-документа обрабатывается подобно строке в двойных кавычках: для всех строк here-документа выполняются подстановка параметров, подстановка команды и арифметическая подстановка, последовательность символов \newline воспринимается буквально, а для экранирования символов ‘\’, ‘$’ и ‘`’ необходимо использовать ‘\’; однако символы двойных кавычек не имеют особого значения.

Если оператор перенаправления — ‘<<-’, оболочка удаляет начальные символы табуляции во входных строках и строке, содержащей delimiter. Это позволяет естественным образом добавлять отступы к here-документам в сценариях оболочки.

Если разделитель не заключён в кавычки, последовательность \<newline> считается продолжением строки: две строки объединяются, а обратная косая черта с переводом строки удаляется. Это происходит при чтении here-документа, до проверки завершающего разделителя, поэтому объединённые строки могут образовать завершающий разделитель.

3.6.7 Here-строки

Вариант here-документов имеет следующий формат:

[n]<<< word

word подвергается подстановке тильды, подстановке параметров и переменных, подстановке команды, арифметической подстановке и удалению кавычек. Подстановка имён файлов и разбиение на слова не выполняются. Результат передаётся команде как единая строка с добавленным символом новой строки через стандартный ввод (либо через файловый дескриптор n, если указан n).

3.6.8 Дублирование файловых дескрипторов

Оператор перенаправления

[n]<&word

используется для дублирования дескрипторов ввода. Если word раскрывается в одну или несколько цифр, файловый дескриптор n становится копией указанного файлового дескриптора. Если цифры в word не обозначают файловый дескриптор, открытый для ввода, возникает ошибка перенаправления. Если значением word является ‘-’, файловый дескриптор n закрывается. Если n не указан, используется стандартный ввод (файловый дескриптор 0).

Оператор

[n]>&word

аналогичным образом используется для дублирования дескрипторов вывода. Если n не указан, используется стандартный вывод (файловый дескриптор 1). Если цифры в word не обозначают файловый дескриптор, открытый для вывода, возникает ошибка перенаправления. Если значением word является ‘-’, файловый дескриптор n закрывается. В особом случае, когда n не указан, а word раскрывается не в одну или несколько цифр и не в ‘-’, перенаправляются стандартный вывод и стандартный вывод ошибок, как описано выше.

3.6.9 Перемещение файловых дескрипторов

Оператор перенаправления

[n]<&digit-

перемещает файловый дескриптор digit в файловый дескриптор n либо в стандартный ввод (файловый дескриптор 0), если n не указан. После копирования в n файловый дескриптор digit закрывается.

Аналогично оператор перенаправления

[n]>&digit-

перемещает файловый дескриптор digit в файловый дескриптор n либо в стандартный вывод (файловый дескриптор 1), если n не указан.

3.6.10 Открытие файловых дескрипторов для чтения и записи

Оператор перенаправления

[n]<>word

открывает файл, имя которого получается в результате раскрытия word, для чтения и записи через файловый дескриптор n либо через файловый дескриптор 0, если n не указан. Если файла не существует, он создаётся.

Copyright © 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
Licensed under the GNU Free Documentation License.
https://www.gnu.org/software/bash/manual/html_node/Redirections.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API