zsh是否有便捷语法可直接生成临时文件作为命令行参数的一行实现?
问题原因解释
- 执行
realpath <<<'foo'报错的原因:<<<(here-string)的作用是将字符串传入命令的标准输入,但realpath本身仅读取命令行位置参数传入的路径,不会处理标准输入内容,因此会判定没有传入必要参数,抛出missing operand错误。 - 执行
realpath <(<<<'foo')返回管道路径的原因:<(...)是进程替换语法,zsh会创建匿名管道,将<<<'foo'的内容写入管道,再把管道的虚拟路径(/proc下的文件描述符路径)作为参数传给realpath。但管道不是常规磁盘文件,不支持随机读写等常规文件操作,因此很多目标程序无法兼容这种路径。
zsh 一行实现方案
zsh 提供了特有的=(...)进程替换语法,和<(...)的核心区别是:它会自动创建一个临时常规磁盘文件,把命令输出写入该文件,执行完成后自动清理这个临时文件,完全满足你需要真实文件路径的需求。
你可以直接这样写:
# 示例:将内容为foo的临时文件路径传给realpath realpath =(<<<'foo')
测试printf的效果如下:
❯ printf "%q" =(<<<'foo') /tmp/zshR52jXc%
返回的/tmp/zshR52jXc就是真实存在的临时磁盘文件路径,所有兼容常规文件的程序都可以正常读取。
如果你需要临时文件保留更长时间、或者需要自定义临时文件规则,也可以用传统的链式命令写法:
# 自行控制临时文件的创建、使用和删除 f=$(mktemp) && echo 'foo' > "$f" && 你的目标命令 "$f" && rm "$f"
内容的提问来源于stack exchange,提问作者mpen
相关产品推荐
相关产品推荐

