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

8

我正在使用xargs来填充脚本的参数,我想在脚本中停止执行,并等待用户输入。类似于:

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

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

2个回答

7
如果给xargs选项-a,则参数将从文件中读取而不是标准输入。您可以使用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')。

太棒了!谢谢(: 有趣的一点是:"$@" 在这里捕获 'b' 然后是 'c'。'a' 存储在 $0 中,'b' 存储在 $1 等等。 - drevicko

2
另一种解决方案,不依赖于 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.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接