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

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

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

Каждое перенаправление, которому предшествует число дескриптора файла, вместо него может стоять слово вида {ИмяПеременной}. В этом случае для каждого оператора перенаправления кроме «>&-» и «<&-», оболочка будет выделять дескриптор файла более 10 и присвоит его ИмяПеременной. Если «>&» или «<&» предшествуют {ИмяПеременной}, значение переменной определяет дескриптор файла для закрытия.

В следующем описании если число дескриптора файла не указано, и первый символ является оператором перенаправления «<», выполняется перенаправление стандартного ввода (дескриптор файла 0). Если первый символ является оператором перенаправления «>», выполняется перенаправление стандартного вывода (дескриптор файла 1).

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

Отмечу что порядок перенаправления является значительным. Например команда.

ls > dirlist 2>&1

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

ls 2>&1 > dirlist

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

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 следует использовать с осторожностью, потому что они могут конфликтовать с файловыми дескрипторами shell использующимися для внутренних целей.

Стоит отметить что встроенная команда exec может сделать перенаправление в текущей оболочке.

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

 

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

 

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

 

[n]<слово

 

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

 

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

 

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

 

[n]>слово

 

Если оператор перенаправления «>» и опция встроенной команды set, noclobber была включена, то переадресация будет ошибочной, если файл, имя которого получается в результате подстановки слов существует и является обычным файлом. Если это оператор перенаправления «>|» или оператор перенаправления «>» но опция noclobber встроенной команды set не включена, перенаправление выполняется даже если файл с именем слова существует.

 

Добавление перенаправления выхода

 

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

 

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

 

[n]>>слово

 

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

 

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

 

Есть два формат для перенаправления стандартного вывода и вывода об ошибке:

 

&>слово

 

и

 

>&слово

 

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

 

>слово 2>&1

 

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

 

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

 

&>>слово

 

Это семантически эквивалентно

 

>>слово 2>&1

 

Here-document

 

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

 

Формат документации здесь выгдядит:

 

<<[-]слово

here-document

delimiter

 

Нет параметров расширения, подстановки команд, арифметических расширений или расширения имен файлов, пока выполняется слово. Если какой-либо символ в слове является кавычкой, разделителем является результат удаления кавычек в слове, и линии в here-document не расширяются. Если слово без кавычек, все линии here-document подвергаются параметрам расширения, подстановке команд, и арифметических расширений. В ином же случае, последовательность символов «\» игнорируется и «\» должен использовать кавычки символы «\», «$» и «».

 

Если оператором перенаправления является «<<-», то все ведущие символы табуляции удаляются из входящих линий и строки содержащий контайнеры.Это позволяет here-documents в shell скриптах с отступом естественным образом.

 

Here Strings

 

Переменная here-document формата:

 

<<<слово

 

Слово раскрывается и передается этой команде на стандартный ввод.

 

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

 

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

 

[n]<&слово

 

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

 

Оператор

 

[n]>&слово

 

используется аналогично дублирования дескрипторов выходного файла. Если «n» не указано, стандартный вывод (дескриптор файла 1) используется. Если цифры с слове не указывают дескриптор файла открываемого для вывода, возникает ошибка перенаправления. Как частный случай, если «n» не указана и слово не расширяется к одной или более цифрам, стандартный вывод и стандартная ошибка перенаправляются как было описано ранее.

 

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

 

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

 

[n]<&digit-

 

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

 

Кроме того, оператор перенаправления

 

[n]>&digit-

 

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

 

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

 

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

 

[n]<>слово

 

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *