C'est échanger stdoutet stderr.
>namesignifie rediriger la sortie vers le fichier name.
>&numbersignifie rediriger la sortie vers le descripteur de fichier number.
Donc, il &est nécessaire de dire au shell que vous voulez dire un descripteur de fichier, pas un nom de fichier.
Un descripteur de fichier est un numéro qui fait référence à un fichier déjà ouvert. Les standards sont 0pour l'entrée standard, 1pour la sortie standard ou 2pour l'erreur standard. Vous pouvez également utiliser n'importe quel autre nombre, ce qui créera un nouveau descripteur de fichier, comme lorsque vous créez une nouvelle variable avec var=value.
Par défaut, les deux descripteurs de fichier 1et 2aller à /dev/tty, de sorte que si vous exécutez somecommand 3>&1 1>&2 2>&3dans un nouveau shell, cela ne change rien (sauf que vous avez maintenant un descripteur de fichier numéro 3).
Mais si quelque part plus tôt dans le script effectue une redirection à l'aide de exec (par exemple exec 2>error.log), ou si le script est exécuté avec une ligne de commande incluant une redirection (par exemple ./thescript 2>error.log), alors permuter stdout et stderr fera quelque chose.
Dans votre cas spécifique, la commande dont les options stdout et stderr sont permutées est dialog. En regardant sa page de manuel , je vois
Some widgets, e.g., checklist, will write text to dialog's output.
Normally that is the standard error
alors, peut-être que la personne qui a écrit le script veut que dialogle résultat soit accessible au stdoutlieu de stderrpour une raison quelconque.
Voir aussi Ordre des redirections