Shell中, 退出整个脚本

常规做法

cat >test.sh<<EOF‘‘
#!/bin/bash

exit_script(){
    exit 1
}

echo "before exit"
exit_script
echo "after exit"
EOF

chmod a+x test.sh
./test.sh
echo $?

# 输出
before exit
1

可以看到直接使用exit可以退出脚本,并且可以将错误码作为参数传递。下面我们将脚本做一点点改动。

存在的问题

cat >test.sh<<EOF‘‘
#!/bin/bash

exit_script(){
    exit 1
}

echo "before exit"
:|exit_script
echo "after exit"
EOF

chmod a+x test.sh
./test.sh
echo $?

# 输出
before exit
after exit
0

管道(|)中执行exit_script函数,不会退出整个脚本!原因在于,exit只能退出它所在的Shell,而放在管道中执行的命令/函数都是在独立的Shell(Sub-Shell)中执行的,所以上面脚本的进程树是这个样子的:

 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
17510 26959 26959 26959 pts/0    14049 Ss       0   0:00  \_ -bash
26959 13843 13843 26959 pts/0    14049 S        0   0:00  |   \_ /bin/bash ./test.sh
13843 13844 13843 26959 pts/0    14049 S        0   0:00  |   |   \_ :
13843 13845 13843 26959 pts/0    14049 S        0   0:00  |   |   \_ /bin/bash ./test.sh
13845 13846 13843 26959 pts/0    14049 S        0   0:00  |   |       \_ exit 1

自上往下,各个PID的含义如下表:

PID 说明
26959 ./test.sh所在的Shell
13843 管道中:新开的Shell
13844 :命令
13845 管道中exit_shell新开的Shell
13846 exit命令

使用trapkill退出整个脚本

cat >test.sh<<EOF‘‘
#!/bin/bash

export TOP_PID=$$
trap ‘exit 1‘ TERM

exit_script(){
    kill -s TERM $TOP_PID
}

echo "before exit"
:|exit_script
echo "after exit"
EOF

chmod a+x test.sh
./test.sh
echo $?

# 输出
before exit
1

这里首先在脚本的主进程中捕获(trap) TERM信号: 当主进程接收到TERM信号后,会执行exit 1;再在Sub-Shell中向脚本主进程发送TERM信号,这样就可以让整个脚本退出了!

原文地址:https://www.cnblogs.com/littlehb/p/9403778.html

时间: 2024-10-21 13:14:30

Shell中, 退出整个脚本的相关文章

shell中引用其他脚本的方法

在Shell中引用其他脚本的方法是source   filename.sh 或    .    filename.sh 注意:      .   和   filename.sh之间必须有空格

Shell中退出状态码exit

shell中运行的每个命令都使用退出状态码(exit status)来告诉shell它完成了处理.退出状态码是一个0~255之间的整数值,在命令结束时由命令传回shell. 1 .查看退出状态码 Linux提供了$?专属变量保存上一个执行的命令的退出状态码.你可以在你运行一个命令之后查看(echo $?). 几个典型的退出状态码及其意义: 0----------------命令运行成功 1----------------通知未知错误 2----------------误用shell命令 126-

详解shell中source、sh、bash、./执行脚本的区别

复制文章:https://www.jb51.net/article/128918.htm 这篇文章主要介绍了shell中source.sh.bash../执行脚本的区别,需要的朋友可以参考下 1.source命令用法: source FileName 作用:在当前bash环境下读取并执行FileName中的命令.该filename文件可以无"执行权限" 注:该命令通常用命令“.”来替代. 如:source .bash_profile . .bash_profile两者等效. sourc

三、Shell中分支与循环结构

if结构的语法格式 单分支结构 if <条件表达式>   then     指令 fi if <条件表达式>; then     指令 fi 双分支结构 if <条件表达式>; then     指令1 else     指令2 fi 多分支结构 if <条件表达式>; then     指令1 elif     指令2 elif     指令3 fi shell中的函数   shell函数是shell脚本中由命令集和语句组成的代码块,这个代码块可以被其他脚

Linux shell中getopts命令学习--实现一个添加yum源的脚本

getopts是bash shell的内建命令,作用是在shell脚本中解析命令行传递.传递给函数或传递给另一个调用的shell脚本的位置参数(选项或参数,后面会讲解,getopts只支持短选项,若要解析长选项请参考getopt). getopts命令语法: getopts optstring name [arg] 相关的术语: 选项(option):GNU风格的命令选项,如:-x,-y等减号加上单个字母的为短选项:--help为长选项: 选项的参数:某些选项之后必须尾随参数,如:-f xxx.

Linux Shell脚本攻略:shell中各种括号()、(())、[]、[[]]、{}的作用

转自:https://www.cnblogs.com/nkwy2012/p/9171414.html 技巧小结: 字符串比较用双中括号[[ ]]:算数比较用单中括号[ ]——左右留空格 算数运算用双小括号(( )) :shell命令及输出用小括号( )——左右不留空格 快速替换用花括号{ }——左右留空格 反单引号起着命令替换的作用` ` -------------------------------------------------------------------------------

在shell中运行以不同方式运行脚本

在shell当中,可以有3中方式运行脚本: 1 . ./script_name 或者source ./script_name 2 直接./script_name 3 ./script_name & 加入脚本script_name中有两个命令command1,command2,那么,当以第一种方式运行时,command1和command2都在当前shell中运行,并没有产生subshell,如下图所示: 当script_name以第2中方式运行时,当前shell会产生一个subshell,comm

Shell脚本(函数,shell中的数组)

函数 函数就是把一段代码整理到一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可. 格式:function f_name(){ command } 函数必须放在最前面,函数名可以自己定义. 案例一: [[email protected] shell]# vim fun.sh #!/bin/bash function inp() { echo $1 $2 $3 $10 ${10} ${11} $0 $# [$*] } inp 1 2 3 4 5 6 7 8 9 3

shell脚本中的函数,shell中的数组,shell项目-告警系统

shell脚本中的函数 函数就是把一段代码整理到了一个小单元中,并给这个小单元起一个名字,当用到这段代码时直接调用这个小单元的名字即可. 格式: function f_name() {command }函数必须要放在最前面,function可以省略直接写函数名 示列1,打印shell的参数 [[email protected] shell]# cat fun1.sh #!/bin/bash function inp(){ echo "the first par is $1" echo