背靠背管道成命令

Ven*_*ngs 6 bash pipe echo

有没有办法将值回传到命令中?例如,如果我可以command.pl并且想要输入response,然后y确认(因为它没有自动确认的方法)?

我试过echo "y" | echo "response" | ./command.pl但它不起作用,因为管道的顺序是从左到右。本质上,我需要先运行一个管道,然后再运行下一个命令。有括号或引号或其他东西的技巧吗?

Joh*_*man 18

最简单的解决方案是组合两个 echo 命令。

echo $'y\nresponse' | ./command.pl
Run Code Online (Sandbox Code Playgroud)

用单引号和 a$在前面写一个字符串告诉 bash 解释转义序列,如\n.

如果您正在使用管道的命令更复杂,您可以用花括号将它们分组。

{ echo y; echo response; } | ./command.pl
Run Code Online (Sandbox Code Playgroud)

括号也可以使用,尽管它们会创建一个不必要的额外子外壳(效率低下)。

(echo y; echo response) | ./command.pl
Run Code Online (Sandbox Code Playgroud)

另一种选择是过程替换。

./command.pl < <(echo y; echo response)
Run Code Online (Sandbox Code Playgroud)


use*_*791 7

您是否尝试将两个答案组合在一个echo由换行符分隔的单个答案中?

echo -e "response\ny" | ./command.pl
Run Code Online (Sandbox Code Playgroud)

请注意,-e必须使用标志bash来启用反斜杠转义的解释(除非bash处于 Unix 一致性模式)。

或者更便携:

echo 'response
y' | ./command.pl
Run Code Online (Sandbox Code Playgroud)

或者:

printf 'response\ny\n' | ./command.pl
Run Code Online (Sandbox Code Playgroud)

或者:

printf '%s\n' response y | ./command.pl
Run Code Online (Sandbox Code Playgroud)

编辑:

我忘了提及,但您的初始命令的问题是它echo不通过其 STDIN 接受任何输入。命令的输出echo "y"从未达到./command.pl


per*_*ion 5

您还可以使用此处的文档

./command.pl <<END
response
y
END
Run Code Online (Sandbox Code Playgroud)