Si sta scambiando stdoute stderr.
>namesignifica reindirizzare l'output su file name.
>&numbersignifica reindirizzare l'output al descrittore di file number.
Quindi &è necessario dire alla shell che intendi un descrittore di file, non un nome di file.
Un descrittore di file è un numero che fa riferimento a un file già aperto. Quelli standard sono 0per input standard, 1per output standard o 2per errore standard. Puoi anche usare qualsiasi altro numero, che creerà un nuovo descrittore di file, proprio come quando crei una nuova variabile con var=value.
Per impostazione predefinita, entrambi descrittori di file 1e 2vai a /dev/tty, quindi se si esegue somecommand 3>&1 1>&2 2>&3in una nuova shell, non cambia nulla (tranne ora che si dispone di un descrittore di file numero 3).
Ma se da qualche parte in precedenza nello script esegue un reindirizzamento usando exec (ad es. exec 2>error.log), Oppure lo script viene eseguito con una riga di comando che include il reindirizzamento (ad es. ./thescript 2>error.log), Lo scambio di stdout e stderr farà qualcosa.
Nel tuo caso specifico, il comando che sta cambiando stdout e stderr è dialog. Guardando la sua pagina man , vedo
Some widgets, e.g., checklist, will write text to dialog's output.
Normally that is the standard error
quindi forse la persona che ha scritto la sceneggiatura vuole che dialogl'output vada stdoutinvece che stderrper qualche motivo.
Vedi anche Ordine dei reindirizzamenti