【问题标题】:Using Ruby to call a shell script exit code always returns as 0使用 Ruby 调用 shell 脚本退出代码始终返回为 0
【发布时间】:2018-01-23 19:04:15
【问题描述】:

我正在使用 Ruby 通过以下方式调用 shell 脚本:

%x[ /root/script.sh -k -m -l -w -p]
exitCode = %x[echo $?]

if exitCode != 0
  do something
else
  do something else
end

我的问题是即使我强制脚本失败,退出代码也始终等于 0。如何正确获取脚本的退出码?

编辑: 好的,今天早上进来并开始挖掘脚本,因为我无法得到除 0 之外的任何错误代码。脚本看起来像这样......

failed() {
      if [ "$1" -ne 0 ] ; then
          echo "$2 failed. INSTALLATION FAILED! Exiting.";
      exit 1;
    fi
}

{

function 1
function 2..
function ..20

} | tee -a logFile.log 

所以脚本运行的最后一件事总是这个日志文件,这意味着我永远不会得到真正的退出代码。

【问题讨论】:

  • 相关:Calling shell commands from Ruby。你可以做exitCode = $?.exitstatus
  • 我刚试过,我得到了一个 TypeError 没有将 Integer 隐式转换为 String。所以我尝试做 exitCode = $?.exitstatus.to_i 我仍然收到同样的错误
  • 有趣。 ruby -e '%x[/root/script.sh -k -m -l -w -p]; exitCode=$?.exitstatus; print exitCode' 也会失败吗?
  • 你们两个走错了路。使用反引号,OP 的当前代码包含一个字符串(可能是0),而不是一个整数退出状态。在上面调用#class 看看。
  • 哦,我的本意是建议删除exitCode = %x[echo $?],添加exitCode = $?.exitstatus

标签: ruby linux shell exit-code


【解决方案1】:

回声真;改为检查您的上一个流程

怎么了

您当前的代码几乎总是将其 if 语句评估为 true,因为 /bin/echo 或 shell 内置 echo 会返回成功,除非标准输出已关闭或发生其他错误。考虑以下 Bash sn-p:

echo `false`; echo $? # 0
echo >&-; echo $?     # 1

此外,在您当前的代码中,exitCode 是一个字符串,而不是一个整数。它被分配了 echo 命令的标准输出,因此在尝试进行有效比较之前,您必须在其上调用 Kernel#IntegerString#to_i 来转换变量。例如,考虑以下 Ruby:

`echo $?`.class #=> String
"0" == 0        #=> false
"0".to_i == 0   #=> true

如何解决一般情况

您需要直接测试exit status,或检查捕获的输出。例如,在 Ruby 中,您可以使用以下命令测试 /bin/false 命令的最后状态:

captured_output = `/bin/false`
$?.exitstatus
#=> 1

修复您的具体示例

如果您对上述任何内容都不了解,只需通过删除所有非必需项来修复您的代码。根据您的示例,您不需要临时变量,也不需要存储标准输出。除非您正在评估特定的非零退出状态,否则您甚至不需要直接检查进程状态,甚至不需要使用相等语句。

遵循 KISS 原则,只评估Kernel#system 调用的真实性。例如:

# Just call system if you don't care about the output.
# The result will be true, false, or nil.
if system('/root/script.sh -k -m -l -w -p')
  'clean exit'
else
  "non-zero exit: #{$?}"
end

【讨论】:

  • 我似乎仍然无法让它工作 %x[ /root/script.sh -k -m -l -w -p] capture_output = 'false' puts $?.exitstatus It仍然总是返回为 0。
  • 您应该使用%x。查看 CodeGnome 提供的代码。我建议对他的代码进行的唯一修改是 system('/root/script.sh -k -m -l -w -p >dev/null'),因为您对正在执行的脚本的实际标准输出不感兴趣。
猜你喜欢
  • 2018-09-12
  • 2011-11-26
  • 2016-08-31
  • 2012-09-16
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
相关资源
最近更新 更多