Diferença entre o comando 'ls 2 tmp tmp' e o comando 'ls tmp'

1

Sou relativamente novo em sistemas Linux. Eu não entendo qual é a diferença entre ls 2>tmp >tmp e ls > tmp . Ambos parecem fazer essencialmente a mesma coisa, criando um arquivo tmp e armazenando o resultado do comando ls .

    
por AbKDs 27.05.2014 / 05:19

2 respostas

5

Uma resposta curta: ls 2>tmp >tmp redireciona os stdout e stderr para o arquivo tmp . enquanto ls > tmp apenas redireciona stdout para o arquivo tmp .

Tente ver a diferença:

$ ls asdsadasd 2>tmp >tmp
$ cat tmp
ls: cannot access asdsadasd: No such file or directory

$ ls asdsadasd > tmp
ls: cannot access asdsadasd: No such file or directory
$ cat tmp
<Nothing happen here>
    
por 27.05.2014 / 06:18
3

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
    
por 27.05.2014 / 08:42

Tags