我正在使用 xargs 将参数填充到一个脚本中,我想在其中停止脚本,等待用户输入。像这样:
echo a b c | xargs bash -c 'for a in "$@"; do echo $a; read; done'
但是read
被忽略了。似乎第二个脚本也在尝试从管道中获取它的输入?我已经尝试过xargs -p
但也没有更好。
-a
给xargs
,参数将从文件中读取,而不是从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.