./yourscript.extension
,例如./helloworld.py
或./helloworld.sh
,它将在该行的第一行寻找解释器,该行将是#!/bin/python
或!#/bin/bash
,而在执行脚本如时python helloworld.py
,将不会观察到第一行,因为它已被注释出来。因此,这是壳/内核的特殊序列。
./yourscript.extension
,例如./helloworld.py
或./helloworld.sh
,它将在该行的第一行寻找解释器,该行将是#!/bin/python
或!#/bin/bash
,而在执行脚本如时python helloworld.py
,将不会观察到第一行,因为它已被注释出来。因此,这是壳/内核的特殊序列。
Answers:
这是一个约定,因此* nix shell知道要运行哪种解释器。
例如,ATT的较旧版本默认为sh(Bourne shell),而BSD的较旧版本默认为csh(C shell)。
即使在今天(大多数系统都运行bash,即“ Bourne Again Shell”),脚本仍可以使用bash,python,perl,ruby,PHP等。例如,您可能会看到#!/bin/perl
或#!/bin/perl5
。
PS:感叹号(!
)亲切地称为“ bang”。shell注释符号(#
)有时称为“ hash”。
PPS:请记住-在* nix下,将后缀与文件类型相关联只是一种约定,而不是“规则”。一个可执行文件可以是一个二进制程序,一百万脚本类型和其他的东西,以及任何一个。因此需要#!/bin/bash
。
execve(2)
syscall 时解释的;所以shebang是内核约定,而不是shell约定。
#!/bin/sh
到喜欢的东西.profile
和东西,运行为onload
更准确地说,shebang #!
是可执行文件(x
模式文件)的前两个字节,由execve(2)系统调用(执行程序)解释。但是POSIX规范execve
没有提及shebang。
它必须后跟解释器可执行文件的文件路径(BTW甚至可以是相对的,但大多数情况下是绝对的)。
在用户中找到解释器(例如)的一个不错的技巧(也许不是那么好)是使用程序(始终在所有Linux上),例如python
$PATH
env
/usr/bin/env
#!/usr/bin/env python
任何ELF可执行文件都可以是解释器。您甚至可以使用,#!/bin/cat
或者#!/bin/true
如果您愿意!(但这通常是无用的)
#!/usr/bin/env bash -x
。我怎么做 ?
#!/usr/bin/env bash -x
bash
几乎总是在,/bin/bash
所以您的#!/bin/bash -x
叫做舍邦。在unix-speak中,#称为Sharp(如音乐中的)或hash(如Twitter上的标签),以及!叫做爆炸。(您实际上可以使用!!来引用先前的shell命令,称为bang-bang)。因此,当放在一起时,您会得到haSH-BANG或shebang。
#之后的部分!告诉Unix使用什么程序来运行它。如果未指定,它将尝试使用bash(或sh,zsh或任何$ SHELL变量),但是如果存在,它将使用该程序。另外,#是大多数语言的注释,因此该行在后续执行中将被忽略。
execve(2)
syscall不要使用$SHELL
变量。解释shebang的是内核。
该家当是一个指令加载器使用的是后指定的程序#!
,当您尝试执行它解释为有问题的文件。所以,如果你尝试运行一个名为foo.sh
其具有#!/bin/bash
顶部,实际的命令运行的/bin/bash foo.sh
。这是对不同程序使用不同解释器的灵活方式。这是在系统级别实现的,而用户级别的API是shebang约定。
值得一提的是,shebang是一个神奇的数字 -一个人类可读的数字,它将文件标识为给定解释器的脚本。
即使没有shebang,您对它的看法也是“有效的”,这仅是因为所讨论的程序是为与您使用的shell相同的shell编写的shell脚本。例如,您可以很好地编写一个javascript文件,然后放一个#! /usr/bin/js
(或类似的东西)以拥有一个javascript“ Shell脚本”。
操作系统使用默认Shell运行您的Shell脚本。因此在脚本开头提到shell路径,就要求操作系统使用该特定的shell。这对于可移植性也很有用。
每个发行版都有一个默认的外壳程序。Bash是大多数系统上的默认设置。如果您碰巧在具有不同默认Shell的系统上工作,则这些脚本如果专门针对Bash编写,则可能无法按预期工作。
多年来,Bash不断发展壮大,从ksh
和那里获取代码sh
。
添加#!/bin/bash
为脚本的第一行,告诉操作系统调用指定shell
的命令来执行脚本中的命令。
#!
通常称为“哈希爆炸”,“她爆炸”或“ sha-bang”。
叫做舍邦。它由数字符号和感叹号字符(#!)组成,后跟解释器的完整路径,例如/ bin / bash。UNIX和Linux下的所有脚本都使用第一行中指定的解释器执行。
另外,您还会在#!/ bin / bash之后看到一些其他参数,例如,
#!/bin/bash -v -x
阅读此书以获得更多的想法。
/unix/124272/what-do-the-arguments-v-and-x-mean-to-bash。