执行Shell脚本三种方法的区别:sh、source、exec

小柒助手
小柒助手
小柒助手
395
文章
3
评论
2021年5月7日17:42:41
评论
6.5K 1518字阅读5分3秒

一、概念对比

sh 方式

使用$ sh test.sh执行脚本时,当前shell是父进程,生成一个子shell进程,在子shell中执行脚本。脚本执行完毕,退出子shell,回到当前shell。

./test.sh与sh test.sh等效。

source方式

使用$ source test.sh方式,在当前上下文中执行脚本,不会生成新的进程。脚本执行完毕,回到当前shell。

source方式也叫点命令。

.test.sh与source test.sh等效。

exec方式

使用exec command方式,会用command进程替换当前shell进程,并且保持PID不变。执行完毕,直接退出,不回到之前的shell环境。

二、测试验证

编写test.sh测试脚本

vim test.sh

#!/bin/bash

if [ 1 -eq 1 ];then
	echo $$
	sleep 1
fi

# 显示当前进程PID

[root@Test ~]# echo $$

7475

# sh的方式:执行test.sh打印执行进程PID

[root@Test ~]# sh test.sh

9413

# source方式:执行test.sh打印执行进程PID

[root@Test ~]# source test.sh

7475

# exec方式:执行test.sh打印执行进程PID

[root@Test ~]# chmod +x test.sh

[root@Test ~]# exec ./test.sh

7475

# 如果没有退出,按下ctrl+C

Connection closed by foreign host.

Disconnected from remote host(172.168.1.150) at 16:22:18.

Type `help' to learn how to use Xshell prompt.

测试结论:

sh方式:父进程是7475,执行test.sh时的子进程是9413。执行完毕后回到父进程shell。

source方式:父进程和子进程都是7475(执行时没有新的进程),执行完毕会回到父进程shell。

exec方式:进程PID没有改变都是7475,执行完毕(ctrl+C强制关闭)时直接退出了shell。脚本执行时替换了父进程的shell,执行完毕后直接退出,没有回到之前的shell。

实际经验说明

工作中我曾用脚本中执行下面命令,用来关闭tomcat。但catalina.sh报错后,我的脚本直接中断。后面其他代码都不再执行了。

exec /usr/local/tomcat/bin/catalina.sh stop

所以修改为sh执行,无论exec是否报错,catalina.sh执行完毕后会回到原来shell。我脚本中的后续代码是继续执行的。这个非常有用。

sh /usr/local/tomcat/bin/catalina.sh stop

三、使用sh和source方式对上下文的影响

在sh和source方式下,脚本执行完毕,都会回到之前的shell中。但是两种方式对上下文的影响不同。

此例中,test1.sh脚本执行如下操作:

1、进入/tmp目录

2、打印当前工作目录

3、打印Hello World

test1.sh脚本

[root@Test ~]# vim test1.sh

#!/bin/bash

cd /tmp
pwd
echo "Hello World"

# sh方式执行完毕后,还在当前目录

[root@Test ~]# sh test1.sh

/tmp

Hello World

# source执行完毕后,当前目录变成了/tmp

[root@Test ~]# source test1.sh

/tmp

Hello World

[root@Test tmp]#

结果分析:

执行结果输出一致,不同在于source执行完毕后目录变成了/tmp

继续阅读
若文章图片、下载链接等信息出错,请在评论区留言反馈,博主将第一时间更新!如果喜欢,请打赏支持本站,谢谢大家!
  • 微信号
  • 微信扫一扫加我!
  • weinxin
  • 微信公众号
  • 微信扫一扫关注我!
  • weinxin
广告也精彩
小柒助手
  • 本文由 发表于 2021年5月7日17:42:41
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
Centos7.X防SSH暴力破解脚本 Shell

Centos7.X防SSH暴力破解脚本

什么是暴力破解,简单来说就是对一个服务器进行无数次尝试登陆,并用不同的密码进行登陆直到可以登陆成功。暴力破解的基本步骤可以分为以下几步: 1)找到对应的Linux服务器ip地址 2)扫描端口号:2...
CentOS系统初始化脚本(适合CentOS 6.X和CentOS 7.X系列) Shell

CentOS系统初始化脚本(适合CentOS 6.X和CentOS 7.X系列)

作为运维人员,经常会初始化系统,系统在安装过程中基本都会选择最小化安装,这样安装好的系统里会缺少很多环境。系统初始化脚本是刚安装完操作系统之后运行的脚本,主要功能是将系统环境进行优化,并更改常用设置,...
Shell脚本获取MongoDB数据量大小 Shell

Shell脚本获取MongoDB数据量大小

此脚本是获取MongoDB数据量大小脚本,有需要朋友可以参考,脚本内容如下: 环境准备: 操作系统:CentOS Linux release 7.8.2003 软件版本: Mong...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: