Shell:无需临时文件将命令输出文件内容捕获至变量的方法
嘿,你这个需求其实有个更简洁的解决思路——不用把内容混到标准输出再拆分,直接就能把私钥和证书的内容捕获到当前Shell的变量里,而且完全不用临时文件,只运行一次openssl就行。
核心思路是让进程替换直接输出变量赋值的Shell代码,然后用eval执行这些代码,这样变量就会在当前Shell环境中生效,而不是子shell里。
给你两种可靠的写法:
方法一:用sed转义单引号(兼容性好)
eval "$(openssl req -new -newkey rsa:2048 -subj / -days 365 -nodes -x509 \ -keyout >(echo "key='$(cat | sed "s/'/'\\\''/g")'") \ -out >(echo "cert='$(cat | sed "s/'/'\\\''/g")'") 2>/dev/null)"
方法二:用printf %q自动转义(更严谨)
如果你用的是Bash或者支持printf %q的Shell,这个方法更稳妥,能自动处理所有Shell特殊字符:
eval "$(openssl req -new -newkey rsa:2048 -subj / -days 365 -nodes -x509 \ -keyout >(printf 'key='; printf "%q" "$(cat)") \ -out >(printf 'cert='; printf "%q" "$(cat)") 2>/dev/null)"
执行完上面的命令后,你直接用$key就能拿到私钥内容,$cert拿到证书内容,完全不用再处理拆分的问题。
原理简单说下:
-keyout >(...)和-out >(...)分别把openssl生成的私钥、证书导向进程替换里的命令- 进程替换里的命令会把内容转义后,输出成
key='xxx'和cert='xxx'这样的赋值语句 eval会在当前Shell中执行这些赋值语句,变量自然就可用了
内容的提问来源于stack exchange,提问作者silverwind




