понимание команды bash "exec 1> & 2" - PullRequest
11 голосов
/ 17 января 2012

Я видел bash-скрипт, в функции которого входила команда exec 1>&2.Что-то вроде:

function example()
{
    exec 1>&2
    cat <<EOT
Script requires at least one parameter.
EOT
    exit 1
} 

Как я понимаю, exec 1>&2 означает, что все, начиная с этой точки, будет направлено на stderr .Это какое-то фиксированное поведение exec , которое нужно знать наизусть, или есть какое-то хорошее объяснение этому?Я имею в виду, насколько я понимаю, exec в скрипте Bash просто вызывает команду , принимающую тот же PID, который был у скрипта Bash, и после завершения команды PIDубит. 1> & 2 не является командой.Может ли кто-нибудь объяснить детали (особенно вопрос почему ), стоящий за командой exec 1>&2?

Ответы [ 3 ]

17 голосов
/ 17 января 2012

exec - это встроенная функция Bash, поэтому она может иметь особое поведение, которого не может иметь внешняя программа. В частности, он имеет специальное поведение, которое:

Если COMMAND не указан, любые перенаправления вступают в силу в текущей оболочке.

(Это цитата из сообщения help exec.)

Это относится к любому виду перенаправления; Вы также можете написать, например, любой из них:

exec >tmp.txt
exec >>stdout.log 2>>stderr.log
exec 2>&1

(однако не , однако, применяется к трубам.)

10 голосов
/ 17 января 2012

Почему это случайность истории, нет веских причин для этого.

Операторы перенаправления применяются к любой программе (например, cat), и была добавлена ​​форма >&, чтобы выразить «дубликат дескриптора файла 1 из 2», потому что это было полезно. Синтаксис >&, вероятно, использовался, потому что у них заканчивались специальные символы, а >& был бессмысленным, учитывая базовое значение & и > (но не цитируйте меня по этому поводу). Все это относится к ранней оболочке Борна, примерно в 1977 году.

Почему exec плюс перенаправление для изменения входа и выхода текущей оболочки? Возможно, потому, что уже было значение для пустой команды > path, которая имела тот же эффект, что и cat /dev/null > path, но ее было легче набирать, и когда ваш телетайп работал в лучшем случае со скоростью 10 символов в секунду, это имело значение. Таким образом, встроенный exec был перегружен: без аргументов он применил к себе операции перенаправления.

Поскольку bash старается придерживаться конвенции оболочки Bourne в максимально возможной степени, вы получаете эти древности, о которых, как вы подозреваете, вам просто нужно помнить, особенно если вы пытаетесь произвести впечатление на других представителей соответствующего пола (т.е. парень, который знает свое перенаправление ввода / вывода ").

2 голосов
/ 17 января 2012

Оригинальный источник: http://tldp.org/LDP/abs/html/x17784.html

Команда exec

Аналогично, команда exec> filename перенаправляет стандартный вывод в указанный файл. Это отправляет все выходные данные команды, которые обычно идут на стандартный вывод в этот файл.

Обратите внимание, что exec N> filename влияет на весь скрипт или текущую оболочку. Перенаправление в PID скрипта или оболочки с этого момента изменилось. Однако N> имя файла влияет только на вновь разветвленный процесс, а не на весь скрипт или оболочку.

Дальнейшее чтение, которое вас заинтересует, можно найти @ http://tldp.org/LDP/abs/html/io-redirection.html. Существует множество хитрых перенаправлений, которые можно сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...