Shell命令的退出状态及错误检查
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell命令的退出状态及错误检查相关的知识,希望对你有一定的参考价值。
参考技术A Shell中执行的每个命令都会通过退出状态码(exit status)来返回命令的执行结果,它是0~255之间的整数值。此时你会看到的结果是 0
默认状态下,shell脚本会以脚本中的最后一个命令作为退出状态码。所以一般情况下,在shell脚本中以 exit 命令的值来指定shell命令的退出状态码。但是退出状态码的范围是 0 ~ 255, 退出值超出这个范围将会执行取模运算。例如通过exit 命令指定返回值为300,经过取模运算,那么退出状态码就为44。
Python检查shell命令的退出状态
【中文标题】Python检查shell命令的退出状态【英文标题】:Python check exit status of a shell command 【发布时间】:2015-01-19 17:24:05 【问题描述】:#运行shell命令的函数
def OSinfo(runthis):
#Run the command in the OS
osstdout = subprocess.Popen(runthis, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True)
#Grab the stdout
theInfo = osstdout.stdout.read() #readline()
#Remove the carriage return at the end of a 1 line result
theInfo = str(theInfo).strip()
#Return the result
return theInfo
#flash raid固件
OSinfo('MegaCli -adpfwflash -f ' + imagefile + ' -noverchk -a0')
#固件闪存的返回状态
?
推荐使用“subprocess.check_output()”的一个资源,但是,我不确定如何将其合并到函数 OSinfo() 中。
【问题讨论】:
你只是想检查返回码是0吗? 是的。检查是否为零,如果不是则退出1。 所以你不关心任何输出,只关心非 0 退出状态? 【参考方案1】:如果您只想return 1
,如果存在非零退出状态,请使用check_call
,任何非零退出状态都会引发我们捕获的错误,return 1
否则 osstdout
将是 0
:
import subprocess
def OSinfo(runthis):
try:
osstdout = subprocess.check_call(runthis.split())
except subprocess.CalledProcessError:
return 1
return osstdout
如果您传递参数列表,也不需要 shell=True。
【讨论】:
【参考方案2】:您可以使用osstout.communicate()
而不是使用osstdout.stdout.read()
来获取子进程的stdout
,这将阻塞直到子进程终止。完成此操作后,将设置属性 osstout.returncode
,其中包含子进程的返回码。
你的函数可以写成
def OSinfo(runthis):
osstdout = subprocess.Popen(runthis, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, close_fds=True)
theInfo = osstdout.communicate()[0].strip()
return (theInfo, osstout.returncode)
【讨论】:
非常感谢,这正是我想要的。 对于 Windows 上的 Python 2.7,它会引发异常:ValueError: close_fds is not supported on Windows platforms if you redirect stdin/stdout/stderr
:-(以上是关于Shell命令的退出状态及错误检查的主要内容,如果未能解决你的问题,请参考以下文章