Linux环境下如何避免创建临时文件?如何通过虚拟文件传递变量?
无需临时文件传递变量给命令的方法
当然可以!你完全不需要创建真实的临时文件就能搞定这个场景,下面给你几种实用的方法,适配不同的shell和命令需求:
方法1:进程替换(Process Substitution)
这是bash、zsh等现代shell最常用的方式,它会在后台创建一个临时的管道或文件描述符(比如/dev/fd/63),命令会把它当作普通文件路径来读取,完全不用生成真实文件。
针对你的场景,如果原来的-是让命令从STDIN读取Y,但STDIN已被占用,你可以把Y也通过进程替换传递(如果命令支持指定多个输入文件):
X='some stuff' Y='other stuff' # 如果命令支持指定两个文件参数 command --file <(echo "$X") <(echo "$Y")
如果命令只能用--file指定一个文件,另一个输入必须用STDIN,但STDIN已被占用,你可以用重定向替代管道:
# 把Y的内容重定向到命令的STDIN,同时用进程替换传递X作为--file的内容 command --file <(echo "$X") < <(echo "$Y")
注意:一定要用双引号包裹
$X和$Y,避免变量中的空格、换行等特殊字符被shell错误解析。
方法2:利用文件描述符和/dev/fd
如果需要兼容POSIX标准的shell(比如sh),进程替换可能不支持,这时候可以手动绑定文件描述符,通过/dev/fd/n让命令读取变量内容:
X='some stuff' Y='other stuff' # 将X绑定到文件描述符3,Y绑定到文件描述符4 exec 3<<<"$X" 4<<<"$Y" # 命令读取/dev/fd/3作为--file的输入,/dev/fd/4作为另一个输入 command --file /dev/fd/3 /dev/fd/4 # 用完后关闭文件描述符(好习惯) exec 3>&- 4>&-
这里的<<<是here-string语法,会把变量内容作为输入传递给文件描述符;如果你的shell不支持<<<,可以换成here-document:
exec 3<<EOF $X EOF exec 4<<EOF $Y EOF
方法3:使用tail配合重定向(特殊场景)
如果命令必须要求--file参数是一个“看起来像真实文件”的路径,你还可以用tail从变量内容生成可读取的输入流,不过这种方法不如前两种简洁:
X='some stuff' Y='other stuff' # 用tail从here-string读取X的内容,传递给--file参数 command --file <(tail -n +1 <<<"$X") < <(echo "$Y")
关键注意事项
- 所有方法都要确保变量被双引号包裹,防止特殊字符(如空格、换行、通配符)被shell错误处理。
- 进程替换是bash/zsh的扩展特性,如果在POSIX sh环境下运行,优先用文件描述符的方法。
内容的提问来源于stack exchange,提问作者user11896300
相关产品推荐
相关产品推荐

