
Isso funciona perfeitamente:
./foo | ./bar
Mas eu gostaria de algo assim:
./bar <| ./foo
Assim, posso fazer o contrário e alterar os argumentos de foo mais rapidamente na linha de comando.
O pipe precisa estar em tempo real - meu foo
programa nunca retorna.
Isso é possível ?
Responder1
Uma maneira simples e adequada pode ser definir uma função foobar,
foobar () { ./foo "$@" | ./bar ; }
(seja na linha de comando, conforme necessário, ou em alguns scripts de inicialização, como ".bashrc" por exemplo). Então, sempre que você fizer:
foobar "this" that "and this also"
isso vai fazer
./foo this that "and this also" | ./bar
Responder2
./bar < <( ./foo )
Por exemplo:cat < <(echo "hello there!")
Para entender como funciona, considere partes do script separadamente.
Esta sintaxe: cat < /path/to/file
irá ler o arquivo /path/to/file
e canalizá-lo como stdin para cat
.
Esta sintaxe: <(echo "hello there!")
significa executar o comando e anexar o stdout a um descritor de arquivo como /dev/fd/65
. O resultado de toda a expressão é um texto como /dev/fd/65
e um comando executado em paralelo e alimentando esse descritor de arquivo.
Agora, combinados, o script executará o comando certo, canalizá-lo-á para um descritor de arquivo, converterá esse descritor de arquivo em stdin para o comando esquerdo e executará o comando esquerdo.
Que eu saiba, não há sobrecarga, é exatamente o mesmo que a | b
, apenas açúcar sintático.
Responder3
Eu acho que você poderia fazer algo assim com um pipe nomeado:
mypipe=$(mktemp -d /tmp/XXXXXX)/pipe
mkfifo $mypipe
grep something < $mypipe & tail > $mypipe -f some_input_file
rm $mypipe
ou coloque a parte imutável do comando em um script de shell:
./foo "$@" | ./bar
e forneça os argumentos foo
na linha de comando do script:
./myscript <args to foo>