像输出文件openssl这样的命令-out <file>.我想在shell变量中捕获这些输出文件的内容,以便在不创建临时文件的情况下在其他命令中使用.例如,要生成自签名证书,可以使用:
openssl req -new -newkey rsa:2048 -subj / -days 365 -nodes -x509 -keyout KEYFILE -out CERTFILE 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
我必须捕获两个输出文件最接近的是通过进程替换将它们回显到stdout,但这并不理想,因为仍然需要将它们分开.
openssl req -new -newkey rsa:2048 -subj / -days 365 -nodes -x509 -keyout >(key=$(cat -); echo $key) -out >(cert=$(cat -); echo $cert) 2>/dev/null
Run Code Online (Sandbox Code Playgroud)
是否有一种干净的方法来捕获shell变量中的输出文件的内容?
大多数现代 shell 现在支持 /dev/stdout 作为文件名来重定向到 stdout。这对于单文件解决方案来说已经足够好了,但是对于两个输出文件,您需要使用“进程替换”。
eval "$( openssl req -new -newkey rsa:2048 -subj / -days 365 -nodes -x509 -keyout >(echo "keyout='$( cat )'" ) -out >(echo out="'$(猫 )'” ) )”
这使用进程替换将每个“文件”定向到一个单独的进程,该进程将计算值的分配打印到标准输出。然后整个事情被传递给 eval 来执行实际的分配。
保留 stderr 的输出以显示弹出的任何错误消息。在遇到麻烦时记录它很有用。
编辑:结合查尔斯·达菲的良好偏执:
chunkf="$(mktemp -t tmp.lock.$$.XXXXXX)" || 退出 $?;
评估“$( openssl req -new -newkey rsa:2048 -subj / -days 365 -nodes -x509 \
-keyout >( 设置 -x; 99>"$flockf" && \
flock -x "$flockf" printf "keyout=%q " "$( cat )"; )\
-out >( 设置 -x; 99>"$flockf" && \
羊群 -x“$flockf”printf“out=%q”“$(cat)”; )\
)";
rm -f "$flockf"