如何从使用 xargs 运行的脚本提示用户



我正在使用 xargs 将参数填充到一个脚本中,我想在其中停止脚本,等待用户输入。像这样:

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

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

如果选项

-axargs,参数将从文件中读取,而不是从stdin读取。您可以将 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--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.

最新更新