Недеструктивное перенаправление вывода и ввод до разделителя. Эффект от использования символа > (больше) для перенаправления вывода в файл является деструктивным. Иными словами, команда
$ ls > file-list
уничтожит содержимое файла file-list , если этот файл ранее существовал, и создаст на его месте новый файл. Если вместо этого перенаправление будет сделано с помощью символов >> , то вывод будет дописан в конец указанного файла, при этом исходное содержимое файла не будет уничтожено. Например, команда
$ ls >> file-list
дописывает вывод команды ls в конец файла file-list .
Симметричная по виду запись перенаправления ввода (с помощью символов <<) используется для организации так называемого ввода до разделителя:
$ cat < Здесь командный интерпретатор, встретив оператор перенаправления <<, запомнил последовательность символов после него (END) как разделитель потока ввода. Все последующие строки, вплоть до строки, содержащей только этот разделитель, были переданы на вход команды cat в виде потока ввода.
Следует иметь в виду, что перенаправление ввода и вывода и стыковка команд осуществляются командными оболочками, которые поддерживают использование символов > , >> , | и др. Сами команды специальным образом эти символы не интерпретируют. Если нужно передать в команду один из этих символов в качестве параметра или использовать внутри передаваемой как параметр строки, то сделать это можно или «экранировав» одиночный спецсимвол с помощью символа обратного слеша (например, \< ), или используя одинарные кавычки для выделения подстроки целиком.
Перенаправление потока вывода ошибок. По-умолчанию операторы перенаправления > и >> изменяют передаваемый запускаемой программе файловый дескриптор с номером 1 – который соответствует потоку вывода. Возможно отдельно задать номер изменяемого файлового дескриптора, указав его перед операторами. Потоку вывода ошибок соответствует файловый дескриптор 2: т. е., например, для перенаправления вывода ошибок команды mkdir в /dev/null можно записать:
$ mkdir /etc/my-directory 2> /dev/null
Можно одновременно перенаправить и поток вывода, и поток ошибок:
$ ls -R /var/log/ 2>stderr >stdout
Здесь вывод команды ls -R ( -R — рекурсивно по всем подкаталогам) выводится в файл stdout , а сообщения об ошибках – в файл stderr .
Также можно перенаправить стандартный поток ошибок в стандартный поток вывода – операторы перенаправления позволяют указать вместо имени файла номер файлового дескриптора в формате &номер :
$ ls -R /var/log/ 2>&1
При использовании одновременно перенаправления и стандартного потока вывода, и стандартного потока ошибок важен порядок операций:
$ ls -R /var/log/ 2>&1 >/dev/null $ ls -R /var/log/ >/dev/null 2>&1
Первая команда присвоит файловому дескриптору потока ошибок значение файлового дескриптора потока вывода, и далее перенаправит поток вывода в /dev/null . В итоге сообщения об ошибках будут выводится в поток вывода (т. е. при запуске из терминала — на экран), а сам вывод команды будет перенаправляться в /dev/null .
Вторая команда сначала переопределит поток вывода, направив его в /dev/null , а потом присвоит потоку вывода ошибок значение файлового дескриптора потока вывода. В итоге, весь вывод команды – и стандартный, и сообщения об ошибках, - будет направлен в /dev/null .
Одновременное перенаправление в один и тот же файл и потока стандартного вывода, и потока ошибок встречается очень часто — для упрощения записи в ряде командных интерпретаторов, в т.ч. в Bash, есть дополнительный оператор перенаправления &> , переназначающий оба потока вывода сразу:
$ mkdir /etc/my-directory &> /dev/null
Узнать о результате выполнения команды при перенаправлении всего её вывода в устройство /dev/null можно, проанализировав код возврата.
|