De volta para trás Pipes em um comando

6

Existe uma maneira de redirecionar os valores de volta para um comando? por exemplo. Se eu puder command.pl e quiser canalizar em response , então y para confirmar (porque não tem como confirmar automaticamente)?

Eu tentei echo "y" | echo "response" | ./command.pl , mas não funciona porque a ordenação do pipe é da esquerda para a direita. Em essência, eu preciso executar o primeiro pipe, em seguida, canalizar o próximo comando depois disso. Existe um truque com parênteses ou citações ou outra coisa?

    
por VenomFangs 02.12.2014 / 23:33

4 respostas

7

Você já tentou agrupar suas duas respostas em um único echo separado por uma nova linha?

echo -e "response\ny" | ./command.pl

Observe que o sinal -e é necessário com bash para permitir a interpretação de escapes com barra invertida (a menos que bash esteja no modo de conformidade Unix).

Ou mais portável:

echo 'response
y' | ./command.pl

Ou:

printf 'response\ny\n' | ./command.pl

Ou:

printf '%s\n' response y | ./command.pl

EDITAR:

Esqueci de mencionar, mas o problema com o seu comando inicial foi que echo não recebe nenhuma entrada via STDIN. A saída do comando echo "y" nunca atingiu ./command.pl .

    
por 02.12.2014 / 23:42
19

A solução mais simples é combinar os dois comandos de eco.

echo $'y\nresponse' | ./command.pl

Escrever uma string com aspas simples e um $ na frente diz ao bash para interpretar seqüências de escape como \n .

Se os comandos que você estava enviando fossem mais complicados, você poderia agrupá-los com chaves.

{ echo y; echo response; } | ./command.pl

Os parênteses também funcionariam, embora criassem um sub-shell extra desnecessário (uma pequena ineficiência).

(echo y; echo response) | ./command.pl

Outra opção é a substituição de processos.

./command.pl < <(echo y; echo response)
    
por 03.12.2014 / 01:22
5

Você também pode usar um documento aqui :

./command.pl <<END
response
y
END
    
por 03.12.2014 / 03:24
4

Eu coloquei os comandos em um arquivo e coloquei o arquivo no comando e isso funcionou.

cat blah.txt | ./command

Quando voltei, notei a resposta de user43791, então aceito isso como a resposta que parece ser a mesma coisa que eu fiz, mas mais sucinta.

    
por 02.12.2014 / 23:45

Tags