11

Usingxargs做了一些我不太期待的事情,尽管我想这有点道理。这不是我所做的,但这是一个应该说明发生了什么的例子。

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从一个临时文件中读取,但我想知道它是否可以使用一个未命名的文件。

4

2 回答 2

11

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

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

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

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

于 2013-11-13T19:56:13.633 回答
7

我发现这个问题试图解决同样的问题,然后仔细查看了 xargs 手册页。

-o选项应准确且可预测地完成所需的操作:

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

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

于 2017-12-17T20:21:47.190 回答