redirecionamento e pipeline

6

Eu queria saber sobre diferenças e relação entre redirecionamento e pipeline.

  1. O pipeline é usado apenas para conectar saída stdout de um comando para stdin entrada de outro comando?
  2. O redirecionamento é usado apenas para conectar uma saída stdout de um comando para um arquivo e conectar um arquivo a um entrada de stdin de um comando? Mas lá parece ser command >& 2 .
  3. Um pipeline com1 | com2 pode ser substituído por redirecionamento como com1 > tempfile; com2 < tempfile . Pode o substituição ser modificada para ser sem usar um arquivo?
  4. Um redirecionamento pode ser substituído por um gasoduto?

Obrigado e cumprimentos!

    
por Tim 10.07.2011 / 01:12

2 respostas

8
  1. 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 é:

    1. Crie um canal .
    2. 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.
    3. Bifurque um processo filho e conecte a extremidade de leitura do tubo a sua entrada padrão. Em seguida, execute bar nesse processo filho.
    4. Aguarde a conclusão dos dois processos filhos.
  2. 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 comando foo 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 .

  3. 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: primeiro foo 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.

  4. 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
    
por 10.07.2011 / 01:53
4

1) Sim (ao lado de stderr)

prg 2>&1 | workwithboth

2) Sim (ao lado de stderr).

3) Não. Não exatamente.

com1 > tempfile; com2 < tempfile. 

começará com2 depois de terminar com1, enquanto

com1 | com2 

pode processar o início da saída de com1 com com2 imediatamente. E sim - sem um arquivo: use um pipeline.

4) Você pode usar uma janela como uma porta e uma porta como uma janela, mas por que você deveria? Havia razões para construir portas e janelas - elas não caíam do céu.

    
por 10.07.2011 / 01:45