Shebang #!

摘要

Shebang,也称为 Hashbang,是一个由井号叹号构成的字符序列 #!
Shebang 通常出现在类Unix系统的脚本中第一行,作为前两个字符。在 Shebang 之后,可以有一个或数个空白字符,后接解释器的绝对路径,用于指明执行这个脚本文件的解释器。

起因

最初接触到 Shebang 这个词,是在和同事 Pair 的过程中聊天时提及的,由于还是菜鸟,所以并不了解这是个什么东西,于是就去查了一下,记了笔记。
但是,之所以写这篇 Blog ,是由于在开会的时候一个同事提到 Shebang 后不能跟空格,这时候我就有点困惑了,因为我第一次看到的资料是 Shebang 后可以接一个或多个空格
于是,为了搞清楚到底能不能接空格这个问题,我特意尝试了一番。

Shebang 是什么

Shebang,也称为 Hashbang,是一个由井号叹号构成的字符序列 #!

Shebang 通常出现在类Unix系统的脚本中第一行,作为前两个字符。在 Shebang 之后,可以有一个或数个空白字符,后接解释器的绝对路径,用于指明执行这个脚本文件的解释器。

在文件中存在 Shebang 的情况下,类 Unix 操作系统的程序加载器会分析 Shebang 后的内容,将这些内容作为解释器指令,并调用该指令,并将载有 Shebang 的文件路径作为该解释器的参数。

由于 # 符号在许多脚本语言中都是注释标识符,Shebang 的内容会被这些脚本解释器自动忽略。 在 # 字符不是注释标识符的语言中,例如 Scheme,解释器也可能忽略以 #! 开头的首行内容,以提供与 Shebang 的兼容性。

Shebang 后可接一个或多个空格

对于这个问题,我做了一个尝试:

  1. 两个 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 脚本)
    which interpreter

  2. 两个 Node 脚本,分别在 Shebang 后有空格和没空格

    #!/usr/bin/env node
    
    console.log("Shebang 后无空格");
    
    ## 运行结果
    ## Shebang 后无空格
    
    #!     /usr/bin/env node
    
    console.log("Shebang 后有空格");
    
    ## 运行结果
    ## Shebang 后有空格
    

    让我验证出来了,两个脚本都成功运行了 Node 脚本,这就证明程序加载器成功识别了 Shebang 后的解释器。也就证明了 Shebang 后可以加空格。

参考资料

猜你喜欢

转载自blog.csdn.net/qq_37164975/article/details/106437826
今日推荐