Isso funcionará (em princípio) em qualquer shell, mas requer uma “versão recente suficiente” do sistema operacional:
wget -O- www.example.com | baz /dev/stdin
Quando existe /dev/stdin
, normalmente é um link simbólico para /proc/self/fd/0
, por isso, se sua caixa não tiver /dev/stdin
, verifique /proc/self/fd/0
.
Claro que a invenção dos tubos foi uma das grandes inovações do Unix. 1 Arquivos intermediários temporários são bons em princípio, mas pode ter custos de desempenho, e no caso de
program_that_produces_gobs_of_output | grep regular_expression_that_matches_very_few_lines
você provavelmente tem o problema de não conseguir ajustar o arquivo (toda a saída do primeiro comando) no disco. Então, o melhor dos dois mundos é usar um pipe nomeado. Isso permite capturar a saída padrão de algum programa 2 e fornecê-lo como entrada para outro programa como um parâmetro de nome de caminho:
f=$(mktemp) && rm -f "$f" && mkfifo "$f"
$1 >> "$f" &
$2 "$f"
rm -f "$f"
O primeiro rm -f "$f"
é necessário
porque mktemp
não apenas gera um nome de arquivo;
cria o arquivo.
Se não removê-lo, o mkfifo
falhará.
(Como alternativa, poderíamos usar mktemp -u
,
que gera um nome de arquivo sem criar um arquivo.)