避免使用 zsh 中的临时文件

Ema*_*erg 7 command-line zsh

可能的重复:
Shell 编程,避免临时文件

假设我有文件data.txt和命令cmd

cmd接受一个参数,一个文件。或者,您可以使用stdin.

现在, saydata.txt是大写的,但cmd只有在所有数据都是小写的情况下才有效。

当然,你可以这样做

tr '[:upper:]' '[:lower:]' < data.txt > lowercase_data.txt
cmd lowercase_data.txt
rm lowercase_data.txt
Run Code Online (Sandbox Code Playgroud)

但是,有没有办法整合这个?

就像,原始文件的包装器,应用过滤器,然后传递对临时文件的引用;命令被执行;最后,临时文件被删除了?

我用 zsh。

Ree*_*phy 7

zsh支持进程替换,它应该可以满足您的要求:

A command of the form =(...) is replaced with the name of a file containing its output.
Run Code Online (Sandbox Code Playgroud)

因此,对于您的示例,为了避免手动创建临时文件以将输出传递tr到 into cmd,您可以说

cmd =(tr '[:upper:]' '[:lower:]' < data.txt)
Run Code Online (Sandbox Code Playgroud)

对于其他外壳,等效项是:

  • bashcmd <(tr '[:upper:]' '[:lower:]' < data.txt)
  • kshcmd <(tr '[:upper:]' '[:lower:]' < data.txt)
  • rccmd <{tr '[:upper:]' '[:lower:]' < data.txt}

需要注意的是bashkshrc使用命名管道,而不是临时文件,实现进程替换zsh使用,并要求/dev/fd/文件系统安装

  • `zsh` 也支持 `bash` 和 `ksh` 使用的相同的 `&lt;(...)` 形式。`=(...)` 可用于命令将尝试对管道无法实现的参数执行某些操作(例如向后查找)的情况。 (5认同)