透明使用临时文件作为管道手段

Mat*_*zyk 3 linux bash zsh shell pipe

正如我们许多人肯定知道的那样,让您的程序接受 stdin 输入总是一个好主意。很多程序确实允许使用 *nix 环境。这让我们可以做一些很酷的事情,比如管道 echo "foo" | less。很多时候人们会发现这cat barfile | baz在逻辑上等同baz barfile于在幕后它只是读取字符串。

如今,有更多的程序默认无法通过管道传输。一些程序具有仍然允许上述行为的标志,但许多程序没有。

现在,我的问题是,是否存在临时文件管道?

现在,由于我几乎不具备编写 Bash 的能力和在 Google 上大约 5 分钟的时间,我想出了这个

#!/bin/bash
if [ $# -ne 2 ]; then exit 1; fi
f=$(mktemp)
($1) > $f
if [ $? -eq 0 ]; then ($2 $f); else exit $?; fi
rm $f
Run Code Online (Sandbox Code Playgroud)

调用这个 fpipe,我们可以做一些事情,比如fpipe 'wget -O- www.example.com' bazbaz 是一个我们不能管道但可以做的程序baz file

我的问题是我们怎样才能做得更好。我怀疑有了更多的 Bash 知识,重新编写上面的脚本来接受任何数量的参数将是相当微不足道的(这样我们就可以做一些事情,比如fpipe 'foo x' bar baz在管道中我们可以做类似的事情foo x | bar | baz。呸,我们可能会混合两者和最终得到诸如fpipe 'wget -O- www.example.org | rev' baz.

是否有现有的结构可以实现这一目标?我相信我看到了类似的结构foo x > bar < baz或类似的东西。我原以为这是一个相当普遍的问题,但我的搜索没有提出任何问题。这意味着我要么搜索不够努力,要么遗漏了一些相当明显的东西。

如果没有适当的方式(TM)来实现这一点,是否可以定义一种方便的语法?再说了,foo x |> baz | rev在那里|>几乎直接转化为我的脚本。

PS:我知道我的 /script/ 非常脆弱和幼稚(例如在非 0 上退出);随意发布一个更好的。

Alu*_* G. 5

使用最新版本的 Bash:

$ baz <(wget -O- www.example.com)
Run Code Online (Sandbox Code Playgroud)

这叫做进程替换