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

Adr*_*ian 7 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'."
Run Code Online (Sandbox Code Playgroud)

现在这是命令:

echo boo hoo | xargs ./fn.sh
Run Code Online (Sandbox Code Playgroud)

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

ric*_*ici 8

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

xargs -a <(echo boo hoo) ./fn.sh
Run Code Online (Sandbox Code Playgroud)

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

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

  • @adrian:它不使用`stdin`,所以它不会干扰。管道运算符通过将“stdin”重定向到管道来使用未命名管道。`&lt;()` 使用命名管道,并将管道的名称放在命令行中,因此没有重定向。(这不太准确,但它*概念上*准确。)它在 bash 手册中:) (2认同)

Iva*_* G. 7

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

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

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

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