摘要
Shebang,也称为 Hashbang,是一个由井号和叹号构成的字符序列 #!
。
Shebang 通常出现在类Unix系统的脚本中第一行,作为前两个字符。在 Shebang 之后,可以有一个或数个空白字符,后接解释器的绝对路径,用于指明执行这个脚本文件的解释器。
起因
最初接触到 Shebang 这个词,是在和同事 Pair 的过程中聊天时提及的,由于还是菜鸟,所以并不了解这是个什么东西,于是就去查了一下,记了笔记。
但是,之所以写这篇 Blog ,是由于在开会的时候一个同事提到 Shebang 后不能跟空格,这时候我就有点困惑了,因为我第一次看到的资料是 Shebang 后可以接一个或多个空格。
于是,为了搞清楚到底能不能接空格这个问题,我特意尝试了一番。
Shebang 是什么
Shebang,也称为 Hashbang,是一个由井号和叹号构成的字符序列 #!
。
Shebang 通常出现在类Unix系统的脚本中第一行,作为前两个字符。在 Shebang 之后,可以有一个或数个空白字符,后接解释器的绝对路径,用于指明执行这个脚本文件的解释器。
在文件中存在 Shebang 的情况下,类 Unix 操作系统的程序加载器会分析 Shebang 后的内容,将这些内容作为解释器指令,并调用该指令,并将载有 Shebang 的文件路径作为该解释器的参数。
由于 #
符号在许多脚本语言中都是注释标识符,Shebang 的内容会被这些脚本解释器自动忽略。 在 #
字符不是注释标识符的语言中,例如 Scheme,解释器也可能忽略以 #!
开头的首行内容,以提供与 Shebang 的兼容性。
Shebang 后可接一个或多个空格
对于这个问题,我做了一个尝试:
-
两个 Shell 脚本,分别在 Shebang 后有空格和没空格:
#!/bin/bash echo "Shebang 后无空格" echo $SHELL ## 运行结果 ## Shebang 后无空格 ## /bin/zsh
#! /bin/bash echo "Shebang 后有空格" echo $SHELL ## 运行结果 ## Shebang 后有空格 ## /bin/zsh
我的想法是,如果 Shebang 后可以接空格,那么
$SHELL
就会打印出bash
,如果不行,那必然打印的是默认的sh
。
但是,事与愿违,$SHELL
打印出的是zsh
Σ(⊙▽⊙"a,居然是我本机用的 Shell ,那根本没法验证到底用没有用 bash 。
而最终,我也并没有找到可以确定当前脚本所使用的 Shell 解释器的方法。
于是,第一种方案只得放弃。
(知道的朋友说一下,感谢!)
(我找到一种方法,用 ps 命令来查看当前进程,进而确定运行当前脚本的到底是哪个 Shell 解释器,仅用于 Shell 脚本)
-
两个 Node 脚本,分别在 Shebang 后有空格和没空格:
#!/usr/bin/env node console.log("Shebang 后无空格"); ## 运行结果 ## Shebang 后无空格
#! /usr/bin/env node console.log("Shebang 后有空格"); ## 运行结果 ## Shebang 后有空格
让我验证出来了,两个脚本都成功运行了 Node 脚本,这就证明程序加载器成功识别了 Shebang 后的解释器。也就证明了 Shebang 后可以加空格。