如何使用 Shebang
什么是 Shebang?
简单来说,就是你在脚本开头看到的这个:
#!/usr/bin/bash
Shebang(也称为 hash-bang、pound-bang 或者 bang)是一个作为脚本文件中的第一行的特殊注释,它告诉系统用哪个解释器来执行脚本。Shebang 后面直接跟着解释器的绝对路径。
在上面的例子中,Shebang 指示系统使用 /usr/bin/bash 作为脚本的解释器。当我们使用如下的命令运行脚本时:
./script.sh
系统就会自动使用 /usr/bin/bash 作为解释器来运行该脚本,即使我们在命令中并没有指定解释器。其作用相当于:
/usr/bin/bash script.sh
然而,如果系统中没有 /usr/bin/bash 这个程序,那么在执行上面的命令时就会出现报错:
zsh: ./script.sh: bad interpreter: /usr/bin/bash: no such file or directory
实际上,即便系统中的某个地方安装有 bash 程序,但因为我们指定的解释器是 /usr/bin/bash,所以只要 bash 没有安装在 /usr/bin 目录下,那么执行脚本的命令 ./script.sh 就会报错。
最佳实践是通过 env 程序来寻找解释器:
#!/usr/bin/env bash
一般来说,每个 *nix 系统在 /usr/bin 目录下都有 env 程序。env 程序的作用是在系统环境变量 PATH 下寻找我们需要的程序,在这个例子中是 bash。也就是说,通过 #!/usr/bin/env xxx 的形式,我们允许需要的程序安装在系统的不同位置,这样就提升了我们脚本的兼容性。它允许了解释器安装在非标准位置的用户也能通过 ./script.sh 命令运行我们的脚本,或者某些希望使用非系统版本解释器的用户能够继续使用自定义的解释器来执行我们的脚本(前提是他在系统环境变量 PATH 的前面指定了自定义解释器的路径)。
误区
注意,以下写法是不建议的:
#!.venv/bin/python
你可能误以为这里给出的相对路径 .venv/bin/python 是相对于脚本文件的,但实际上不是。Shebang 中的路径是相对于当前工作目录的,而不是相对于脚本文件的。所以,如果你在执行脚本时不在脚本文件所在的目录下,那么这种写法就会出错。
正确的写法是在 Shebang 中使用绝对路径。
Shebang 的历史
Shebang 的历史可以追溯到 1971 年的 UNIX 第七版。在那个时候,Shebang 的格式是 #! 后面直接跟着解释器的名称,而不是路径。这种写法的问题在于,解释器的名称可能会因系统而异,所以这种写法的兼容性很差。直到 1980 年代,Shebang 才被修改为现在的格式。
如何使用 Shebang的更多相关文章
- (转)Linux上的Shebang符号(#!)
https://linux.cn/article-3664-1.html 本文了将给你简单介绍一下Shebang(”#!”)这个符号. 首先,这个符号(#!)的名称,叫做”Shebang”或者”Sha ...
- [linux-脚本]shebang(shabang #!)
使用Linux或者unix系统的人们对#!这个符号都不陌生,但要说出个具体的所以然来,很多人估计还真不行,我们有必要就此整理一下.Shebang这个符号通常在Unix系统的脚本中第一行开头中写到,它指 ...
- Bash Shebang 小结
在 shell(Bash 是一种 shell) 中执行外部程序和脚本时,Linux 内核会启动一个新的进程,以便在新的进程中执行指定的程序或脚本.内核知道该如何为编译型的程序做这件事,但是对于脚本程序 ...
- Shebang(#!)[转]
原博文 使用Linux或者unix系统的同学可能都对#!这个符号并不陌生,但是你真的了解它吗? 首先,这个符号(#!)的名称,叫做"Shebang"或者"Sha-bang ...
- 00001 - Linux 上的 Shebang 符号(#!)
使用Linux或者unix系统的同学可能都对#!这个符号并不陌生,但是你真的了解它吗? 本文了将给你简单介绍一下Shebang(”#!”)这个符号. 首先,这个符号(#!)的名称,叫做”Shebang ...
- 看懂shebang吧,只需一点点shell知识,从此再也不犯强迫症
Python2: 开启一个terminal,输入下面命令: yshuangj@ubuntu:~$ vim helloA.py 在vim编辑器中,进入编辑模式(按i),输入下面的代码,然后退出编辑模式( ...
- 释伴:Linux 上的 Shebang 符号(#!)
使用Linux或者unix系统的同学可能都对#!这个符号并不陌生,但是你真的了解它吗? 本文了将给你简单介绍一下Shebang(”#!”)这个符号. 首先,这个符号(#!)的名称,叫做”Shebang ...
- shebang是啥
在计算领域中,Shebang(也称为 Hashbang )是一个由井号和叹号构成的字符序列 #! ,其出现在文本文件的第一行的前两个字符. 在文件中存在 Shebang 的情况下,类 Unix 操作系 ...
- 人们为什么在Python脚本的第一行上编写#!/ usr / bin / env python shebang?
在我看来,如果没有该行,文件运行相同. #1楼 您可以使用virtualenv尝试此问题 这是test.py #! /usr/bin/env python import sys print(sys.v ...
- Shell脚本中的shebang到底是什么
使用类Unix系统的同学可能都对"#!"这个符号并不陌生,但是你真的了解它吗? 这个符号的名称,叫做"Shebang"或者"Sha-bang" ...
随机推荐
- 2-SET详解
前置知识 SET问题的标准定义:在计算机科学中,布尔可满足性问题(有时称为命题可满足性问题,缩写为SATISFIABILITY或SAT)是确定是否存在满足给定布尔公式的解释的问题.(全是废话) 说人话 ...
- 3562-Linux系统使用手册
- Node.js中的模块
CommonJS模块 CommonJS是一种规范,它定义了JavaScript 在服务端运行所必备的基础能力,比如:模块化.IO.进程管理等.其中,模块化方案影响深远,其对模块的定义如下: 1,模块引 ...
- window10设置开机自启动exe的三种方式(亲测有效)
拷贝文件到自启动位置 路径地址:C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 通过组策略设置脚本随服务器启动 开始-> ...
- redis基本数据结构-集合set
redis基本数据结构-集合set 特性 一个集合键最多存储 2^32 - 1 个字符串值 元素在集合内无序(哈希表-链地址法解决冲突) 元素在集合内唯一 向集合添加元素 sadd key value ...
- 解决方案 | vb记住上次打开的文件夹
Private Sub Button_ImportBasicData_Click(sender As Object, e As EventArgs) Handles Button_ImportBa ...
- Vue2 移动端 ui库 MintUI
MintUI MintUI是饿了么团队开发的基于移动端的vue组件库.用于搭建移动端界面. http://mint-ui.github.io/docs/#/zh-cn2
- UE导入FBX、GLTF模型
楔子 虽然做了很多年的三维可视化,不过都主要还是web端开发为主(webgl,threejs,有兴趣的读者也可以关注下我的相关专栏).最近准备入手一下UE,顺便做一下知识梳理. 所以文章可能都是比较粗 ...
- [oeasy]python0078_变量部分总结_variable_summary
删除变量 回忆上次内容 上次研究了变量的死 有生就有死 原本的死是在程序退出的时候自动执行的 也可以手动给变量执行死刑 del del(a)之后 dir()就无法在当前作用域(scope)内观 ...
- 字符—字符与整数的关系&&常用的库函数_C
// Code file created by C Code Develop #include "ccd.h" #include "stdio.h" #incl ...