Redirecionamento de comandos para múltiplos arquivos: comando file1 file2 [duplicate]

9

Eu tenho este comando:

cat somefile >file1 >file2

Depois de executar este comando, não consigo descobrir por que file1 não tem nada nele. Ele deve ter a saída do primeiro arquivo ( somefile ), mas nada está nele.

Você pode me explicar por que não copia ou grava minha saída de somefile ? ( file2 contém minha saída, mas file1 não contém nada)

    
por Charlie Albert 09.10.2015 / 21:50

3 respostas

15

Eu acho que há uma diferença entre como você acha que o redirecionamento de shell funciona e como ele realmente funciona.

Você não pode redirecionar a saída do shell várias vezes e esperar que ele seja redirecionado para todos os locais que você especificou. Em vez disso, ele será redirecionado apenas para o último local, que no seu caso é file2 . A resposta do Chaos fornece uma explicação decente sobre como esse redirecionamento de E / S funciona.

O que você realmente quer fazer é:

$ cat example.txt | tee file1 > file2

tee é um programa que lê a entrada padrão e grava em vários descritores de arquivo. Um deles é sempre a saída padrão. Portanto, usamos tee para gravar a saída em file1 e, em seguida, redirecionar seu stdout para file2 .

Além disso, com base nas sugestões nos comentários, essa é uma maneira melhor de fazer o que você está procurando:

$ tee file1 > file2 < example.txt

Essa abordagem tem a vantagem de redirecionar o stdin em vez de tentar ler sobre um pipe. Isso significa que o shell agora precisa gerar um processo a menos. Também elimina o que é conhecido como "Uso inútil de gato".

    
por 09.10.2015 / 22:03
9

O que você fez é chamado Redirecionamento de E / S . >file redireciona a saída padrão (stdout) para o dado file . No seu caso, você fez isso duas vezes. O shell não manipula um redirecionamento da mesma saída várias vezes.

Neste caso:

cat somefile >file1 >file2

O shell processa os redirecionamentos antes que o comando ( cat somefile ) seja executado. Isso significa que o > trunca o arquivo para o tamanho zero, porque você substitui o conteúdo dos arquivos. O arquivo deve estar vazio antes que o shell possa executar o comando. Isso é feito com os redirecionamentos > .

Agora, o segundo ( >file2 ) substitui o primeiro ( >file1 ), porque o shell processa o redirecionamento na ordem da aparência. Então, o último é aquele que será efetivamente usado. A saída de cat somefile será, portanto, redirecionada para file2 e file1 será truncada para comprimento zero.

Redirecionando stdout para múltiplos processos / arquivos pode ser feito com tee assim:

cat somefile | tee file1 file2 file3 fileX

Isto irá imprimir o conteúdo para stdout e para todos os arquivos dados como parâmetros.

    
por 09.10.2015 / 22:03
2

Em zsh com conjunto de opções MULTIOS , você pode usar:

cat somefile >file1 >file2

como neste caso, zsh de ação é semelhante a tee .

    
por 10.10.2015 / 04:54