Shell脚本中的shebang

一般的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的例子

猜你喜欢

转载自blog.csdn.net/qq_42428671/article/details/105858781