2017-08-15 142 views
0

我使用Ruby来调用通过shell脚本:使用Ruby来调用一个shell脚本退出代码总是返回0

%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 

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

+0

相关:[从Ruby调用shell命令](https://stackoverflow.com/questions/2232/calling-shell-commands-from-ruby)。你可以这样做'exitCode = $ ?. exitstatus' –

+0

我刚刚试过,我得到一个TypeError 没有将Integer隐式转换为String。 所以我试着做exitCode = $ ?. exitstatus.to_i 我仍然得到相同的错误,虽然 – InsertNameHere

+0

有趣。 'ruby -e'%x [/root/script.sh -k -m -l -w -p];退出码= $?退出状态;打印exitCode''也失败了? –

回答

1

回声正确;检查你的最后一个过程而不是

什么是错的,因为/bin/echo或shell内置echo返回成功,除非标准输出被关闭或某些其他错误发生

您当前的代码几乎总是将评估其if语句为真。考虑以下猛砸片段:

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

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

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

如何解决一般情况

您需要直接测试exit status,或检查捕获的输出。例如,在Ruby中,你可以测试/斌/假命令与上次状态:

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 
+0

我仍然无法得到这个工作 %×[/root/script.sh -k -m -l -p -w] captured_output = '假' \t \t \t把$?退出状态 它仍然随时回来为0 – InsertNameHere

+1

你应该**不要**使用'%x'。查看CodeGnome提供的代码。我建议的代码的唯一变体是执行'system('/ root/script.sh -k -m -l -w -p> dev/null')',因为你对正在执行的脚本的实际标准输出不感兴趣。 – user1934428

相关问题