根据您提供的信息,确实存在在目标机器上直接执行 grep
命令返回1,但通过 SaltStack 执行相同命令返回0的情况。
可能的原因是在 SaltStack 执行命令时,使用了不同的 Shell 解释器,导致变量 $?
的解释和处理方式不同。
在目标机器上直接执行命令时,Shell 解释器会将 $?
视为上一个命令的退出状态码。因此,当 grep
命令在文件中未找到匹配项时,返回1。
而在 SaltStack 中,执行命令使用的是默认的 Salt Minion Shell 解释器,该解释器可能会以不同的方式处理 $?
变量。它可能会将 $?
视为 Salt Minion 进程的退出状态码,而不是上一个命令的退出状态码。因此,即使 grep
命令未找到匹配项,Salt Minion 进程的退出状态码仍然为0。
为了解决这个问题,您可以使用以下命令,将 $?
作为字符串传递给 echo
命令:
plaintext
复制
salt "*aa" cmd.run runas=tiger "grep aa /opt/tiger/aa.options; echo \$?"
在这个命令中,使用了 \$?
来转义 $?
,确保 $?
在目标机器上被解释为上一个命令的退出状态码。
这样您就可以获取到正确的退出状态码,以便判断 grep
命令是否在文件中找到匹配项。