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命令的退出状态及错误检查的主要内容,如果未能解决你的问题,请参考以下文章

Python检查shell命令的退出状态

shell 备忘

Shell中退出状态码exit

shell 脚本 ssh 命令退出状态

如何在perl脚本中忽略shell命令的退出状态

在c ++中捕获shell脚本退出状态[重复]