如何从右向左重定向标准输出

Bil*_*low 8 bash zsh pipe

这完美地工作:

./foo | ./bar
Run Code Online (Sandbox Code Playgroud)

但我想要这样的东西:

./bar <| ./foo
Run Code Online (Sandbox Code Playgroud)

所以我可以用相反的方式在命令行中更快地更改 foo 的参数。

管道需要是实时的——我的foo程序永远不会返回。

这可能吗 ?

Oli*_*lac 10

一个简单而正确的方法是定义一个 foobar 函数,

foobar () { ./foo "$@" | ./bar ; }
Run Code Online (Sandbox Code Playgroud)

(根据需要在命令行中,或在某些启动脚本中,例如“.bashrc”)。然后每当你这样做:

foobar "this"  that   "and this also"
Run Code Online (Sandbox Code Playgroud)

它会做

./foo  this   that   "and this also" | ./bar
Run Code Online (Sandbox Code Playgroud)


Vas*_*kov 5

./bar < <( ./foo )
Run Code Online (Sandbox Code Playgroud)

例如:cat < <(echo "hello there!")

要了解其工作原理,请单独考虑脚本的各个部分。

此语法:cat < /path/to/file将读取文件/path/to/file并将其作为标准输入传输到cat.

此语法:<(echo "hello there!")表示执行命令并将标准输出附加到文件描述符,例如/dev/fd/65. 整个表达式的结果是一个类似 的文本/dev/fd/65,以及一个并行运行的命令并提供该文件描述符。

现在,组合起来,脚本将运行右侧命令,将其通过管道传输到文件描述符,将该文件描述符转换为左侧命令的标准输入,然后执行左侧命令。

据我所知,没有任何开销,它与 完全相同a | b,只是语法糖。