我正在使用 xargs 将参数填充到我想要停止脚本的脚本中,等待用户输入。就像是:
echo a b c | xargs bash -c 'for a in "$@"; do echo $a; read; done'
但read
被忽略了。似乎第二个脚本也试图从管道中获取它的输入?我试过xargs -p
了,但没有更好。
如果选项-a
被赋予xargs
,参数将从文件而不是标准输入中读取。您可以使用 bash 的进程替换和语法<( ... )
来动态创建文件。
xargs -a <( echo A B C ) bash -c 'for x in "$@"; do echo $x; read; done'
请注意,这里$@
遗漏了第一个参数(在本例中为“A”)。这是因为bash -c
将 'A' 放入$0
(通常采用脚本文件的名称),并$@
提供$1
等$2
...(在本例中为 'B' 和 'C')。
另一个不依赖 Bash 而是依赖GNU 风格的 xargs 的解决方案是使用-o
or--open-tty
选项:
echo a b c | xargs --open-tty bash -c 'for a in "$@"; do echo $a; read; done'
从手册页:
-o, --open-tty
Reopen stdin as /dev/tty in the child process before executing the command. This is use‐
ful if you want xargs to run an interactive application.