shell脚本的执行方式有三种,假如我们的脚本名称是test.sh
①./test.sh 或者 path/test.sh
该运行方式我们在日常工作时经常测试使用,有两点需要注意,
第一该脚本当前用户必须有可执行权限,即有x权限,如无,需要chmod +x test.sh;
第二如果在其他脚本中调用该脚本一定要写绝对路径(后者)来运行,如crontab表达式里
②bash test.sh 或者 sh test.sh
这种方式一般在正式脚本里使用,即使脚本没有可执行权限,或者脚本文件开头没有指定解释器时也可以使用,如#!/bin/bash
③source test.sh 或者 . ./test.sh
该方式与前面两者不同,它不用调用子进程来进行运行,是可以直接在当前进程中运行并且把结果显示在当前进程中。实际应用中比如我们在脚本里调用其他脚本里的变量时都是采用source script_name.sh来实现调用
也许难以理解,现在我们来解释下
linux系统与windows系统的区别是后者的桌面与图形化做的完美,而前者的权限管理与多租户多用户完美,所以pc多用于windows系统,而开发多用linux系统
所以linux系统为了解决多用户管理问题,对某些变量都是独立运行并存储在当前用户里,不然这个用户跑变量影响另一个用户就不好了,所以我们使用第一种第二种方式时变量只显示自己当前进程里
举例说明
写一个脚本test.sh
bb="Hello World"
echo $bb
sleep 20
分别用前两种方式运行
可以看到,①方式不加权限无法运行,②方式可以运行并输出了,但是echo变量并不显示,使用pstree查看用户使用情况,可以看到有两个窗口在登陆,其中一个窗口在跑shell
现在我们使用第三种方式,同样该脚本文件并未赋予可执行x权限
可以看到变量显示了
总结:日常工作中,我们需要有规范心态,每一个shell脚本文件开头都备注上使用的什么解释器,即#!/bin/bash;脚本文件调用运行时使用绝对路径,即pwd显示的全路径;需要调用脚本变量时使用source 或者 . 来获取到变量内容