Это обмен stdout
и stderr
.
>name
означает перенаправить вывод в файл name
.
>&number
означает перенаправить вывод в дескриптор файла number
.
Таким образом, &
необходимо указать оболочке, что вы имеете в виду дескриптор файла, а не имя файла.
Файловый дескриптор - это число, которое относится к уже открытому файлу. Стандартные предназначены 0
для стандартного ввода, 1
для стандартного вывода или 2
для стандартной ошибки. Вы также можете использовать любой другой номер, который создаст новый файловый дескриптор, так же как и при создании новой переменной с помощью var=value
.
По умолчанию и дескриптор файла, 1
и 2
переход к нему /dev/tty
, поэтому, если вы запустите somecommand 3>&1 1>&2 2>&3
новую оболочку, она ничего не изменит (за исключением того, что теперь у вас есть дескриптор файла номер 3).
Но если где-то ранее в скрипте он выполняет перенаправление с использованием exec (например exec 2>error.log
), или сценарий запускается с командной строкой, включающей перенаправление (например ./thescript 2>error.log
), тогда замена stdout и stderr сделает что-то.
В вашем конкретном случае команда, у которой поменялись местами stdout и stderr dialog
. Глядя на его справочную страницу , я вижу
Some widgets, e.g., checklist, will write text to dialog's output.
Normally that is the standard error
так что, возможно, человек, который написал сценарий, хочет, чтобы dialog
вывод по какой-то причине пошел по stdout
какой- stderr
то причине.
Смотрите также Порядок перенаправлений