Está intercambiando stdout
y stderr
.
>name
significa redirigir la salida al archivo name
.
>&number
significa 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 0
para entrada estándar, 1
para salida estándar o 2
para 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 1
como el de 2
ir a /dev/tty
, por lo que si se ejecuta somecommand 3>&1 1>&2 2>&3
en 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 dialog
que vaya a la salida en stdout
lugar de stderr
por alguna razón.
Ver también Orden de redireccionamientos