Si sta scambiando stdout
e stderr
.
>name
significa reindirizzare l'output su file name
.
>&number
significa 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 0
per input standard, 1
per output standard o 2
per 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 1
e 2
vai a /dev/tty
, quindi se si esegue somecommand 3>&1 1>&2 2>&3
in 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 dialog
l'output vada stdout
invece che stderr
per qualche motivo.
Vedi anche Ordine dei reindirizzamenti