【发布时间】:2023-12-26 17:37:02
【问题描述】:
openssl 之类的命令具有用于输出文件的-out <file> 之类的参数。我想在 shell 变量中捕获这些输出文件的内容,以便在其他命令中使用,而无需创建临时文件。例如,要生成自签名证书,可以使用:
openssl req -new -newkey rsa:2048 -subj / -days 365 -nodes -x509 -keyout KEYFILE -out CERTFILE 2>/dev/null
我要捕获两个输出文件的最接近方法是通过进程替换将它们回显到标准输出,但这并不理想,因为仍然需要将它们分开解析。
openssl req -new -newkey rsa:2048 -subj / -days 365 -nodes -x509 -keyout >(key=$(cat -); echo $key) -out >(cert=$(cat -); echo $cert) 2>/dev/null
有没有一种干净的方法可以在 shell 变量中捕获输出文件的内容?
【问题讨论】:
-
请仅标记一个外壳。
sh、bash和zsh在很多方面互不兼容;只有最低公分母的答案(使用大量额外代码——例如设置命名的 FIFO——以实现兼容性)适用于所有三个。>(...)等进程替换在sh中根本不起作用,f/e;您在我们的示例中使用的一些代码(即echo $key)仅在 zsh 中是安全的,而在其他任何一个中都不安全。 -
...也就是说,尽管您可能不喜欢它,但这里最简单、最可靠的解决方案将是使用临时文件。即使是命名的 FIFO 方法也会有一些令人讨厌的失败案例(其中
openssl根本不写入 FIFO 的失败让 shell 挂起等待输出)。