避免 zsh 中的临时文件

避免 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

但是,有没有办法将其整合起来呢?

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

我用的是zsh。

答案1

zsh支持流程替代,这应该满足您的要求:

A command of the form =(...) is replaced with the name of a file containing its output.

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

cmd =(tr '[:upper:]' '[:lower:]' < data.txt)

对于其他 shell,等效的内容是:

  • bash:cmd <(tr '[:upper:]' '[:lower:]' < data.txt)
  • ksh:cmd <(tr '[:upper:]' '[:lower:]' < data.txt)
  • rc:cmd <{tr '[:upper:]' '[:lower:]' < data.txt}

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

答案2

你的做法并没有什么问题。除了创建临时文件的方式(如果您正在运行的脚本同时执行两次怎么办?)。

你应该改用mktemp

相关内容