Note que você não deve fazer:
ls 2> tmp > tmp
Acima do shell, abre tmp
para escrever no descritor de arquivo 2, então ele abre tmp
para escrever novamente no descritor de arquivo 1 e, em seguida, executa ls
. Você terá dois descritores de arquivos apontando para duas descrições separadas de arquivos abertos para o mesmo arquivo.
Se ls
gravar em seu descritor de arquivo 1 (stdout para a lista de arquivos) e no descritor de arquivo 2 (stderr para as mensagens de erro), essas saídas serão substituídas (supondo que tmp
seja um arquivo regular e não um pipe nomeado).
Na verdade, a saída stdout será armazenada em buffer, portanto, é mais provável que seja gravada no final antes de ls
sair, portanto, sobrescreverá a saída stderr.
Exemplo:
$ ls /x /etc/passwd 2> tmp > tmp
$ cat tmp
/etc/passwd
ccess /x: No such file or directory
Você deve usar:
ls > tmp 2>&1
ou
ls 2> tmp >&2
Nesse caso, o shell abre tmp
no fd 2 e depois duplica o fd no fd 1, portanto ambos os fd 1 e 2 compartilharão a mesma descrição de arquivo aberto para tmp
e as saídas não irão sobrescrever uma à outra .
$ ls /x /etc/passwd 2> tmp >&2
$ cat tmp
ls: cannot access /x: No such file or directory
/etc/passwd