一般的Unix系统中都会出现#!这种符号,但这种符号叫什么,是什么一个原理呢?

#!符号可以叫做shebang,很早之前,shebang一直都没有正式的中文名称,后来Linux中国翻译组的GOLinux将其翻译为释伴,即"解释伴随行"的简称,同时又是shebang的音译

shebang通常出现在Unix系统的脚本中的第一行,作为前两个字符,在shebang之后,可以有一个或者多个空白字符,后接解释器的绝对路径,用于指明执行这个脚本的解释器.在直接调用脚本的时候,系统的程序载入器会分析shebang后面的内容,将这些内容作为解释器指令,并调用该指令,将载有shebang的文件路径作为该解释器的参数,执行脚本,从而使脚本文件的调用方式与普通的可执行文件类似.例如,以指令#!/bin/bash开头的文件,在执行时会实际调用/bin/bash程序来执行

由于#符号在许多脚本语言中都是注释标识符,shebang的内容会被这些脚本解释器自动忽略.在字符不是注释标识符的语言中,例如scheme,解释器也能忽略以#!开头的首行内容,这样就保证了shebang的很好的兼容性

shebang的一些具体用法列举如下

  • 如果脚本文件中没有#!这一行,那么执行shell脚本的时候,就会默认使用当前的shell去解释这个脚本(即:$SHELL环境变量)
  • 如果#!之后的解释程序是一个可执行文件,那么执行这个脚本时,他就会把文件名以及参数一起作为参数传递给那个解释程序去执行
  • 如果#!指定的解释程序没有可执行权限,就会报错,提示权限被拒绝
  • 如果#!指定的解释程序不是一个可执行文件,那么指定的解释程序会被忽略,转交给当前shell去执行这个脚本
  • 如果#!指定的解释程序不存在,就会报错找不到那个目录或文件
  • #!之后的解释器路径必须要用绝对路径,它不会自动去$PATH环境变量中寻找解释器
  • 如果在命令行执行脚本的时候,执行采用某一个解释器去执行,比如bash test.sh这样的命令,那么脚本中的#!一行将被自动忽略
  • 脚本文件必须要有可执行权限,脚本才会被执行

shebang的好处在于,允许脚本和数据文件充当系统命令,无需在调用的时候由用户指定解释器,从而对用户或者其他程序隐藏了其执行的细节.比如:

  • #!/bin/sh 使用sh,即Bourne shell或其他兼容shell执行脚本
  • #!/bin/csh 使用csh,即C shell执行
  • #!/usr/bin/perl -w 使用带警告的perl执行
  • #!/usr/bin/python -0 使用具有代码优化的python执行
  • #!/usr/bin/php 使用php的命令行解释器执行

shebang行也可以包含需要传递到解释器的特定选项,比如上面的perl和python的例子

Shell脚本中的shebang相关推荐

  1. shell脚本中执行命令_如何在Shell脚本中执行命令?

    shell脚本中执行命令 Shell is a command-line interpreter that allows the user to interact with the system. I ...

  2. linux 脚本 alias,在shell脚本中使用alias别名

    本文最后更新于2015年7月12日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢! 缘由: 经常用Linux进行操作的同学一般都会有各种各样的技巧来提升工作效率,而添加/改写shell ...

  3. shell脚本中的特殊变量与if条件测试

    1.特殊变量 实际工作中我们不可避免的遇到一些xxxx.sh脚本文件,实际阅读shell脚本代码时经常会遇到很多特殊变量(例如:$0.$n.$#.$@.$*.$?.$$等),我们常常会被这些特殊符号折 ...

  4. shell脚本中的变量

    shell脚本中的变量 1 变量的定义 2 shell脚本中变量的定义方法 2.1 环境级别 2.2 用户级别 2.3 系统级别 3 变量名称 4 变量的转译 4.1 转译 4.2 声明 4.3 变量 ...

  5. 数组-在Shell脚本中的基本使用介绍

    2019独角兽企业重金招聘Python工程师标准>>> Shell脚本在运维工作中是极其重要的,而数组在shell脚本里的运用无论是在循环或运算方面都是非常实用的一个环节. 下面是对 ...

  6. 详解Linux交互式shell脚本中创建对话框实例教程

    详解Linux交互式shell脚本中创建对话框实例教程 本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一 ...

  7. Shell脚本中的并发

    主要记录一下Shell脚本中的命令的并发和串行执行. 默认的情况下,Shell脚本中的命令是串行执行的,必须等到前一条命令执行完后才执行接下来的命令,但是如果我有一大批的的命令需要执行,而且互相又没有 ...

  8. 7月11日任务 shell介绍、shell结构和执行 、date命令用法、shell脚本中的变量

    2019独角兽企业重金招聘Python工程师标准>>> 20.1 Shell脚本介绍 • shell是一种脚本语言  aming_linux  blog.lishiming.net ...

  9. 如何在 Shell 脚本中执行语法检查调试模式

    我们开启了 Shell 脚本调试系列文章,先是解释了不同的调试选项,下面介绍如何启用shell调试模式. 写完脚本后,建议在运行脚本之前先检查脚本中的语法,而不是查看它们的输出以确认它们是否正常工作. ...

最新文章

  1. Html编辑器kindsoft
  2. 关于DataAccess Application block
  3. 以Python为例对变量类型及运算符进行举例
  4. 高速建成Android开发环境ADT-Bundle和Hello World
  5. 敏捷开发团队管理系列之二:程序与测试团队I
  6. [Web开发] 如何改变IE滚动条的颜色
  7. 不懂技术的小白,使用电商网站建设工具有什么注意事项?
  8. zheng项目系统简单的分析记录
  9. 第二天 熟悉ue4工具 及快捷键
  10. 网易邮箱客户端服务器设置
  11. 开涛 SpringMVC
  12. 都2021年了不会还有人用门禁卡吧!(手把手教你用手机代替门禁卡)
  13. php socket 介绍
  14. linux系统端口的5种状态及含义
  15. Life feelings--11--护眼贴士-如何让心灵的窗口锃光发亮?-程序员工程师生活必备
  16. 仿QQ聊天软件(JavaFX+云端数据库)
  17. docker-compose 安装多版本php
  18. 独角兽项目 4 - 失败的发布
  19. 应届毕业生如何快速找到Java开发工作?
  20. 适合Python初学者阅读的Github开源代码

热门文章

  1. 关于 HTTP 与 HTTPS 的详解
  2. 红黑树----红黑树插入和删除结点的全程演示
  3. 苹果I 的创造者 沃兹
  4. python链表的实现
  5. 2020校招面试之农业银行安徽省分行
  6. 全新智能扫地机器人的清洁秘诀!
  7. echarts 不连续的两点之间连线
  8. 双旦特惠集锦,设计师的专属福利
  9. 解决 Enter passphrase for key ‘/Users/dzm/.ssh/id_rsa‘:
  10. 利用Python绘制中国大陆人口热力图