背靠背管道输入命令

背靠背管道输入命令

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

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

答案1

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

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

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

如果您要传递的命令更复杂,您可以用花括号将它们分组。

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

括号也可以工作,尽管它们会创建不必要的额外子 shell(效率稍低)。

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

另一种选择是流程替换。

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

答案2

您是否尝试过将两个答案分组为一个,echo并用换行符分隔?

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

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

或者更便携:

echo 'response
y' | ./command.pl

或者:

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

或者:

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

编辑:

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

答案3

您还可以使用这里的文档:

./command.pl <<END
response
y
END

答案4

我将命令放入一个文件中,然后将文件放入命令中,这样就成功了。

cat blah.txt | ./command

当我回来时,我注意到 user43791 的回复,因此将接受它作为答案,它看起来与我所做的相同,但更简洁。

相关内容