source、sh 与 ./

source

source a.sh 在当前 Shell 中执行 a.sha.sh 不需要有执行权限。source 也可以简写为 .,比如 . a.sh

sh

sh a.sh 打开一个子 Shell 去执行 a.sha.sh 不需要有执行权限。在子 Shell 里执行的 a.sh 里设置的变量,不会影响到父 Shell。类似的,bashsh 同理。

./

./a.sh 打开一个子 Shell 去执行 a.sha.sh 需要有执行权限。注意,这里 ./a.sh 之间没有空格,换个角度看,其实没有使用任何命令,只是指定了当前文件夹下的这个文件而已。这就相当于双击这个文件去运行一样,那这个文件肯定要具有可执行权限。至于为什么要加 ./,我猜想是为了预防与环境变量中相同的名称引起冲突。

前面采用了相对路径的方法,当然也可以采用绝对路径,比如 /root/a.sh 这样,同样可以执行。

另外,./ 运行的文件里通常有 Shebang 一行,也就是以 #! 开头的第一行,用以指明执行这个脚本文件的解释程序。如果没有 Shebang 一行,那么以 ./a.sh 运行脚本时,会自动使用环境变量中的 $SHELL 变量所指定的解释器来运行。

最后,在以 sh a.shbash a.sh 这样的命令运行脚本时,即使文件中指明了 Shebang,也会自动忽略,因为在命令中已经明确指定了所采用的解释器。