Normalmente, precisamos apenas passar um argumento:
echo abc | cat
echo abc | cat some_file -
echo abc | cat - some_file
Existe uma maneira de passar dois argumentos? Algo como
{echo abc , echo xyz} | cat
cat `echo abc` `echo xyz`
Eu poderia apenas armazenar os dois resultados em um arquivo primeiro
echo abc > file1
echo xyz > file2
cat file1 file2
Mas então, sobrescrevi acidentalmente um arquivo, o que não está ok. Isso está entrando em um script não interativo. Basicamente, preciso de uma maneira de passar os resultados de dois comandos arbitrários cat
sem gravar em um arquivo.
UPDATE: Desculpe, o exemplo mascara o problema. Embora { echo abc ; echo xyz ; } | cat
pareça funcionar, a saída é devida ao echo
s, não ao cat
.
Um exemplo melhor seria o { cut -f2 -d, file1; cut -f1 -d, file2; } | paste -d,
que não funciona conforme o esperado.
Com
file1:
a,b
c,d
file2:
1,2
3,4
A produção esperada é:
b,1
d,3
RESOLVIDO:
Use substituição de processo :cat <(command1) <(command2)
Como alternativa, faça pipes nomeados usando mkfifo
:
mkfifo temp1
mkfifo temp2
command1 > temp1 &
command2 > temp2 &
cat temp1 temp2
Menos elegante e mais detalhado, mas funciona bem, desde que você garanta que temp1 e temp2 não existam antes.