如何从源命令捕获/重定向 stdout/stderr 到变量(在 bash 脚本中)?

How to capture / redirect stdout/stderr from a source command into a variable (in a bash script)?

通常我通过 subshell 捕获输出: result="$(command 2>&1)"

如果命令是 source,subshell 吞下一些(全部?)脚本 shell 环境的更改。

如何将 source 的输出捕获到变量中?

出乎意料的棘手问题!

我的第一个想法是使用命名管道 (mkfifo(1)),但它们的缓冲区大小有限,因此如果 sourced 脚本填满了缓冲区,脚本就会挂起。而且您不能使用后台进程来耗尽缓冲区,因为您最终希望原始进程中的变量输出。

我确信有办法让它完全在内存中工作,但最后我认为简单而愚蠢的重定向到临时文件是最直接和可靠的解决方案:

OUTPUT_FILE=$(mktemp)
source other_script.sh >$OUTPUT_FILE 2>&1
OUTPUT="$(< "$OUTPUT_FILE")"
rm -f "$OUTPUT_FILE"

(有关 mktemp 的安全隐患,请参阅 this question and in particular BashFAQ 062。)