gentos 执行sh文件_Linux shell脚本文件的各种执行方式

当我们编写好脚本文件以后,接下来就是执行脚本文件了。执行脚本文件的方式有很多种,比如一个文件a.sh,我们可以选择需要执行权限的方式(chmod +x a.sh),不需要执行权限的方式(bash a.sh或者sh a.sh),需要开启子进程的方式,不需要开启进程的方式。

可执行权限方式

通过chmod 命令可以给脚本文件分配执行权限,脚本文件一旦有了执行权限,就可以使用绝对路径或相对路径执行了。下面来看看效果:
empty.sh

#!/bin/bash

8ee394044fa36ca13d82fe9febc17e44.png

本脚本是检测多个文件是否为空,读取位置参数,测试是否空文件删除空文件。可以看到chmod +x empty.sh分配可执行权限,然后使用相对路径执行。也可以使用绝对路径。

./的命令用法

从上面的信息来看,chmod +x empty.sh分配可执行权限后,可以使用./empty.sh执行,那./有什么作用呢?


其实就是打开一个子shell来读取并执行empty中命令。运行一个shell脚本时会启动另一个命令解释器。每个shell脚本有效地运行在父shell(parentshell)的一个子进程里.

没有可执行权限方式

如果暂时还没有给脚本文件可执行文件权限,那么默认脚本是无法直接执行的,但bash或sh解释器,可以将脚本文件作为参数来执行文本。

3d04124faa92027b395573cf83ac3a4a.png

通过以上3条命令的输出信息,可以看到,在没有执行权限的情况下,执行./empty.sh文件会出现权限不够,而使用bash、sh执行脚本文件,就能正确输出结果!

开启子进程的方式

关于是否开启子进程方式,一般通过pstree命令来查看进程树。

e7ea1f171f4b950b41872fee6ea4f81a.png

通过上面的输出,我们可以看到计算机启动进程是systemd,然后在这个进程下启动了N个子进程。

79661025907da27eb25c55a88b459aa8.png

在子进程sshd下有2个sshd的子进程,在2个sshd子进程下开启了bash解释器子进程,而且在其中一个bash进程下面还执行了一条pstree命令。
对于前面我们说的不管是直接执行,还是使用bash、sh解释器执行脚本,都是开启子进程的,下面通过一个脚本演示效果。
sleep.sh

#!/bin/bash

3f8d89534c75330b10b50bd7f81e32a5.png

然后开启一个命令终端,用pstree命令观察进程树

2bede5dfd9a4f03d3b049f603ba88ef7.png

可以看到,在bash终端下开启了一个子进程脚本文本,通过脚本文件执行了一条sleep命令

下面,使用bash命令再次执行该脚本。还是在打开一个终端pstree命令观察

9a4c2fff37e566aa4fe17637f86c9d2e.png

结果类似,在bash进程下开启了一个bash子进程,在bash子进程下执行了一条sleep命令。

不需要开启进程的方式

下面 我们来看看不开启子进程的执行方式的案例,首先,打开一个终端,但是这次我们使用source或者.(点)命令来执行脚本文件。

f5610c3eaee5129f62c5c07f487c4d7e.png

再打开第二个终端,通过pstree命令观察结果。

af3157dc6a3dcd60cdadb1742e316135.png

可以看到,脚本文件中的sleep命令是直接在bash终端下执行的。在写一个脚本,分别使用开启和不开启进程的方式执行。

45942f630a9d3a521f4dc13a0e22cca8.png

bash命令开启子进程的方式执行脚本却不受任何影响。下面,不开启进程的方式执行。

98b5134dcbb2a0f17b66c294b384f1c2.png

source命令不开启子进程执行脚本文件会导致整个终端被关闭。总结1、bash与sh在对于脚本执行来说,效果一致,不继承除了当前shell之外的变量值。在无空格“.”(相对路径)、绝对路径且有执行权限的脚本执行中,效果与bash及sh一致。
2、source及带空格的“.”执行效果一致,且会继承其他shell的变量。
3、除了不带空格的“.”之外,其他脚本的执行都不需要给脚本增加执行权限。
4、bash、sh、不带空格的点(相对路径)或绝对路径中,脚本是在子进程中执行的。在source及带空格的点中,脚本是在父进程中执行的,差别很大。
5、关于是否开启子进程,一般通过pstree命令来查看。

推荐好文  

理一理 Linux 中nohup、&、2>&1是什么?

Linux下抓包神器 tcpdump 使用介绍

Linux shell 自动化修改SSH配置文件

快速了解Linux上gcc编译器

Linux shell 脚本实战案例:监控网络连接状态

linux C 命令行参数之getopt()函数的使用

不能“疏漏”的性能问题(memset)之ltrace调试

GCC编译过程(预处理->编译->汇编->链接)

44099fc91ba90e17b121baa5021cb968.png

欢迎关注公众号【程序猿编码】,添加本人微信号(17865354792),回复:领取学习资料。或者回复:进入技术交流群。网盘资料有如下:

a1a18dfb130ee1f4b58a12c7a9406576.png

写留言

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值