什么是 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的更多相关文章

  1. (转)Linux上的Shebang符号(#!)

    https://linux.cn/article-3664-1.html 本文了将给你简单介绍一下Shebang(”#!”)这个符号. 首先,这个符号(#!)的名称,叫做”Shebang”或者”Sha ...

  2. [linux-脚本]shebang(shabang #!)

    使用Linux或者unix系统的人们对#!这个符号都不陌生,但要说出个具体的所以然来,很多人估计还真不行,我们有必要就此整理一下.Shebang这个符号通常在Unix系统的脚本中第一行开头中写到,它指 ...

  3. Bash Shebang 小结

    在 shell(Bash 是一种 shell) 中执行外部程序和脚本时,Linux 内核会启动一个新的进程,以便在新的进程中执行指定的程序或脚本.内核知道该如何为编译型的程序做这件事,但是对于脚本程序 ...

  4. Shebang(#!)[转]

    原博文 使用Linux或者unix系统的同学可能都对#!这个符号并不陌生,但是你真的了解它吗? 首先,这个符号(#!)的名称,叫做"Shebang"或者"Sha-bang ...

  5. 00001 - Linux 上的 Shebang 符号(#!)

    使用Linux或者unix系统的同学可能都对#!这个符号并不陌生,但是你真的了解它吗? 本文了将给你简单介绍一下Shebang(”#!”)这个符号. 首先,这个符号(#!)的名称,叫做”Shebang ...

  6. 看懂shebang吧,只需一点点shell知识,从此再也不犯强迫症

    Python2: 开启一个terminal,输入下面命令: yshuangj@ubuntu:~$ vim helloA.py 在vim编辑器中,进入编辑模式(按i),输入下面的代码,然后退出编辑模式( ...

  7. 释伴:Linux 上的 Shebang 符号(#!)

    使用Linux或者unix系统的同学可能都对#!这个符号并不陌生,但是你真的了解它吗? 本文了将给你简单介绍一下Shebang(”#!”)这个符号. 首先,这个符号(#!)的名称,叫做”Shebang ...

  8. shebang是啥

    在计算领域中,Shebang(也称为 Hashbang )是一个由井号和叹号构成的字符序列 #! ,其出现在文本文件的第一行的前两个字符. 在文件中存在 Shebang 的情况下,类 Unix 操作系 ...

  9. 人们为什么在Python脚本的第一行上编写#!/ usr / bin / env python shebang?

    在我看来,如果没有该行,文件运行相同. #1楼 您可以使用virtualenv尝试此问题 这是test.py #! /usr/bin/env python import sys print(sys.v ...

  10. Shell脚本中的shebang到底是什么

    使用类Unix系统的同学可能都对"#!"这个符号并不陌生,但是你真的了解它吗? 这个符号的名称,叫做"Shebang"或者"Sha-bang" ...

随机推荐

  1. 【论文阅读】TRO2022: A Two-Stage Optimization-Based Motion Planner for Safe Urban Driving

    TRO2022: A Two-Stage Optimization-Based Motion Planner for Safe Urban Driving Summary: 探讨planning过程中 ...

  2. 价破天荒!99元国产ARM工业“评估板”再袭,14天限量抢购!

    上线即爆款!2000家企业选择! 凭借"79元超高性价比"."双核A7@1.2GHz"."国产化率100%"."ARM + DSP ...

  3. Flask API 如何接入 i18n 实现国际化多语言

    ​ 1. 介绍 上一篇文章分享了 Vue3 如何如何接入 i18n 实现国际化多语言,这里继续和大家分享 Flask 后端如何接入 i18n 实现国际化多语言. 用户请求 API 的多语言化其实有两种 ...

  4. c 语言学习第四天

    if 语句 格式: // 1 // 其他语句... if(表达式){ // 其他语句... } // 其他语句... // 2 if(表达式){ }else{ } // 3 if(表达式1){ }el ...

  5. sshd管理限制登录配置(centos7.9)

    背景情况:为了公网的主机,被无限的密码爆破,需要对主机的ssh进行安装加固 1.首先要禁用root的远程登录和修改ssh的端口 vi /etc/ssh/sshd_config# 修改端口,不适用22端 ...

  6. [oeasy]python0141_自制模块_module_reusability_复用性

    自制包内容 回忆上次内容 上次导入了外部的py文件 import my_module 导入一个自己定义的模块   可以使用my_module中的变量 不能 直接使用 my_module.py文件中的变 ...

  7. 适用于 .NET 的现代化、流畅、可测试的HTTP客户端库

    前言 今天大姚给大家分享一个.NET开源(MIT License).免费.现代化.流畅.可测试.可移植的URL构建器和HTTP客户端库:Flurl. 项目介绍 Flurl是一个集现代性.流畅性.异步性 ...

  8. [rCore学习笔记 07]移除标准库依赖

    改造Rust hello world 移除println!宏 rustc添加对裸机的支持 rustup target add riscv64gc-unknown-none-elf detail rus ...

  9. oauth2协议

    什么是OAUTH2协议: 首先是几个概念问题: 资源:用户信息,在微信中存储 资源拥有者:用户 认证服务:微信负责认证用户的身份,也负责为客户端颁发令牌 客户端:携带令牌请求微信获取用户信息 仍以微信 ...

  10. 假期小结4hive学习beeline

    学习Beeline是连接和管理Hive的一种有效方式.Beeline是一个用于与Hive交互的命令行工具,它支持通过JDBC连接到Hive服务器,并执行查询和管理Hive表等操作. 以下是一些关于Be ...