如何使用 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" ...
随机推荐
- 【论文阅读】RAL 2022: Receding Moving Object Segmentation in 3D LiDAR Data Using Sparse 4D Convolutions
参考与前言 Status: Finished Type: RAL Year: 2022 论文链接:https://www.ipb.uni-bonn.de/wp-content/papercite-da ...
- 【Zabbix】Zabbix5.0安装部署问题汇总
报错信息:No package 'oniguruma' found 解决方法:https://www.limstash.com/articles/202003/1563 报错信息: PHP bcmat ...
- yb课堂 vue里面的状态管理vuex 《四十》
文档:https://vuex.vuejs.org/zh/ 在store/下index.js import Vue from 'vue' import Vuex from 'vuex' Vue.use ...
- 记录荒废了三年的四年.net开发的第一次面试
对象 身在成都小微企业,前两天面试深圳老牌金蝶公司.对我这个荒废了三年光影的人来说,怎一个跨度之大了得?作为人我生第一次面试的,整个面试过程,只能用诡异来形容这次感受.而结尾也是迷迷糊糊中草草收场. ...
- 2024-07-17:用go语言,给定一个整数数组nums, 我们可以重复执行以下操作: 选择数组中的前两个元素并删除它们, 每次操作得到的分数是被删除元素的和。 在保持所有操作的分数相同的前提下,
2024-07-17:用go语言,给定一个整数数组nums, 我们可以重复执行以下操作: 选择数组中的前两个元素并删除它们, 每次操作得到的分数是被删除元素的和. 在保持所有操作的分数相同的前提下, ...
- Nginx $remote_addr和$proxy_add_x_forwarded_for变量详解
$remote_addr 代表客户端IP.注意,这里的客户端指的是直接请求Nginx的客户端,非间接请求的客户端.假设用户请求过程如下: 用户客户端--发送请求->Nginx1 --转发请求-- ...
- [NOIP2008 提高组] 笨小猴(洛谷题号P1125)
[NOIP2008 提高组] 笨小猴 题目描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描 ...
- 错误记录java: JDK isn't specified for module
跑苍穹外卖的时候遇到了 java: JDK isn't specified for module 'sky-pojo'这一问题 解决办法是通过修改JDK版本,这个项目用的springboot比较早,可 ...
- 打开电脑属性 设置 windows
组合键:win+R,输入sysdm.cpl,然后运行. 右键"此电脑",选择属性,然后点击高级系统设置. 组合键:win+Pause/Break. 在命令提示符中输入SystemP ...
- ddddocr验证码图片识别YYDS
纯数字 数字+字母 python代码: import ddddocr def main(imgpath): # imgpath='E:\yam_0.png' ocr = ddddocr.DdddOcr ...