Está intercambiando stdouty stderr.
>namesignifica redirigir la salida al archivo name.
>&numbersignifica redirigir la salida al descriptor de archivo number.
Por lo tanto, &se necesita para decirle al shell que quiere decir un descriptor de archivo, no un nombre de archivo.
Un descriptor de archivo es un número que se refiere a un archivo ya abierto. Los estándares son 0para entrada estándar, 1para salida estándar o 2para error estándar. También puede usar cualquier otro número, que creará un nuevo descriptor de archivo, al igual que cuando crea una nueva variable con var=value.
Por defecto, tanto el descriptor de archivo 1como el de 2ir a /dev/tty, por lo que si se ejecuta somecommand 3>&1 1>&2 2>&3en un nuevo shell, no cambia nada (excepto que ahora tiene un descriptor de archivo número 3).
Pero si en algún lugar anterior en el script hace una redirección usando exec (por ejemplo exec 2>error.log), o el script se ejecuta con una línea de comando que incluye la redirección (por ejemplo ./thescript 2>error.log), entonces intercambiar stdout y stderr hará algo.
En su caso específico, el comando que tiene sus stdout y stderr intercambiados es dialog. Mirando su página de manual , veo
Some widgets, e.g., checklist, will write text to dialog's output.
Normally that is the standard error
Entonces, tal vez la persona que escribió el guión quiere dialogque vaya a la salida en stdoutlugar de stderrpor alguna razón.
Ver también Orden de redireccionamientos