可能的重复:
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}
注意bash
,ksh
使用rc
命名管道实现进程替换,而不是zsh
使用临时文件,并且需要/dev/fd/
安装文件系统
答案2
你的做法并没有什么问题。除了创建临时文件的方式(如果您正在运行的脚本同时执行两次怎么办?)。
你应该改用mktemp
。