porque os pipes são usados em vez do redirecionamento de entrada

0

Sou novo em sistemas Linux e realmente não consigo entender por que precisamos de duas operadoras que possam redirecionar a saída: pipe como | e ouputar operador de redirecionamento > ? Não podemos apenas usar o segundo? Na maioria das vezes, vejo que o pipe é usado se vários comandos estiverem encadeados. Se, no entanto, a saída for redirecionada para o arquivo, como em echo 'hello' > filename , o operador de redirecionamento de saída será usado. O que estou perdendo aqui?

    
por Max Wizard K 26.06.2014 / 12:33

4 respostas

2

O ponto-chave a ser lembrado é que pipes são dispositivos de comunicação entre processos que permitem dois processos (e isso é o que os comandos realmente são) para trocar dados, enquanto os operadores de redirecionamento são para manipular gravações de processos específicos.

No vídeo Unix Pipeline , o criador da linguagem awk e uma das pessoas originais que trabalharam no AT & T Unix Brian Kernighan explica:

% bl0ck_qu0te%

Como você pode ver, dentro do contexto em que os pipelines foram criados, eles na verdade não eram apenas dispositivos de comunicação, mas também economizam espaço de armazenamento e simplificam o desenvolvimento. Claro, podemos usar o redirecionamento de saída / entrada para tudo (especialmente hoje em dia com a capacidade de armazenamento no intervalo de terabytes), porém isso seria ineficiente do ponto de vista de armazenamento e também velocidade de processamento - lembre-se de que você está alimentando diretamente a saída de um comando para outro com | . Considere algo como command1 | grep 'something' . Se você escrever a saída de command1 primeiro em um arquivo, levará algum tempo para escrever tudo e, em seguida, deixar grep percorrer todo o arquivo. Com o pipeline e o fato de que a saída é armazenada em buffer (o que significa que o processo do lado esquerdo faz uma pausa antes que o processo do lado direito esteja pronto para ser lido novamente), a saída vai diretamente de um comando para outro, economizando tempo.

Vale a pena notar que, para a comunicação entre processos, há um caso de uso de pipes nomeados , ao qual você pode usar o operador > para escrever a partir de um comando e < para permitir que outro comando seja lido, e é um caso de uso em que você deseja ter um destino particular no sistema de arquivos onde vários scripts / comandos podem gravar e concordar esse destino específico. Mas quando é desnecessário, o pipe anônimo | é tudo o que você realmente precisa.

    
por Sergiy Kolodyazhnyy 20.08.2018 / 03:43
4

Eu acredito que o < > os operadores são usados para ler / escrever arquivos enquanto | O símbolo é usado para canalizar o stdout de um comando para outro.

cal | less 

permite visualizar a saída de cal em um comando chamado less.

cal > less

coloca a saída de cal em um arquivo chamado less.

    
por John Hunt 26.06.2014 / 12:34
4
  • | são usados para enviar a saída de um comando como entrada para o outro comando que vem depois do símbolo do pipe.

    $ echo foo | grep -o 'f'
    f
    
  • Para redirecionar a saída de um comando para um arquivo, você pode usar um operador > de redirecionamento de saída.

    $ echo foo > file1
    

    Grava foo no arquivo1. Você não precisa criar manualmente esse arquivo.

  • Se você quiser redirecionar a saída para muitos arquivos, use o comando tee .

    echo foo | tee file1 file2
    

    Grava foo no arquivo1 e no arquivo2. Você não precisa criar manualmente esses arquivos. Agora o arquivo1 e o arquivo2 contêm apenas a string foo .

por Avinash Raj 26.06.2014 / 12:37
3

Há muita conversa sobre o redirecionamento de saída, mas achei que essa questão era sobre entrada. Eu vou ignorar > e >> porque eles não têm nada a ver com entrada. Em vez disso, vou focar em < , <(...) e | :

  • < espera ler de um arquivo em STDIN while,
  • <(...) fornece um identificador de arquivo para o STDOUT de um comando ( ... here)
  • | pipes STDOUT de um processo para o STDIN do próximo

Portanto, o < não é diretamente equivalente a um pipe (está lendo de um arquivo) e o <(...) está lendo do lugar certo, mas está dando um identificador de arquivo como uma saída. Você precisa combiná-los para oferecer um equivalente a um tubo.

a | b
< <(a) b

Apenas lendo isso, espero que isso explique porque o pipe existe. É muito mais legível.

    
por Oli 26.06.2014 / 15:51