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

问题描述 投票:6回答:2

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

bash cygwin xargs
2个回答
7
投票

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

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

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

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


2
投票

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

-o选项应该完全和可预测地完成所期望的:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.