Shell脚本:能否用变量替代可执行程序的输出文件?
解决方法:将指定输出文件的命令结果存入变量
我太懂这种无奈了——有些程序就是死磕要你指定输出文件名,根本不支持直接把结果输出到标准输出(stdout),导致普通的重定向>完全不管用。不过咱们可以用两种技巧绕开这个限制,把结果存到变量里:
方法一:临时文件中转(最稳妥)
用系统自带的mktemp生成一个唯一的临时文件,让程序把内容写进去,再把文件内容读进变量,最后删掉临时文件:
# 生成安全的临时文件 temp_file=$(mktemp) # 让程序输出到临时文件 /command -in input_filename -of "$temp_file" # 把文件内容读取到变量 output_var=$(cat "$temp_file") # 清理临时文件 rm "$temp_file" # 之后就可以用$output_var调用内容了 echo "$output_var"
这种方法兼容性拉满,不管什么系统基本都能用,而且mktemp生成的文件名不会和现有文件冲突,很安全。
方法二:命名管道(FIFO)——避免写入磁盘
如果不想在磁盘上留下临时文件,可以用命名管道(FIFO),它本质是一个“伪文件”,数据不会落地磁盘:
# 创建命名管道 mkfifo my_pipe # 后台运行命令(必须后台,否则会阻塞),同时从管道读取内容到变量 /command -in input_filename -of my_pipe & output_var=$(cat my_pipe) # 删除管道 rm my_pipe
原理是让程序往管道里写数据,同时我们从管道另一端把数据读进变量,全程数据只在内存里流转,适合处理敏感数据或者大文件的场景。
为什么普通重定向没用?
因为这个程序的-of参数是让它直接打开并写入你指定的文件路径,而不是把内容输出到标准输出(stdout)。普通的>只能捕获stdout的内容,自然抓不到程序直接写入文件的输出,所以必须让它写一个我们能控制的“文件”(不管是临时文件还是管道),再把内容转存到变量里。
内容的提问来源于stack exchange,提问作者CryptoKitty
相关产品推荐
相关产品推荐

