【问题标题】:how to prompt a user from a script run with xargs如何从使用 xargs 运行的脚本中提示用户
【发布时间】: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,但效果并不好。

【问题讨论】:

    标签: bash xargs


    【解决方案1】:

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

    【讨论】:

    • 太棒了!谢谢(:一个有趣的注释:“$@”在这里捕获 'b' 然后 'c'。'a' 存储在 $0 中,'b' 存储在 $1 中等等。
    【解决方案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.
    

    【讨论】:

      猜你喜欢
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-30
      • 2021-12-09
      • 2011-01-16
      • 2014-07-19
      • 1970-01-01
      相关资源
      最近更新 更多