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

pic*_*rob 1 bash stdout stderr subshell

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

如果命令是source,则子外壳会吞下对脚本外壳环境的一些(全部?)更改。

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

Tho*_*mas 6

令人惊讶的棘手问题!

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

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

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

(请参阅此问题,尤其是BashFAQ 062以了解其安全隐患mktemp。)