使用linux不免要用到执行脚本,比如一个文件a.sh,我们有时会见到用. a.sh
去执行,有时见到用sh a.sh
去执行,或者bash a.sh
,或者source a.sh
,那么这两种执行脚本的方式有什么区别呢?这个问题也困惑了本人很久,今天总结一下:
首先考虑这样子一种情况:
我的作用文件有时候路径比较长,为什么不创建一个脚本放在初始路径下,这样运行一下直接到到位,于是有了下面的welcome.sh
,内容为:
#!/bin/bash
echo "cd /opt/jskp/jinjiwei"
cd /opt/jskp/jinjiwei
其中#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。 echo 命令用于向窗口输出文本。
保存到根目录下,执行
1、. welcome.sh
方法执行:
如图可见,两条语句都被执行,第一条执行输出第二条命令,第二条命令执行进入对应目录。
2、source welcome.sh
方法执行:
3、bash welcome.sh
方法执行:
4、sh welcome.sh
方法执行:
可以看出,.或source
对于脚本中的语句可以全部执行,但是sh或bash
只能执行第一条语句,而且不管有没有解释器信息结果都是一样的哦,很奇怪的现象,现象解释:
这样执行的话终端会产生一个子shell(类似于C语言调用函数),子shell去执行我的脚本,在子shell中已经切换了目录了,但是子shell一旦执行完,马上退出,子shell中的变量和操作全部都收回。回到终端根本就看不到这个过程的变化。引用文档
这种情况下可以使用.或source
方法解决哦,因为.或source
与加载资源类似,把脚本当作程序加载运行。
所以推荐使用. a.sh
,source a.sh
执行脚本哦。