【发布时间】:2021-08-20 21:06:47
【问题描述】:
我正在使用 xargs 将参数填充到我想要停止脚本的脚本中,等待用户输入。比如:
echo a b c | xargs bash -c 'for a in "$@"; do echo $a; read; done'
但read 被忽略。似乎第二个脚本也试图从管道中获取它的输入?我试过xargs -p,但效果并不好。
【问题讨论】:
我正在使用 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's flavor of 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.
【讨论】: