文档章节

基于进程退出代码退出Shell脚本

j
 javail
发布于 02/22 10:28
字数 695
阅读 68
收藏 0

我有一个执行许多命令的shell脚本。 如果任何命令以非零退出代码退出,如何使shell脚本退出?


#1楼

http://cfaj.freeshell.org/shell/cus-faq-2.html#11

  1. 如何在cmd1|cmd2获取cmd1的退出代码

    首先,请注意cmd1退出代码可能不为零,但仍然不代表错误。 例如,这发生在

    cmd | head -1

    您可能会观察到cmd1的141(或269与ksh93)退出状态,但这是因为当读取一行后头head -1终止时, cmd被SIGPIPE信号中断。

    要知道管道元素cmd1 | cmd2 | cmd3的退出状态 cmd1 | cmd2 | cmd3

    一个。 用zsh:

    退出代码在pipestatus特殊数组中提供。 cmd1退出代码在$pipestatus[1]cmd3退出代码在$pipestatus[3] ,这样$? 始终与$pipestatus[-1]

    湾 用bash:

    退出代码在PIPESTATUS特殊阵列中提供。 cmd1退出代码在${PIPESTATUS[0]}cmd3退出代码在${PIPESTATUS[2]} ,所以$? 总是与${PIPESTATUS: -1}

    ...

    有关详细信息,请参阅以下链接


#2楼

[ $? -eq 0 ] || exit $?; # exit for none-zero return code

#3楼

在bash中这很容易,只需用&&将它们绑在一起:

command1 && command2 && command3

您还可以使用嵌套的if结构:

if command1
   then
       if command2
           then
               do_something
           else
               exit
       fi
   else
       exit
fi

#4楼

在每个命令之后,可以在$?找到退出代码$? 变量,所以你会有这样的东西:

ls -al file.ext
rc=$?; if [[ $rc != 0 ]]; then exit $rc; fi

你需要小心管道命令,因为$? 只提供管道中最后一个元素的返回码,因此,在代码中:

ls -al file.ext | sed 's/^/xx: /"

如果文件不存在,则不会返回错误代码(因为管道的sed部分实际工作,返回0)。

bash shell实际上提供了一个可以帮助处理PIPESTATUS 。 此数组为每个管道组件都有一个元素,您可以像${PIPESTATUS[0]}一样单独访问:

pax> false | true ; echo ${PIPESTATUS[0]}
1

请注意,这会使您获得false命令的结果,而不是整个管道。 您还可以根据需要获取整个列表进行处理:

pax> false | true | false; echo ${PIPESTATUS[*]}
1 0 1

如果您想从管道中获取最大的错误代码,可以使用以下内容:

true | true | false | true | false
rcs=${PIPESTATUS[*]}; rc=0; for i in ${rcs}; do rc=$(($i > $rc ? $i : $rc)); done
echo $rc

这依次遍历每个PIPESTATUS元素,如果它大于前一个rc值,则将其存储在rc


#5楼

set -e ”可能是最简单的方法。 只需将它放在程序中的任何命令之前。

本文转载自:https://pl.sofbug.com/question/NWM

j
粉丝 7
博文 1560
码字总数 0
作品 0
深圳
私信 提问
Linux shell脚本单进程实例模式实现

一、说明 关于单例模式,最开始的是一些小工具,运行起来后再点击运行时会提示已经运行了一个实例,觉得挺有意思但也没有很在意 前段时间看了前领导的一段代码不太懂是做什么用的,同事查了下...

努力改个网名
2019/12/21
0
0
exit-shell退出状态

1. intruduction exit 使shell(脚本)以指定状态值退出, 不带参数执行exit时,shell或脚本以最后执行命令的状态值退出。 shell退出前, trap会捕猎EXIT信号。0表示执行成功,非0值表执行失败。...

adelphos
2015/04/20
0
0
分发系统、expect脚本、构建文件分发系统、批量远程执行命令

20.27 分发系统介绍 20.28 expect脚本远程登录 20.29 expect脚本远程执行命令 20.30 expect脚本传递参数 20.31 expect脚本同步文件 20.32 expect脚本指定host和要同步的文件 20.33 构建文件分...

tobej
2019/06/19
64
0
nodejs-process 记录

process的事件 1 exit 当进程准备退出时触发。 2 beforeExit 当 node 清空事件循环,并且没有其他安排时触发这个事件。通常来说,当没有进程安排时 node 退出,但是 'beforeExit' 的监听器可...

fangPeng_
2016/08/17
7
0
Shell特殊变量:$0, $#, $*, $@, $?, $$和命令行参数

变量名只能包含数字、字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量。 特殊变量列表 例如,$ 表示当前Shell进程的ID,即pid,看下面的代码: # echo $$ 运...

风过_无痕
2017/06/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

大刘海终于收窄?iPhone 12系列设计细节曝光:三摄+雷达更占空间

苹果第一次给屏幕加上刘海,是在2017年的iPhone X。此后,尽管安卓阵营已经先后发展出了水滴屏、升降屏、打孔屏等形态各异的更高屏占比的设计方案,苹果一直将宽大的刘海保留在其后iPhone XS...

osc_p0v6j6lt
21分钟前
24
0
爆单也没能救它 瑞幸咖啡股价一度下跌20%再创新低

瑞幸咖啡(NASDAQ:LK)股价周一继续下挫,跌破上周四曝光营收造假的低点4.90美元,一度报4.27美元,下跌超20%,市值不足11亿美元。这一价格也创造了瑞幸上市后的历史最低。 据报道,高盛称,瑞...

osc_6kj0kt57
22分钟前
16
0
疫情蔓延放缓 早盘美股道指大涨逾千点

北京时间6日晚,美股周一早盘继续上扬,道指大涨逾千点。投资者对全球疫情蔓延局势的判断有所改善,风险情绪随之受到提振。美国总统特朗普称迹象显示美国疫情已开始趋于稳定,并表示他仍在考...

osc_jo2m8l1r
24分钟前
24
0
4.3万元!赛博朋克2077定制版NIVIDIA显卡成功卖出

虽然《赛博朋克2077》游戏跳票了,但是2月份NVIDIA依然推出了一款赛博朋克限量版显卡——GeForce RTX 2080 Ti“ Cyberpunk 2077 Edition”,全球限量200块,官方售价1100美元。 访问购买页面...

osc_9mctux05
25分钟前
26
0
高盛:瑞幸咖啡股东发生违约 7635万股ADS强制出售

据国外媒体报道,高盛今日发布报告称,在瑞幸咖啡股东Haode Investment公司(借款人)发生违约之后,根据一项5.18亿美元的保证金贷款安排,贷款人组成的银团已指示作为担保受托人的瑞士信贷新...

osc_t6qz550e
26分钟前
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部