Перенаправления
Перед выполнением команды её входные и выходные данные могут быть перенаправлены с помощью специальной нотации, интерпретируемой оболочкой. Перенаправление позволяет дублировать, открывать, закрывать файловые дескрипторы команд, указывать на различные файлы и изменять файлы, из которых команда считывает и в которые записывает. Перенаправление также может быть использовано для изменения файловых дескрипторов в текущей среде выполнения оболочки. Следующие операторы перенаправления могут предшествовать или появляться где-либо в простой команде или следовать за командой. Перенаправления обрабатываются в порядке их появления, слева направо.
Каждое перенаправление, которое может предшествовать номеру файлового дескриптора, может вместо этого предшествовать слову в форме {имя_переменной}. В этом случае для каждого оператора перенаправления, кроме >&- и <&-, оболочка выделит файловый дескриптор, больший 10, и назначит его {имя_переменной}. Если >&- или <&- предшествуют {имя_переменной}, значение имя_переменной определяет файловый дескриптор для закрытия. Если {имя_переменной} указан, перенаправление сохраняется за пределами области действия команды, позволяя программисту оболочки управлять жизненным циклом файлового дескриптора вручную. Параметр оболочки varredir_close, управляет этим поведением (см. The Shopt Builtin).
В следующих описаниях, если номер файлового дескриптора опущен, а первый символ оператора перенаправления — ‘<’, перенаправление относится к стандартному вводу (файловому дескриптору 0). Если первый символ оператора перенаправления — ‘>’, перенаправление относится к стандартному выводу (файловому дескриптору 1).
Слово, следующее за оператором перенаправления в следующих описаниях, если не указано иное, подвергается расширению фигурных скобок, расширению тильды, расширению параметров, подстановке команд, арифметическому расширению, удалению кавычек, расширению имён файлов и разделению слов. Если оно расширяется более чем на одно слово, 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 Перенаправление ввода
Перенаправление ввода приводит к тому, что файл, имя которого получено в результате расширения слово, открывается для чтения на файловом дескрипторе n, или на стандартном вводе (файловый дескриптор 0), если n не указан.
Общая форма перенаправления ввода:
[n]<word
3.6.2 Перенаправление вывода
Перенаправление вывода приводит к тому, что файл, имя которого получено в результате расширения слово, открывается для записи на файловом дескрипторе n, или на стандартном выводе (файловый дескриптор 1), если n не указан. Если файл не существует, он создаётся; если он существует, он обнуляется до нулевого размера.
Общая форма перенаправления вывода:
[n]>[|]word
Если оператор перенаправления — ‘>’, и опция noclobber для команды set включена, перенаправление завершится ошибкой, если файл, имя которого получено в результате расширения слово, существует и является обычным файлом. Если оператор перенаправления — ‘>|’, или оператор перенаправления — ‘>’ и опция noclobber не включена, перенаправление выполняется, даже если файл, указанный в слово, существует.
3.6.3 Добавление перенаправленного вывода
Перенаправление вывода таким образом приводит к тому, что файл, имя которого получено в результате расширения слово, открывается для добавления на файловом дескрипторе n, или на стандартном выводе (файловый дескриптор 1), если n не указан. Если файл не существует, он создаётся.
Общая форма добавления вывода:
[n]>>word
3.6.4 Перенаправление стандартного вывода и стандартной ошибки
Этот конструкт позволяет перенаправить как стандартный вывод (файловый дескриптор 1), так и стандартную ошибку (файловый дескриптор 2) в файл, имя которого является расширением слово.
Существует две формы перенаправления стандартного вывода и стандартной ошибки:
&>word
и
>&word
Из двух форм предпочтительнее первая. Она семантически эквивалентна
>word 2>&1
При использовании второй формы слово не может расширяться до числа или ‘-’. Если это произойдёт, другие операторы перенаправления применяются (см. Дублирование файловых дескрипторов ниже) по соображениям совместимости.
3.6.5 Добавление стандартного вывода и стандартной ошибки
Этот конструкт позволяет добавить как стандартный вывод (файловый дескриптор 1), так и стандартную ошибку (файловый дескриптор 2) к файлу, имя которого является расширением слово.
Формат добавления стандартного вывода и стандартной ошибки:
&>>word
Это семантически эквивалентно
>>word 2>&1
(см. Дублирование файловых дескрипторов ниже).
3.6.6 Документы Here
Этот тип перенаправления сообщает оболочке считывать ввод из текущего источника до тех пор, пока не будет встречена строка, содержащая только слово (без последующих пробелов). Все строки, считанные до этого момента, затем используются в качестве стандартного ввода (или файлового дескриптора n, если n указан) для команды.
Формат документов Here:
[n]<<[-]word
here-document
delimiter
Никакое расширение параметров и переменных, подстановка команд, арифметическое расширение или расширение имён файлов не выполняется для слово. Если какая-либо часть слово заключена в кавычки, разделитель — результат удаления кавычек из слово, и строки в документе Here не расширяются. Если слово не заключено в кавычки, все строки документа Here подвергаются расширению параметров, подстановке команд и арифметическому расширению, последовательность символов \newline игнорируется, и ‘\’ необходимо использовать для цитирования символов ‘\’, ‘$’ и ‘`’.
Если оператор перенаправления — ‘<<-’, все ведущие символы табуляции удаляются из строк ввода и строки, содержащей разделитель. Это позволяет документам Here внутри скриптов оболочки форматироваться с отступами естественным образом.
3.6.7 Here-строки
Вариант документов Here, формат:
[n]<<< word
слово подвергается расширению тильды, расширению параметров и переменных, подстановке команд, арифметическому расширению и удалению кавычек. Расширение имён файлов и разделение слов не выполняются. Результат предоставляется как единственная строка с добавленным новым символом строки в качестве команды на стандартном вводе (или файловом дескрипторе n, если он указан).
3.6.8 Дублирование файловых дескрипторов
Оператор перенаправления
[n]<&word
используется для дублирования файловых дескрипторов ввода. Если слово расширяется до одного или нескольких цифр, файловый дескриптор, обозначенный n, становится копией этого файлового дескриптора. Если цифры в слово не указывают на открытый для ввода файловый дескриптор, возникает ошибка перенаправления. Если слово принимает значение ‘-’, файловый дескриптор n закрывается. Если n не указан, используется стандартный ввод (файловый дескриптор 0).
Оператор
[n]>&word
используется аналогично для дублирования файловых дескрипторов вывода. Если n не указан, используется стандартный вывод (файловый дескриптор 1). Если цифры в слово не указывают на открытый для вывода файловый дескриптор, возникает ошибка перенаправления. Если слово принимает значение ‘-’, файловый дескриптор n закрывается. В качестве специального случая, если n опущен, и слово не расширяется до одного или нескольких цифр или ‘-’, стандартный вывод и стандартная ошибка перенаправляются, как описано ранее.
3.6.9 Перемещение дескрипторов файлов
Оператор перенаправления
[n]<&digit-
перемещает дескриптор файла digit в дескриптор файла n, или в стандартный ввод (дескриптор файла 0), если n не указан. digit закрывается после дублирования в n.
Аналогично, оператор перенаправления
[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