关于首行
使用#!/usr/bin/env bash
我们往往看到大多数shell脚本的第一行是 这句话,当然也有 、,这几种写法也都算是正确,当然还有一些野路子的写法,为了避免误导这里就不示例了。本shell规约并不推荐使用上面的任何一种,而是使用 这种。
shell脚本的第一行用来指定执行脚本的时候使用的默认解析器是什么, 这样写就是指定使用 目录下的来解析。大多数 linux 发行版中默认的 shell 就是 bash ,不同的 shell 下可用的命令不同,比如 sh 就比 bash 可用的基础命令少很多,这也就是为什么虽然sh是始祖却用的人很少,而它的增强版 bash 能够后来居上的原因。
shell脚本是逐行解释执行的,在遇到第一行是 的时候就会加载 bash 相关的环境,在遇到 就会加载 sh 相关的环境,避免在执行脚本的时候遇到意想不到的错误。但一开始我并不知道我电脑上安装了哪些shell,默认使用的又是哪一个shell,我脚本移植到别人的计算机上执行,我更不可能知道别人的计算机是Ubuntu还是Arch或是Centos。为了提高程序的移植性,本shell规约规定使用 , 会自己判断使用的shell是什么,并加载相应的环境变量。
我们看一下下面一段脚本,在改变第一行头部的时候,shellcheck给出的建议是什么
$ cat test.sh
使用 #!/bin/bash 或 #!/usr/bin/env bash
使用 #!/bin/zsh
使用 #!/bin/sh
这一行不写大多数时候我们运行脚本的时候也没有问题,但在使用shellcheck进行检查的时候,会提示
^-- SC2148: Tips depend on target shell and yours is unknown. Add a shebang.
如果使用Intellij IDEA 也会提示
当你点击 Add shebangline 的时候它会自动添加 ,这也是为什么本shell规约推荐使用 的原因之一
shebang 维基百科
在计算机科学中,Shebang(也称为 Hashbang )是一个由井号和叹号构成的字符序列#!,其出现在文本文件的第一行的前两个字符。 在文件中存在 Shebang 的情况下,类 Unix 操作系统的程序载入器会分析 Shebang 后的内容,将这些内容作为解释器指令,并调用该指令,并将载有 Shebang 的文件路径作为该解释器的参数。
例如,以指令开头的文件在执行时会实际调用程序(通常是 Bourne shell 或兼容的 shell,例如 bash、dash 等)来执行。这行内容也是 shell 脚本的标准起始行。
领取专属 10元无门槛券
私享最新 技术干货