Como redirecionar stdout da direita para a esquerda

Como redirecionar stdout da direita para a esquerda

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 fooprograma 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/fileirá ler o arquivo /path/to/filee 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/65e 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 foona linha de comando do script:

./myscript <args to foo>

informação relacionada