8

我正在使用 xargs 将参数填充到我想要停止脚本的脚本中,等待用户输入。就像是:

echo a b c | xargs bash -c 'for a in "$@"; do echo $a; read; done'

read被忽略了。似乎第二个脚本也试图从管道中获取它的输入?我试过xargs -p了,但没有更好。

4

2 回答 2

7

如果选项-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')。

于 2012-04-19T07:34:03.267 回答
1

另一个不依赖 Bash 而是依赖GNU 风格的 xargs 的解决方案是使用-oor--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.
于 2021-08-20T13:06:47.843 回答