Shell编程规范-关于首行

关于首行

使用#!/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 脚本的标准起始行。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180226G1GMP900?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券