不知道小伙伴们在写 Bash 脚本或者说看别人的 Bash 脚本的时候有没有注意过脚本的第一行
#!/bin/bash
Bash 脚本的第一行往往以 #!
开头,这一行称作 shebang 行
#! interpreter_path
shebang 行中开头 #!
字符的作用是告诉操作系统这不是一个普通二进制文件,而是需要通过解释器运行的东西
#! 字符后面来指定。例如 /bin/bash
表示使用 bash 解释器来执行该脚本文件
#! /usr/bin/perl
#! /usr/bin/awk
#! /usr/bin/python
那么这时候小伙伴们可能就会有疑问:我忘了加 shebang 行,脚本为什么还能执行?
# 一般情况下默认的 shell 为bash
echo $SHELL
现在我们知道了 shebang 行的作用,那么我们现在来编写一个脚本并修改 shebang 行试试
#!/bin/bash
echo Hello
先给 test.sh 脚本添加一下执行权限
chmod +x test.sh
接下来我们用几种方式来执行这个脚本
可以看到脚本都成功执行了
#!/usr/bin/ls -l
echo Hello
然后我们分别用几种方式来执行这个脚本
上面脚本执行的结果是不是看的一脸懵逼,说实话我一开始看到的时候也是很懵
- bash tesh.sh
这种方式执行脚本的原理是将 test.sh 作为参数传给 bash 解释器(命令)来执行,而不是 test,sh 自己来执行
- sh test.sh
这种执行脚本的方式跟上面的方式原理一样,都是将脚本作为参数传进去,只不过是这个方式用的是 sh 解释器(命令),而不是 bash
- /root/test.sh
当使用绝对路径来执行脚本时,操作系统需要知道该脚本文件所使用的解释器类型,这就需要依靠脚本文件中的 shebang 行
#! /bin/bash)
/bin/bash /root/test.sh
在执行脚本的时候,操作系统会读取脚本的 shebang 行
就好比上面的例子,我将 shebang 行改成了 #! /usr/bin/ls -l
,当我执行脚本的时候其实就是下面这样的
/usr/bin/ls -l /root/test.sh
这样会导致脚本无法执行
- ./test.sh
总结:
- shebang 行通常出现在 UNIX 系统的脚本当中,用来指定脚本的解释器路径,出现在第一行,以
- 如果脚本里面没有定义 shebang 行,系统会去找默认的解释器,默认解释器用
echo $SHELL
查看 - 用 bash 或者 sh 命令执行脚本的时候,其实是把脚本作为参数传给 bash 或 sh 命令了,这时候脚本可以不添加执行权限、可以不需要 shebang 行
- 如果用绝对路径或者相对路径的方式来执行脚本,需要脚本拥有执行权限,如果 shebang 行定义的不是解释器而是其他命令,就会导致脚本无法执行
#!
开头
附上参考链接:Shebang Shenanigans :: Linus Karlsson