Одна из лучших статей о том, что "2> & 1" я видел, - это Объяснения Bash One-Liners, Часть III: Все о перенаправлениях .
Но что текущие ответы на этот вопрос не дают, так это то, почему вы захотите сделать это после простого «exec». Как объясняется на странице руководства bash для команды exec: «Если команда не указана, любые перенаправления вступают в силу в текущей оболочке».
Я написал простой скрипт с именем out-and-err.py
, который записывает строку вывода в stdout, а другую строку в stderr:
#!/usr/bin/python
import sys
sys.stdout.write('this is stdout.\n')
sys.stderr.write('this is stderr.\n')
И затем я обернул это в сценарий оболочки с именем out-and-err.sh как "exec 2> & 1":
#!/bin/bash
exec 2>&1
./out-and-err.py
Если я запускаю только скрипт на python, stdout и stderr разделяются:
$ ./out-and-err.py 1> out 2> err
$ cat out
this is stdout.
$ cat err
the is stderr.
Но если я запускаю сценарий оболочки, вы можете видеть, что exec позаботится о stderr для всего после:
$ ./out-and-err.sh 1> out 2> err
$ cat out
this is stdout.
this is stderr.
$ cat err
$
Если ваш сценарий оболочки-оболочки делает намного больше, чем просто одна команда python, и вам нужно объединить весь вывод в stdout, выполнение "exec 2> & 1" сделает это для вас простым.