IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

Linux上的Shebang符号(#!)

茶话汇 2015-01-25 22:31:32 累计浏览 3,415 次
本机暂存

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

首先,这个符号(#!)的名称,英译过来叫做”Shebang”或者”Sha-bang”(还有其他一些名称,不过我一般就用这两个)。

词源与历史:

Shebang的名字来自于SHArp和bang,或haSH bang的缩写,指代Shebang中#!两个符号的典型Unix名称。 Unix术语中,井号通常称为sharp,hash或mesh;而叹号则常常称为bang。也有看法认为,shebang名字中的sh来自于默认shell Bourne shell的名称,sh,因为常常使用shebang调用之。

在2010年版的Advanced bash scripting guide(revision 6.2)中,shebang被称为"sha-bang",同时提到"也写作she-bang或sh-bang",但该文件中没有提到"shebang"这一形式。

丹尼斯·里奇在被问及他会如何称呼这一特性时,他答道:

发信人:"Ritchie, Dennis M (Dennis)** CTR **"
收信人:< [redacted]@talisman.org>
日期:Thu, 19 Nov 2009 18:37:37 -0600
主题:RE: What do -you- call your #! line?

我不记得我们曾经给它取过一个适当的名字。导入这一特性已经是相当晚了--我觉得我是从关于伯克利Unix的UCB会议上的某人那里得到的这一灵感;我可能是首先实现它的人之一,但这个创意是来自于别人的。

至于它的名字:可能是类似于"hash-bang"的英国风描述性文字,但我没有在任何场合使用类似宠物的名字来描述它。

此致,

Dennis

用途:

Shebang这个符号通常在Unix系统的脚本中第一行开头中写到,它指明了执行这个脚本文件的解释程序。

1. 如果脚本文件中没有#!这一行,那么它执行时会默认用当前Shell去解释这个脚本(即:$SHELL环境变量)。

2. 如果#!之后的解释程序是一个可执行文件,那么执行这个脚本时,它就会把文件名及其参数一起作为参数传给那个解释程序去执行。

3. 如果#!指定的解释程序没有可执行权限,则会报错“bad interpreter: Permission denied”。如果#!指定的解释程序不是一个可执行文件,那么指定的解释程序会被忽略,转而交给当前的SHELL去执行这个脚本。

4. 如果#!指定的解释程序不存在,那么会报错“bad interpreter: No such file or directory”。注意:#!之后的解释程序,需要写其绝对路径(如:#!/bin/bash),它是不会自动到$PATH中寻找解释器的。

5. 当然,如果你使用”bash test.sh”这样的命令来执行脚本,那么#!这一行将会被忽略掉,解释器当然是用命令行中显式指定的bash。

举例说明:

以test.sh脚本为例,其中的代码如下

#!/bin/bash
echo"hello, world."
echo"hello, ${1}."

给脚本赋予执行权限:
chmod a+x test.sh

可直接使用以下方式执行脚本,运行之时,其实是 /bin/bash ./test.sh Jay
./test.sh Jay

返回结果为:
hello, world.
hello, Jay.

【文章素材:http://smilejay.com/2012/03/linux_shebang/】

同分类推荐文章

  1. 从零重建 macOS 开发机:可复现的环境初始化流程 (2026-06-14 20:36:00)
  2. 百度物理网络监控工具开源第二弹:毫秒级监控工具 baize,让你的网络问题无处遁形 (2026-06-11 08:10:28)
  3. How to Set Up Homebrew Tap for Private CLI Tools: A Complete Guide (2026-05-27 02:13:03)

查看更多 DevOps 文章 →

建议继续学习

  1. Linux如何统计进程的CPU利用率 (累计阅读 16,307)
  2. 调试工具之GDB (累计阅读 14,829)
  3. 我的 RHCA 之路 (累计阅读 14,013)
  4. Linux内存点滴 用户进程内存空间 (累计阅读 13,229)
  5. 给程序员新手的一些建议 (累计阅读 13,089)
  6. Linux 性能监控、测试、优化工具 (累计阅读 13,011)
  7. 关于linux内存free的一些事情 (累计阅读 12,867)
  8. ps - 按进程消耗内存多少排序 (累计阅读 12,687)
  9. Google怎么用linux (累计阅读 12,581)
  10. Linux Used内存到底哪里去了? (累计阅读 11,867)