Uma terceira maneira, que funciona pelo menos com o GNU bash 4.2.37 e deve funcionar com qualquer bash recente e possivelmente com outras shells (não sei como geralmente suportado <()
é), é redirecionar a entrada de um comando .
$ echo hello > test
$ echo my > test
$ echo beautiful > test
$ cat <(cat test; echo world)
hello
my
beautiful
world
$
A idéia é criar primeiro o arquivo e, em seguida, lançar cat
redirecionando seu stdin da saída da sequência de comandos cat test; echo world
. Como visto na saída, essa entrada se torna a concatenação da saída de todos os comandos de redirecionamento de entrada.
Uma maneira alternativa de expressar a mesma coisa, que pode ser mais portável, é simplesmente reescrevê-la como um pipe de subshell simples em um comando:
(cat test; echo world) | cat
Note que os comandos são executados sequencialmente, mas sua saída se torna um único fluxo na entrada do comando externo ou próximo. Assim, enquanto o cat
externo no exemplo acima não vê nenhum EOF ou algo assim, se invocar os comandos internos for caro de alguma forma, você pagará esse preço várias vezes. Eu duvido que haja alguma maneira de contornar isso.