在 Linux 中,Shell 脚本就是一个纯文本文件,里面包含一系列命令,由特定的解释器逐行执行。为了让系统知道该用哪个解释器来运行这个脚本,脚本的第一行通常会写一个特殊的声明,称为 Shebang(也拼作 shebang,来自“sharp”# 和“bang”!)。
1. Shebang 的基本格式
#!/bin/bash
#!必须出现在文件的最开头,前面不能有任何空格或空行。- 紧接着是解释器的绝对路径,例如
/bin/bash、/usr/bin/python3、/bin/sh等。 - 可以在路径后附加单个选项,例如
#!/bin/bash -e(遇错即退),#!/usr/bin/awk -f(从文件读取 awk 程序)。
完整的脚本示例:
#!/bin/bash
echo "Hello, world!"
2. 为什么需要 Shebang
当你运行一个可执行的文本文件时,内核会读取文件的前几个字节,检测到 #! 后,就会调用后面指定的解释器,并把脚本文件作为参数传给它。这样一来,你就不必每次都手动输入解释器的名字去执行脚本。例如,有了 #!/bin/bash,直接 ./myscript.sh 等价于调用 /bin/bash ./myscript.sh。
如果没有 Shebang,或者指定了一个不存在的解释器路径,系统通常会使用当前 shell 去尝试解释执行,行为可能不可预期且容易出错。因此,明确声明解释器是良好习惯。
3. 常用 Shebang 示例
#!/bin/sh:使用系统默认的 POSIX shell(通常是 dash 或 bash 的兼容模式),适合追求最大可移植性的脚本。#!/bin/bash:明确使用 Bash,支持 Bash 扩展语法(数组、[[条件测试等)。#!/usr/bin/env python3:不硬编码解释器路径,而是从PATH环境变量中查找python3。这种方法常用于跨平台脚本,因为 Python 的安装位置可能不同。#!/usr/bin/perl或#!/usr/bin/awk -f:也适用于其他解释型语言。
4. 可执行权限是前提
即便脚本文件内正确书写了 Shebang,也必须赋予该文件执行权限,才能以 ./script 的方式直接运行:
chmod +x myscript.sh
./myscript.sh
如果不加执行权限,直接 ./myscript.sh 会提示权限不足;此时你仍可以用 bash myscript.sh 或 sh myscript.sh 手动调用解释器来执行,但这其实绕过了 Shebang 的指定。
5. 实用注意事项
- Shebang 行不应有尾随空格或多余的字符,否则解释器路径可能被误读。
- 若脚本需要传递给解释器的参数不止一个,Shebang 只允许一个选项字符串。如需多个参数,通常用包装脚本或通过
/usr/bin/env结合单独的set命令处理。 - 在 Windows 系统上编写脚本再传到 Linux 时,务必注意换行符(CRLF vs LF)。如果文件以
\r\n换行,Shebang 可能失效,导致奇怪的“未找到命令”错误。可以用dos2unix或sed -i 's/\r$//'修复。
总的来说,Shebang 是每个 Shell 脚本的基本“身份标识”,它明确了由谁负责解释执行,是脚本工程化的第一步。