shell 在bash脚本中配置set -euo pipefail时,尝试使用命令输出设置变量时出错

watbbzwu  于 2022-11-16  发布在  Shell
关注(0)|答案(1)|浏览(212)

我试着检查Kubernetes集群名称空间是否存在,如果不存在,我会处理这种情况。我用set -euo pipefail初始化我的bash脚本,以便处理错误。
上下文是我需要在my_ns不存在时实现脚本。
我将kubectl get ns my_ns命令的输出(因为它返回错误消息)存储到一个bash变量中,但脚本退出:

问题是我不明白为什么当我使用环境变量与导出命令时它工作

我将kubectl get ns my_ns命令的输出存储到一个bash变量中:

checknsoutput=$(kubectl get ns my_ns 2>&1)

我试过导出,效果很好

export checknsoutput=$(kubectl get ns my_ns 2>&1)

我启用了“调试”模式,这要归功于以下命令,以便具有更详细的内容:

set -x

下面是使用export命令的脚本的日志片段:

++ kubectl get ns toto
+ export 'checknsoutput=Error from server (NotFound): namespaces "toto" not found'
+ checknsoutput='Error from server (NotFound): namespaces "toto" not found'
+ echo 'RESULLT: Error from server (NotFound): namespaces "toto" not found'

下面是脚本日志的片段,其中包含一个基本变量:

++ kubectl get ns toto
+ checknsoutput='Error from server (NotFound): namespaces "toto" not found'

如果我正确理解了 kubectl get ns my_ns 返回的1,它会被脚本捕获,并在初始化值 checknsoutput 之前存在。
我希望能理解为什么它不能与变量一起工作,而与导出变量一起工作。提前感谢您的帮助

btxsgosb

btxsgosb1#

export是一个有退出代码的命令。通常它会退出0,除非你告诉它导出一个无效的shell变量,所以它会屏蔽命令替换的退出代码,防止set -e中止脚本。
如果您 * 希望 * 脚本在命令失败时退出,则需要分别执行分配和导出步骤。

checknsoutput=$(kubectl get ns my_ns 2>&1)
export checknsoutput

第27章.

相关问题