Linux提供了一个专门的变量$?来保存上个已执行命令的退出状态码。对于需要进行检查的命令,必须在其运行完毕后立刻查看或使用$?变量。它的值会变成由shell所执行的最后一条命令的退出状态码:

[root@host1 test]# date
2017年 07月 19日 星期三 :: CST
[root@host1 test]# echo $?

按照惯例,一个成功结束的命令的退出状态码是0。如果一个命令结束时有错误,退出状态码就是一个正数值(1-255):

[root@host1 test]# qwert
-bash: qwert: command not found
[root@host1 test]# echo $?

无效命令会返回一个退出状态码127。Linux错误退出状态码没有什么标准可循,但有一些可用的参考,如下所示:

    Linux退出状态码
状 态 码         描 述
0          命令成功结束
1          一般性未知错误
2          不适合的shell命令
126        命令不可执行
127        没找到命令
128        无效的退出参数
128+x       与Linux信号x相关的严重错误
130        通过Ctrl+C终止的命令
255        正常范围之外的退出状态码

退出状态码126表明用户没有执行命令的正确权限:

[root@host1 test]# ./expect.sh
-bash: ./expect.sh: 权限不够
[root@host1 test]# echo $?

另一个会碰到的常见错误是给某个命令提供了无效参数:

[root@host1 test]# cd %
-bash: cd: %: 没有那个文件或目录
[root@host1 test]# echo $?

这会产生一般性的退出状态码1,表明在命令中发生了未知错误。

默认情况下,shell脚本会以脚本中的最后一个命令的退出状态码退出:

[root@host1 test]# sh test.sh
This is a test file
[root@host1 test]# echo $?

你可以改变这种默认行为,返回自己的退出状态码。exit命令允许你在脚本结束时指定一个退出状态码:

[root@host1 test]# cat test.sh
#!/bin/bash
A=
B=
C=$[$A + $B]
echo the number is $C
exit $C
[root@host1 test]# sh test.sh
the number is
[root@host1 test]# echo $?

这里直接使用了C的值为exit的退出值,也可以直接指定exit 30,这都是对的;但是你要注意这个功能,因为退出状态码最大只能是255。看下面例子中会怎样:

[root@host1 test]# cat test.sh
#!/bin/bash
A=
B=
C=$[$A * $B]
echo the number is $C
exit $C
[root@host1 test]# sh test.sh
the number is
[root@host1 test]# echo $?

退出状态码被缩减到了0~255的区间,shell通过模运算得到这个结果。一个值的模就是被除后的余数。最终的结果是指定的数值除以256后得到的余数。在这个例子中,指定的值是300(返回值),余数是44,因此这个余数就成了最后的状态退出码。

linux退出状态码及exit命令的更多相关文章

  1. Linux退出状态码

    命令成功结束 一般性未知错误 不适合的shell命令 命令不可执行 没找到命令 无效的退出参数 +x 与Linux信号x相关的严重错误 通过Ctrl+C终止的命令 正常范围之外的退出状态码

  2. linux 退出状态码

    状态码 描述 0 命令成功结束 1 一般性未知错误 2 不适合的shell 命令 123 命令不可执行 127 没找到命令 128 无效退出参数 128+x 与linux信号x相关的严重错误 130 ...

  3. Shell中退出状态码exit

    shell中运行的每个命令都使用退出状态码(exit status)来告诉shell它完成了处理.退出状态码是一个0~255之间的整数值,在命令结束时由命令传回shell. 1 .查看退出状态码 Li ...

  4. Shell揭秘——程序退出状态码

    程序退出状态码 前言 在本篇文章当中主要给大家介绍一个shell的小知识--状态码.这是当我们的程序退出的时候,子进程会将自己程序的退出码传递给父进程,有时候我们可以利用这一操作做一些进程退出之后的事 ...

  5. shell中的退出状态码

    shell中的退出状态码最大只有255,如果超过这个值,就会进行取余运算,即如果执行如下命令: exit exitCode 如果exitCode大于255,那么实际的状态码为exitCode % 25 ...

  6. Perl处理和收走子进程(退出状态码和wait)

    本文关于处理子进程退出状态码的内容主体来自于<Pro Perl>的第21章. 子进程退出状态码 每个子进程在退出时,操作系统都会保留它们的退出状态码,并在内核维护的进程表中保留子进程项.对 ...

  7. linux系统状态查看/管理相关命令

    系统状态查看命令: w 查看用户 top 系统进程监控 uptime 查看某台服务器运行了多久 htop 更加先进的交互式监控工具(需要安装) iotop 监控并实时显示磁盘IO输入和输出和程序进程( ...

  8. Linux内核源码详解——命令篇之iostat[zz]

    本文主要分析了Linux的iostat命令的源码,iostat的主要功能见博客:性能测试进阶指南——基础篇之磁盘IO iostat源码共563行,应该算是Linux系统命令代码比较少的了.源代码中主要 ...

  9. 【Linux】 源码安装make命令详解,避免踩坑

    正常的编译安装/卸载: 源码的安装一般由3个步骤组成:配置(configure).编译(make).安装(make install).   configure文件是一个可执行的脚本文件,它有很多选项, ...

随机推荐

  1. eclipse maven项目目录

    今天遇见一个错误,关于eclipse项目的路径问题,web-inf的路径,上图和下图出现了两种web-INF,src的web-INFf和webContent的web-INF,src里面的文件需要编译以 ...

  2. lua保存table到文件并从文件解析成table

    require("json") result = { ["ip"]="192.168.0.177", ["date"]= ...

  3. PHP trait

    ps:由于PHP是单继承的,无法继承多个类所以可以用triat(关键字,特性)来命名达到子类继承多个父类的效果:暂且理解为类吧.class = trait <?php trait A { pub ...

  4. Python内置函数(54)——callable

    英文文档: callable(object) Return True if the object argument appears callable, False if not. If this re ...

  5. spring-oauth-server实践:access_token的有效期分析

    1.access_token有效期检查 用expiration和new Date()比较!!!!!! 分析目标-->expiration什么时候设置,设置规则如何配置!!!!!!! 2.acce ...

  6. 微信小程序授权获取用户详细信息openid

    小程序获取用户的头像昵称openid之类 第一种使用wx.getUserInfo直接获取微信头像,昵称 wx.getUserInfo({ success: function (res) { that. ...

  7. 老男孩python学习之作业二---三级菜单

    因为之前花力气完成了购物小程序的作业 现在做这个三级菜单简直是so easy!! 1.显示省级菜单 2.交互,提示用户输入要查看的省份(退出e) 2.1.用户正确输入列表中的省份 3.显示市级菜单 3 ...

  8. Java:import com.sun.awt.AWTUtilities;报错

    参考网址:http://stackoverflow.com/questions/860187/access-restriction-on-class-due-to-restriction-on-req ...

  9. [翻译] TensorFlow Programmer's Guide之Frequently Asked Questions(问得频率最多的几个问题)

    目录: 特点和兼容性(Features and Compatibility) 建立一个TensorFlow图(Building a TensorFlow graph) 运行一个TensorFlow计算 ...

  10. requests-代理设置

    import requests proxies={ 'http':'http://192.168.1.1:88' 'https':'https://192.168.1.1:88' #如果代理ip需要用 ...