如何将stdout伪装为文件,无需手动创建临时文件即可为命令传参
无需手动管理临时文件的跨平台传参方案
方案1:进程替换(最简洁,推荐)
适用场景:使用bash/zsh shell的Mac/Linux环境
shell 内置的进程替换语法会自动创建匿名临时文件/管道,将命令输出写入后返回对应文件路径,命令执行完成后自动销毁资源,无需手动创建/删除文件,全程不需要root权限。
示例代码:
foo --param1=<(curl -s www.repository-param1-latest.com) --param2=<(curl -s www.repository-param2-latest.com)
方案2:mktemp 临时文件方案(兼容性最强)
适用场景:所有兼容POSIX标准的shell环境
如果当前使用的shell不支持进程替换,可以用系统默认自带的mktemp命令创建用户私有临时文件,搭配trap实现执行完成后自动清理。
示例代码:
# 创建两个独立的临时文件 tmp_param1=$(mktemp) tmp_param2=$(mktemp) # 注册退出钩子,无论命令执行成功/失败,都会自动删除临时文件 trap 'rm -f "$tmp_param1" "$tmp_param2"' EXIT # 拉取参数内容写入临时文件 curl -s www.repository-param1-latest.com > "$tmp_param1" curl -s www.repository-param2-latest.com > "$tmp_param2" # 运行目标命令 foo --param1="$tmp_param1" --param2="$tmp_param2"
注意事项
- 两种方案均操作用户私有临时目录,不会触碰系统权限路径,全程不需要sudo或root权限
- curl 新增
-s参数用于关闭进度条输出,避免冗余内容写入参数文件 - 进程替换语法不兼容csh/tcsh,遇到这类shell时可以切换到bash或者使用第二种方案
内容的提问来源于stack exchange,提问作者Dmytro Lysak
相关产品推荐
相关产品推荐

