source、sh 与 ./
source
source a.sh
在当前 Shell 中执行 a.sh
,a.sh
不需要有执行权限。source
也可以简写为 .
,比如 . a.sh
。
sh
sh a.sh
打开一个子 Shell 去执行 a.sh
,a.sh
不需要有执行权限。在子 Shell 里执行的 a.sh
里设置的变量,不会影响到父 Shell。类似的,bash
与 sh
同理。
./
./a.sh
打开一个子 Shell 去执行 a.sh
,a.sh
需要有执行权限。注意,这里 ./
与 a.sh
之间没有空格,换个角度看,其实没有使用任何命令,只是指定了当前文件夹下的这个文件而已。这就相当于双击这个文件去运行一样,那这个文件肯定要具有可执行权限。至于为什么要加 ./
,我猜想是为了预防与环境变量中相同的名称引起冲突。
前面采用了相对路径的方法,当然也可以采用绝对路径,比如 /root/a.sh
这样,同样可以执行。
另外,./
运行的文件里通常有 Shebang 一行,也就是以 #!
开头的第一行,用以指明执行这个脚本文件的解释程序。如果没有 Shebang 一行,那么以 ./a.sh
运行脚本时,会自动使用环境变量中的 $SHELL
变量所指定的解释器来运行。
最后,在以 sh a.sh
或 bash a.sh
这样的命令运行脚本时,即使文件中指明了 Shebang,也会自动忽略,因为在命令中已经明确指定了所采用的解释器。