shell脚本文件 |
您所在的位置:网站首页 › shell脚本文件 › shell脚本文件 |
当我们编写好脚本文件以后,接下来就是执行脚本文件了。执行脚本文件的方式有很多种,比如一个文件a.sh,我们可以选择需要执行权限的方式(chmod +x a.sh),不需要执行权限的方式(bash a.sh或者sh a.sh),需要开启子进程的方式,不需要开启进程的方式。 可执行权限方式 通过chmod 命令可以给脚本文件分配执行权限,脚本文件一旦有了执行权限,就可以使用绝对路径或相对路径执行了。下面来看看效果: empty.sh #!/bin/bash if [ $# -eq 0 ];then echo "用法:$0 文件名..." exit 1 fi #测试位置变量个数,个数为0时循环结束 while (($#)) do if [ ! -s $1 ];then echo -e "为空文件,正在删除该文." rm -rf $1 else [ -f $1 ] && echo -e "为非空文件." [ -d $1 ] && echo -e "为目录,不是文件名." fi shift done本脚本是检测多个文件是否为空,读取位置参数,测试是否空文件删除空文件。可以看到chmod +x empty.sh分配可执行权限,然后使用相对路径执行。也可以使用绝对路径。 ./的命令用法 从上面的信息来看,chmod +x empty.sh分配可执行权限后,可以使用./empty.sh执行,那./有什么作用呢? 其实就是打开一个子shell来读取并执行empty中命令。 运行一个shell脚本时会启动另一个命令解释器。每个shell脚本有效地运行在父shell(parentshell)的一个子进程里. 没有可执行权限方式 如果暂时还没有给脚本文件可执行文件权限,那么默认脚本是无法直接执行的,但bash或sh解释器,可以将脚本文件作为参数来执行文本。
开启子进程的方式 关于是否开启子进程方式,一般通过pstree命令来查看进程树。 通过上面的输出,我们可以看到计算机启动进程是systemd,然后在这个进程下启动了N个子进程。
对于前面我们说的不管是直接执行,还是使用bash、sh解释器执行脚本,都是开启子进程的,下面通过一个脚本演示效果。 sleep.sh #!/bin/bash sleep 1000
可以看到,在bash终端下开启了一个子进程脚本文本,通过脚本文件执行了一条sleep命令 下面,使用bash命令再次执行该脚本。还是在打开一个终端pstree命令观察 结果类似,在bash进程下开启了一个bash子进程,在bash子进程下执行了一条sleep命令。 不需要开启进程的方式 下面 我们来看看不开启子进程的执行方式的案例,首先,打开一个终端,但是这次我们使用source或者.(点)命令来执行脚本文件。 再打开第二个终端,通过pstree命令观察结果。 可以看到,脚本文件中的sleep命令是直接在bash终端下执行的。在写一个脚本,分别使用开启和不开启进程的方式执行。
source命令不开启子进程执行脚本文件会导致整个终端被关闭。 总结 1、bash与sh在对于脚本执行来说,效果一致,不继承除了当前shell之外的变量值。在无空格“.”(相对路径)、绝对路径且有执行权限的脚本执行中,效果与bash及sh一致。 2、source及带空格的“.”执行效果一致,且会继承其他shell的变量。 3、除了不带空格的“.”之外,其他脚本的执行都不需要给脚本增加执行权限。 4、bash、sh、不带空格的点(相对路径)或绝对路径中,脚本是在子进程中执行的。在source及带空格的点中,脚本是在父进程中执行的,差别很大。 5、关于是否开启子进程,一般通过pstree命令来查看。
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |