Это обмен 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то причине.
Смотрите также Порядок перенаправлений