从使用xargs执行的命令读入stdin

时间:2013-11-13 18:15:06

标签: bash cygwin xargs

使用xargs做了一些我没想到的事情,尽管我觉得这有点道理。这不是我所做的,但这是一个应该显示发生了什么的例子。

fn.sh

#!/usr/bin/bash
index=1
for arg in "$@"; do echo "Arg #$index = '$arg'"; let ++index; done
read -p "type something followed by enter: "  a
echo "You typed '$a'."

现在这是命令:

echo boo hoo | xargs ./fn.sh

现在我想要的是fn.sh可以从stdin读取以允许用户互动,但xargs已被篡夺。我想我可以从临时文件中读取xargs,但我想知道它是否可以使用未命名的文件。

2 个答案:

答案 0 :(得分:7)

我从未使用过cygwin,但通常我会做这样的事情:

xargs -a <(echo boo hoo) ./fn.sh

-a告诉xargs从文件中读取,<( )语法(可能或不适用于cygwin)是进程替换,它有效地创建了一个命名对象(命名管道或一个可以读取的路径/dev/fd),产生运行所附命令的结果。

这不如管道语法那么方便,因为您必须将数据源放在xargs命令的中间,但它在其他方面是等效的。

答案 1 :(得分:2)

我发现这个问题试图解决同样的问题,然后仔细看看xargs联机帮助页。

-o选项应该完全和可预测地完成所需的内容:

  

-o:在执行命令之前,在子进程中重新打开stdin为/ dev / tty。如果您希望xargs运行交互式应用程序,这将非常有用。

只是想更新这个旧问题的答案,因为这是我搜索的第一个结果。