redirecionamento de pipe e stdin para cat

4

Por que

echo "hello world" | cat

funciona enquanto

cat < echo "hello world"

não? Minha intuição (incorreta) é que o pipe redirecionaria stdout para cat como stdin .

    
por irritable_phd_syndrom 12.11.2015 / 14:46

2 respostas

6

Temos duas coisas semelhantes, mas diferentes

  • Um pipeline

    echo "hello world" | cat   # This is a pipeline
    

    Os operadores de controle de canal ( | e |& ) conectam a saída de um comando à entrada da seguinte no pipeline. Portanto, o primeiro exemplo funciona , a saída do comando echo , "Hello word", está conectada com a entrada do seguinte comando cat , que assume a entrada padrão como arquivo de entrada mais especificado. Na verdade, podemos ler a partir de man cat :

    cat - concatenate files and print on the standard output

    e abaixo do exemplo com a simples invocação de cat

    cat Copy standard input to standard output

  • Um redirecionamento, ou melhor, uma tentativa de redirecionamento de entrada <

    cat < echo "hello world"   # This is an attempt of redirection 
    

    Nesse caso, o comando cat está recebendo sua entrada da entrada padrão que você redireciona com o operador < do arquivo à direita de < ... ou seja não é um arquivo. Isso é porque não funciona .

    Da seção de redirecionamento do man bash

    Redirecting Input
    Redirection of input causes the file whose name results from the expansion of word to be opened for reading on file descriptor n, or the standard input (file descriptor 0) if n is not specified.

  • No bash funciona por diferentes razões

    • cat <(echo "hello world") Substituição do processo

      Process substitution is supported on systems that support named pipes (FIFOs) or the /dev/fd method of naming open files. It takes the form of <(list) or >(list). The process list is run with its input or output connected to a FIFO or some file in /dev/fd. The name of this file is passed as an argument to the current command as the result of the expansion. If the >(list) form is used, writing to the file will provide input for list. If the <(list) form is used, the file passed as an argument should be read to obtain the output of list.

    • cat <<< $(echo "hello world") aqui strings

      The word undergoes brace expansion, tilde expansion, parameter and variable expansion, command substitution, arithmetic expansion, and quote removal. Path-name expansion and word splitting are not performed. The result is supplied as a single string to the command on its standard input.

Referências

  • man bash e procura por redirecionamento , pipeline , Aqui Strings e Processo de substituição
  • man cat só porque usamos ...
por 12.11.2015 / 15:41
0

Esse fluxo lê os arquivos. > está fora de um arquivo e < está em um arquivo. Demonstração:

Primeiro echo "HELLO HELLO HELLO" > HELLO.txt e, em seguida, cat < HELLO.txt obtém a saída

 HELLO HELLO HELLO

Meio inútil, já que a saída já está onde você deseja, mas outro exemplo com o mesmo HELLO.txt é cat < HELLO.txt >&1 explicitamente direcionando a saída de cat para STDOUT.

Mais útil, você algumas vezes encontra a saída do descritor de arquivo 2 (STDERR) sendo redirecionada com comandos como

grep somepattern /path/to/a_bunch_of_files/* 2>&1 >> alloutput.txt

O fluxo 2>&1 direciona os erros para a saída padrão. Em seguida, toda a saída padrão é transmitida para alloutput.txt. Isso colocaria a saída de erro no arquivo com saída padrão.

    
por 12.11.2015 / 15:30

Tags