在Linux脚本中使用Shebang #!
简介
在Linux中,Shebang(#!)是脚本开始时的一个特殊行,它告诉操作系统在执行脚本时要使用哪个解释器。这一行也被称为 hashbang、shabang 或” sharp-exclamation “,是一个破折号的第一行,以” #! “开头,后面是解释器的路径。Shebang行很重要,因为它允许你在Linux系统上运行用任何语言编写的脚本,而不仅仅是shell脚本。
了解Shebang
什么是Shebang
Shebang “#! ” 这个符号表示在运行脚本时要使用哪一个解释器,或者哪一个解释器的版本。它也被称为 “sharp-exclamation”、”sha-bang”、”hash-bang “或 “pound-bang”。这个名字被认为是由 ” SHarp bang “或 ” haSH bang “的部分缩略词而来。
Shebang总是脚本的第一行。由于它以 “#”符号开始,包含Shebang的那一行不会被shell处理。当Linux系统执行一个文本文件时,它把Shebang当作一个shell指令。它找到正确的解释器并运行它,将文件名作为输入传给解释器。例如,运行一个名为 ” ~/scripts/shebang “的文件,该文件以Shebang ” #!/bin/sh “开头,在功能上等同于运行 ” /bin/sh ” ” ~/scripts/shebang “命令。该文本文件必须是可执行的,才能进行正确的处理。
Shebang的重要性
Shebang 指令有以下优点
- 允许用户将执行的脚本和文件视为命令。
-
对用户隐藏了某些执行细节,例如 解释器 的名称 。
-
不要求用户知道解释器的绝对路径或如何使用 env 命令。
-
允许使用一个特定版本的解释器,例如 python2 和 python3。
-
允许在保持用户行为和命令不变的情况下改变解释器。
-
可以自动将强制选项传递给解释器。
如果解释器的路径是硬编码的,就会出现一个潜在的缺点。如果解释器的位置改变了,Shebang指令也必须同时更新。否则脚本可能会停止工作。
在脚本中使用Shebang
Shebang的格式
Shebang 指令遵循这样的格式:
#!interpreter [options]
下面是一个Shebang指令的真实例子。这个Shebang要求使用Bourne sh shell来运行脚本。这个例子使用一个绝对路径来定义解释器。
#!/bin/sh
env工具可以帮助找到解释器的路径。在这个例子中, Shebang 告诉系统使用 ” /usr/bin/env “来找到通往 python2 解释器的路径。这种技术更加稳健,因为如果路径发生变化,它还能继续工作。
#!/usr/bin/env python2
使脚本可执行
在给你的脚本添加 shebang 行之后,你需要使脚本可执行。要做到这一点,你可以使用带有 “+x “选项的chmod命令。例如 –
$ chmod +x script.py
这个命令使 “script.py “文件可以执行。
运行脚本
在使脚本 可执行 之后,你可以通过在命令行中输入其名称并按回车键来运行它。比如说 –
$ ./script.py
该命令运行’script.py’文件。
Shebang的最佳实践
要遵循的规则
为了有效地实现Shebang,请牢记以下规则。
- 指令必须总是以 “#!” 的组合字符开始
-
为了使其正常工作, Shebang 必须出现在文件的第一行。如果在其他地方发现它,它将被视为一个注释。
-
指定解释器的完整绝对路径或使用env查找正确的路径。在 解释器 名称后面插入解释器选项。编译器选项的实现细节在不同的系统中有所不同。然而,所有主要的操作系统都至少支持一个选项。
-
在 #! 字符组合和解释器名称之间允许有一个或多个空格,但不是必须的。例如,#!解释器和 #! 指令解释器是有效的,而且功能上是等同的。
-
Linux允许第二个脚本充当第一个脚本的解释器,但并不是所有的操作系统都是这样的。
Shebang特殊指令
” #!/bin/false ” 指令是一个特殊的Shebang指令。它立即退出并返回一个错误状态。防止某些系统文件在其适当的上下文之外运行。
总结
Shebang 行是一个重要的工具,它允许你在Linux系统中运行用任何语言编写的脚本。它告诉操作系统在运行脚本时要使用哪个 解释器 ,它是脚本的第一行。Shebang行有几个优点,比如允许用户把脚本和文件当作命令,隐藏执行细节,以及允许使用某个特定版本的解释器。一旦你把shebang行添加到你的脚本中并使其可执行,你就可以通过在命令行中简单地输入其名称来运行它。在Shebang行的帮助下,你可以在Linux系统上借助适当的解释器轻松地运行用任何语言编写的脚本。需要注意的是,如果shell路径是 硬编码的 ,如果shell位置发生变化, shebang 指令必须在shell中更新。