Como o redirecionamento em um símbolo funciona em uma sequência?

7

Eu tenho file1, file2, file3.

file1 contém 1

file2 contém 2

file3 contém 3

Eu uso o comando

cat file1 > file2 > file3

Resultados em:

arquivo1 1

arquivo2 (não contém nada)

arquivo3 1

Por que algo ao longo desta linha é destruído? Basicamente, o que eu não estou vendo nos bastidores?

(Notas laterais usando "append" >> é ainda mais estranho)

    
por No Time 04.02.2015 / 04:59

2 respostas

14

Redirecionamentos em shells do estilo Bourne / POSIX como o bash , dash, ksh , etc.

processed in the order they appear, from left to right

> x abre e trunca arquivo x e define o descritor de arquivo que grava em x como saída padrão. Seu comando:

cat file1 > file2 > file3

  1. Abra e trunque file2
  2. Definir saída padrão para gravar no descritor de arquivo
  3. Abra e trunque file3
  4. Definir saída padrão para gravar no descritor de arquivo
  5. Executar cat file1

O resultado final é que a saída padrão aponta para file3 no momento em que cat é executado. Tanto file2 como file3 têm seu conteúdo atual apagado, e file3 obtém a saída de cat (o conteúdo de file1 ) gravado nele.

Se você quiser dividir a saída em vários fluxos gravados em arquivos separados, você pode usar tee :

cat file1 | tee file2 > file3

Outros shells ( notavelmente zsh ) se comportam de maneira diferente, e seu comando teria o resultado que você provavelmente esperava: ambos file2 e file3 teriam o conteúdo de file1 .

Note que cat não é necessário aqui; O redirecionamento de < input também funcionaria bem.

    
por 04.02.2015 / 05:18
9

Quando você redireciona um fd várias vezes, todos os redirecionamentos são executados e o último fica:

$ strace -f -e open bash -c 'cat file1 > file2 > file3'
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
...
[pid 20508] open("file2", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
[pid 20508] open("file3", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
...
[pid 20508] open("file1", O_RDONLY)     = 3

Portanto, file2 foi aberto e truncado e, em seguida, file3 foi aberto.

    
por 04.02.2015 / 05:17