Está trocando stdout
e stderr
.
>name
significa redirecionar a saída para o arquivo name
.
>&number
significa redirecionar a saída para o descritor de arquivo number
.
Portanto, &
é necessário informar ao shell que você quer dizer um descritor de arquivo, não um nome de arquivo.
Um descritor de arquivo é um número que se refere a um arquivo já aberto. Os padrões são 0
para entrada padrão, 1
para saída padrão ou 2
para erro padrão. Você também pode usar qualquer outro número, o que criará um novo descritor de arquivo, assim como quando você cria uma nova variável com var=value
.
Por padrão, tanto o descritor de arquivo 1
como o 2
acessam /dev/tty
, portanto, se você executar somecommand 3>&1 1>&2 2>&3
em um novo shell, ele não muda nada (exceto agora você tem um descritor de arquivo número 3).
Mas se em algum lugar anterior do script ele faz um redirecionamento usando exec (por exemplo exec 2>error.log
), ou o script é executado com uma linha de comando incluindo o redirecionamento (por exemplo ./thescript 2>error.log
), a troca de stdout e stderr fará alguma coisa.
No seu caso específico, o comando que está trocando stdout e stderr é dialog
. Olhando para sua página de manual , vejo
Some widgets, e.g., checklist, will write text to dialog's output.
Normally that is the standard error
então talvez a pessoa que escreveu o script queira dialog
ir para a saída, em stdout
vez de stderr
por algum motivo.
Veja também Ordem de redirecionamentos