A ordem dos redirecionamentos é significativa . Por exemplo, o comando
ls > dirlist 2>&1
direciona a saída padrão e o erro padrão para o diretório do arquivo, enquanto o comando
ls 2>&1 > dirlist
direciona apenas a saída padrão para o arquivo dirlist, porque o erro padrão foi duplicado da saída padrão (normalmente ainda apontando para uma janela do terminal) antes que a saída padrão fosse redirecionada para o dirlist.
A princípio isso pode parecer contra-intuitivo, mas depois de pensar sobre isso, podemos entendê-lo.
Você encontra esta explicação em man bash
, no capítulo sobre redirecionamento,
REDIRECÇÃO
Antes de um comando ser executado, sua entrada e saída podem ser redirecionadas usando uma notação especial interpretada pelo shell. O redirecionamento permite que os comandos de arquivos sejam duplicados, abertos, fechados, feitos para se referir a arquivos diferentes e podem alterar os arquivos dos quais o comando lê e grava. Redirecionamento também pode ser usado para modificar identificadores de arquivo no ambiente de execução do shell atual. Os seguintes operadores de redirecionamento podem preceder ou aparecer em qualquer lugar dentro de um comando simples ou podem seguir um comando. Os redirecionamentos são processados na ordem em que aparecem, da esquerda para a direita.
Cada redirecionamento que pode ser precedido por um número de descritor de arquivo pode ser precedido por uma palavra do formulário
{varname}
. Nesse caso, para cada operador de redirecionamento, exceto>&-
e<&-
, o shell alocará um descritor de arquivo maior ou igual a 10 e o atribuirá avarname
. Se>&-
ou<&-
for precedido por{varname}
, o valor devarname
definirá o descritor de arquivo para fechar.Nas seguintes descrições, se o número do descritor de arquivo for omitido e o primeiro caractere do operador de redirecionamento for
<
, o redirecionamento se referirá à entrada padrão (descritor de arquivo 0). Se o primeiro caractere do operador de redirecionamento for>
, o redirecionamento se referirá à saída padrão (descritor de arquivo 1).A palavra seguinte ao operador de redirecionamento nas descrições a seguir, a menos que seja indicado, é submetida à expansão de chave, expansão de til, expansão de parâmetro e variável, substituição de comando, expansão aritmética, remoção de cotação, expansão de nome de caminho e divisão de palavras. Se ele se expande para mais de uma palavra, o bash relata um erro.
Observe que a ordem dos redirecionamentos é significativa. Por exemplo, o comando
ls > dirlist 2>&1
direciona a saída padrão e o erro padrão para o arquivo
dirlist
, enquanto o comandols 2>&1 > dirlist
direciona apenas a saída padrão para o arquivo
dirlist
, porque o erro padrão foi duplicado da saída padrão antes que a saída padrão fosse redirecionada paradirlist
.
Editar: as seguintes linhas de comando podem explicar o que acontece
Preparar
sudodus@xenial32:~$ touch qwerty;rm asdf
rm: cannot remove 'asdf': No such file or directory
Execute o comando list para um arquivo existente e um arquivo não existente
sudodus@xenial32:~$ ls qwerty asdf
ls: cannot access 'asdf': No such file or directory
qwerty
Redirecione a saída de erro antes de redirecionar a saída padrão. Apenas a saída padrão é redirecionada para o arquivo de saída.
sudodus@xenial32:~$ ls qwerty asdf 2>&1 > output-file ;echo '---';cat output-file
ls: cannot access 'asdf': No such file or directory
---
qwerty
Redirecione a saída de erro após redirecionar a saída padrão. Tanto a saída de erro quanto a saída padrão são redirecionadas para o arquivo de saída.
sudodus@xenial32:~$ ls qwerty asdf > output-file 2>&1 ;echo '---';cat output-file
---
ls: cannot access 'asdf': No such file or directory
qwerty
O token &>
pode ser usado para redirecionar o erro padrão e a saída padrão. Pode ser usado em bash
, mas pode não estar disponível em outros shells.
sudodus@xenial32:~$ ls qwerty asdf &> output-file ;echo '---';cat output-file
---
ls: cannot access 'asdf': No such file or directory
qwerty
sudodus@xenial32:~$