-
Sim. Mais precisamente, no shell, um pipe conecta a saída padrão do comando à esquerda à entrada padrão do comando à direita. Ainda mais precisamente, o que
foo | bar
significa para o shell é:- Crie um canal .
- Bifurque um processo filho e conecte a extremidade de gravação do canal à sua saída padrão. Em seguida, execute
foo
nesse processo filho. - Bifurque um processo filho e conecte a extremidade de leitura do tubo a sua entrada padrão. Em seguida, execute
bar
nesse processo filho. - Aguarde a conclusão dos dois processos filhos.
-
Sim. Redirecionamentos comuns indicam um arquivo por nome:
>foo
. Outra forma de redirecionamento indica um arquivo pelo descritor . Por exemplo,>&2
significa "redirecionar a saída padrão para qualquer que seja o descritor de arquivo 2 conectado no momento".Nesse tópico, observe que os redirecionamentos são processados da esquerda para a direita. Por exemplo, para redirecionar a saída padrão e o erro padrão para o mesmo arquivo, use
foo >filename 2>&1
. O comandofoo 2>&1 >filename
digitado em um terminal primeiro conectaria o erro padrão ao terminal (que tanto a saída padrão quanto o erro padrão ainda estão conectados naquele ponto, então não faria qualquer diferença), então conecte a saída padrão ao arquivo . -
Sim, mas. A construção de pipe no shell cria um pipe anônimo; há também canais nomeados .
mkfifo f cat f # (in another terminal) echo hello >f
Os pipes nomeados são muito mais raros que os pipelines. Eles são usados quando é necessário conectar dois processos que são iniciados independentemente; isso não acontece com muita frequência, mas é bom tê-lo quando necessário.
Observe que a substituição que você deu:
foo >tempfile; bar <tempfile
é diferente: primeirofoo
grava toda a sua saída no arquivo temporário e, em seguida,bar
começa a ser executado. Com um pipeline, os comandos são executados em paralelo. -
Sim, mas não é muito útil.
cat input_file | some_command # a uselessly complicated way of writing some_command <input_file echo hello | tee output_file # a uselessly complicated way of writing echo hello >output_file