Linux执行shell脚本的方式

这里简述 Linux 下 shell 脚本的几种执行方式。包括:直接执行, shell 命令执行, shell 内建 source 或 . 命令执行。

示例脚本如下 test.sh:
#!/bin/sh
[[ -n "noempty" ]] && echo "no empty" || echo "empty"
exit 0

1、
直接以绝对或相对路径执行,或在 PATH 环境变量的范围内不带路径执行。如:./test.sh 。

这里脚本本身必须加上可执行权限,chmod +x test.sh 。解释器以脚本头部的解释器标识行为准(#! ,shebang,sha-bang),这里是 /bin/sh,因为 sh 解释器没有 [[]] ,只有 [] 的用法,所以这个脚本是错的,不能执行成功。

2、
作为 shell 解释器命令的参数执行。如:sh ./test.sh 或 bash ./test.sh 。

这里脚本可以是去掉执行权限的,chmod -x test.sh 。解释器会忽略脚本头部的解释器标识行,以调用脚本的解释器命令为准。如执行 bash ./test.sh,脚本内容实际上是以 bash 为解释器执行的,因为 bash 里有 [[]] 的用法,所以这个脚本会被成功执行的。

另外,在以 bash 命令执行脚本时,如果脚本文件没有路径,则会先搜索当前目录,再搜索 PATH 环境变量。

3、
以 shell 内建 source 或 . 命令执行。如 source ./test.sh 或 . ./test.sh 。

这里脚本也是可以去掉执行权限的,chmod -x test.sh 。解释器会忽略脚本头部的解释器标识行,以当前运行的shell解释器命令执行,如果是在 bash shell 中这个脚本会被成功执行的。但与上面第 2 种方式不同的是,第 2 种方式会在当前 shell 中新生成一个子进程执行,而 source 命令或 . 命令直接在当前 shell 中执行脚本的内容,不会新生成子进程,所以上面脚本最后的 exit 0 命令也会直接在当前执行 source 命令的脚本中执行,导致当前脚本直接退出。

在以 bash 内建 source(.)或 sh 内建 . 命令执行脚本时,如果脚本文件没有路径,则会默认搜索 PATH 环境变量。

source 或 . 命令多用于在当前shell 中导入变量或库函数。相当于直接在 shell 中添加了 source 或 . 文件内的内容。

另,本文的环境为 Debian 8,bash 版本为 4.3,dash (sh) 版本为 0.5.7。其它的 shell 未一一验证。

以上内容参见: man bash, man sh。关于 source 内建命令的用法还可参见 Advanced Bash-Scripting Guide: http://www.tldp.org/LDP/abs/html/internal.html#SOURCEREF

发表评论

电子邮件地址不会被公开。 必填项已用*标注