#!
(称为 shebang 或 hashbang)是脚本文件开头的前两个字符,用于告诉操作系统应该使用哪个解释器来执行该脚本。
核心作用:
- 指定解释器: 明确告诉系统运行这个脚本时应该调用哪个程序(解释器)来解析脚本内容。
- 使脚本可像程序一样直接执行: 当你在终端中输入脚本文件名(如
./myscript.sh
)并按下回车时,操作系统会读取 shebang 行,找到指定的解释器,然后将脚本文件作为参数传递给该解释器执行。你不再需要手动输入python myscript.py
或bash myscript.sh
。
基本语法:
#!interpreter_path [optional_argument]
#!
:固定的开头符号。interpreter_path
:解释器的绝对路径。这是最关键的部分。[optional_argument]
:可选的传递给解释器的单个参数(较少用)。
使用方法:
- 必须是文件的第一行: Shebang 必须位于脚本文件的第一行,并且是文件的最开头两个字符。
- 使用绝对路径: 解释器的路径必须是绝对路径(从根目录
/
开始的完整路径)。系统不会像在终端中那样自动搜索PATH
环境变量来查找解释器。 - 赋予脚本执行权限: 在添加 shebang 后,你需要使用
chmod
命令给脚本文件添加可执行权限,才能像程序一样直接运行它:chmod +x your_script_name
常见写法示例:
-
Bash Shell 脚本:
#!/bin/bash echo "Hello from Bash!"
保存为
hello.sh
,然后chmod +x hello.sh
,最后运行./hello.sh
。 -
Python 脚本:
#!/usr/bin/python3 print("Hello from Python 3!")
保存为
hello.py
,然后chmod +x hello.py
,最后运行./hello.py
。 -
使用
/usr/bin/env
查找解释器(推荐写法):#!/usr/bin/env bash # 或者用于 Python #!/usr/bin/env python3
- 优点: 更灵活、更具可移植性。
/usr/bin/env
命令会在当前用户的PATH
环境变量中查找指定的解释器(如bash
,python3
,node
,perl
等)。这样你就不需要硬编码解释器的绝对路径(不同系统或用户安装路径可能不同),只要该解释器在PATH
中就能找到。 - 推荐: 这是现代脚本编写中更推荐的方式,尤其是当你希望脚本能在不同环境(不同用户、不同系统)中运行时。
- 优点: 更灵活、更具可移植性。
-
带参数的解释器(较少用):
#!/bin/bash -e # 告诉 bash 如果任何命令失败(返回非零状态)就立即退出脚本 #!/usr/bin/perl -w # 打开 perl 的警告
总结使用步骤:
- 创建你的脚本文件(如
myscript.sh
)。 - 在文件的第一行写入 shebang,指定正确的解释器路径(推荐用
#!/usr/bin/env interpreter_name
)。 - 保存文件。
- 在终端中,切换到脚本所在目录,运行
chmod +x myscript.sh
赋予执行权限。 - 通过输入脚本的路径来执行它:
- 如果脚本在当前目录:
./myscript.sh
- 如果脚本在
PATH
包含的目录中:myscript.sh
(需要先chmod +x
和确保目录在PATH
中)
- 如果脚本在当前目录:
重要注意事项:
- 仅对脚本文件有效: Shebang 只对可执行的脚本文件有意义。对于需要显式传递给解释器的文件(如
bash script.sh
或python script.py
),shebang 行会被当作普通注释处理。 - 文件编码: 脚本文件通常应该保存为纯文本格式,并且没有字节顺序标记(BOM),尤其是在 Unix/Linux 系统上。建议使用 UTF-8 无 BOM 编码。
- Windows: Shebang 在原生 Windows 命令提示符(cmd.exe)或 PowerShell 中不被识别。在这些环境中,文件扩展名(如
.py
,.pl
,.rb
)通常关联到对应的解释器。但在 Windows Subsystem for Linux (WSL) 或 Git Bash/Cygwin 等类 Unix 环境中,shebang 是有效的。 - 错误路径: 如果 shebang 中指定的解释器路径不存在或不可执行,当你尝试直接运行脚本时会收到类似
"bad interpreter: No such file or directory"
的错误。
总而言之,shebang 是让脚本文件能够自包含其解释器需求并像独立程序一样直接执行的关键机制。 使用 #!/usr/bin/env interpreter
是最通用和推荐的做法。