Comportamento do pipe “|” no linux com “” redirecionamento de saída

5

Estou executando o comando

ls > a.txt | sort > b.txt

Este comando está fazendo as seguintes coisas:

  1. executando ls

  2. classificando-o

  3. criando a.txt e armazenando a saída classificada em a.txt

  4. criando b.txt , mas seu vazio .

Alguém pode explicar isso?

Estou implementando meu próprio shell para o qual preciso entender esse comportamento & simulá-lo.

    
por KrunalParmar 10.08.2015 / 18:45

3 respostas

14

O | pegará a saída do comando à esquerda e dará à entrada do comando à direita. O operador > pegará a saída do comando e a colocará em um arquivo. Isso significa que, no seu exemplo, quando chegar ao | , não haverá saída; está tudo em a.txt . Então, o sort à direita opera em uma string vazia e salva isso em b.txt

O que você provavelmente gostaria de usar é o comando tee , que irá gravar em um arquivo e stdout como

ls | tee a.txt | sort > b.txt

Embora eu esteja realmente curioso sobre o que você está tentando fazer, já que ls pode / irá classificar as coisas para você também.

    
por 10.08.2015 / 18:51
3

ls > a.txt | sort > b.txt

Você está executando ls . Então você está redirecionando somente o STDOUT do comando ls para a.txt . Então você está tentando também PIPE STDOUT para o STDIN do comando sort.

Como o STDOUT está sendo redirecionado para o arquivo a.txt , não há nada no STDIN do comando de classificação a ser classificado em b.txt , e é por isso que o arquivo está vazio.

Existem algumas maneiras de terminar com o conteúdo esperado no arquivo b.txt :

ls | sort > b.txt

ou

ls > a.txt ; cat a.txt | sort > b.txt

Ambos requerem realmente que dados em STDOUT à esquerda do PIPE sejam passados para STDIN à direita do PIPE.

    
por 10.08.2015 / 18:57
1

Semelhante ao que Tim e Eric dizem, quando você usa > para redirecionar o STDOUT para um arquivo, nada sobra para o | para canalizar para sort . Em vez disso, você pode usar tee , o que faz 2 coisas ao mesmo tempo :

  • Direciona STDIN para um arquivo
  • Direciona STDIN para STDOUT

Isso tem o resultado de salvar o STDIN (seu comando ls ) em um arquivo e continuá-lo no STDOUT para ser usado no comando sort . Aqui está o comando modificado que você está usando:

ls | tee a.txt | sort > b.txt
    
por 10.08.2015 / 21:17