无-it参数时kubectl exec执行结果无法存入变量该如何解决
问题根因
nginx -v 命令的版本信息默认输出至**标准错误流(stderr)**而非标准输出流(stdout),你当前的赋值语句仅捕获stdout内容,因此变量取值为空。添加-it参数时终端会同时展示stdout和stderr的内容,所以会产生命令输出正常的错觉,但该参数需要终端分配tty,无法在terraform无交互环境中使用。
解决方案
1. 重定向stderr到stdout(通用推荐方案)
在执行的命令末尾添加2>&1,将stderr流合并到stdout流后再赋值给变量,无需使用-it参数,完全适配terraform无终端的运行环境:
abc=$(kubectl exec nginx-6799fc88d8-xpzs9 -- nginx -v 2>&1)
2. 使用nginx适配参数(可选)
nginx支持大写-V参数,该参数的输出内容会直接写入stdout,可以直接捕获:
abc=$(kubectl exec nginx-6799fc88d8-xpzs9 -- nginx -V)
注意:大写-V会同时输出编译配置、编译参数等额外信息,若仅需要纯版本号,建议选择第一种方案配合grep、awk等工具做二次过滤即可
3. 同类问题通用排查方式
后续遇到其他命令也出现捕获为空的问题时,可以先在本地终端执行命令分别验证输出流向:
# 关闭stderr输出,仅查看stdout,若无输出则说明命令结果在stderr kubectl exec nginx-6799fc88d8-xpzs9 -- nginx -v 2> /dev/null # 关闭stdout输出,仅查看stderr,若无输出则说明命令结果在stdout kubectl exec nginx-6799fc88d8-xpzs9 -- nginx -v > /dev/null
内容的提问来源于stack exchange,提问作者karikevinod
相关产品推荐
相关产品推荐

