如何解决如何从源命令捕获/重定向 stdout/stderr 到变量在 bash 脚本中?
通常我通过子shell捕获输出:
result="$(command 2>&1)"
如果命令是 source
,子 shell 会吞下脚本 shell 环境的一些(全部?)更改。
如何将 source
的输出捕获到变量中?
解决方法
令人惊讶的棘手问题!
我的第一个想法是使用命名管道 (mkfifo(1)
),但这些管道的缓冲区大小是有限的,因此如果 source
d 脚本填满了缓冲区,脚本将挂起。并且您不能使用后台进程来排空缓冲区,因为您最终希望原始进程中的输出为变量。
我确信有一种方法可以让它完全在内存中工作,但最后我认为简单而愚蠢的重定向到临时文件是最直接和强大的解决方案:
OUTPUT_FILE=$(mktemp)
source other_script.sh >$OUTPUT_FILE 2>&1
OUTPUT="$(< "$OUTPUT_FILE")"
rm -f "$OUTPUT_FILE"
(不过,请参阅 this question,特别是 BashFAQ 062 以了解 mktemp
的安全含义。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。