我以前做过Bash脚本,没有#它们都运行得很好!/bin/bash。

放进去有什么意义?事情会有什么不同吗?

还有,#怎么发音?我知道!发音为“bang”。

#!明显吗?


当前回答

更准确地说,shebang #!,当它是可执行(x模式)文件的前两个字节时,由execve(2)系统调用(执行程序)解释。但是POSIX对execve的规范没有提到shebang。

它必须跟在解释器可执行文件的文件路径后面(BTW甚至可以是相对的,但大多数情况下是绝对的)。

在用户的$PATH中找到解释器(例如python)的一个很好的技巧(也许不是那么好的一个)是使用env程序(在所有Linux上总是在/usr/bin/env),例如:

 #!/usr/bin/env python

任何ELF可执行文件都可以是解释器。你甚至可以使用#!/bin/cat或#!/bin/true如果你想!(但这通常是没有用的)

其他回答

此外,您还将在#!/bin/bash, 例如 #!/bin/bash -v -x 读这篇文章,了解更多。 https://unix.stackexchange.com/questions/124272/what-do-the-arguments-v-and-x-mean-to-bash。

这是一个约定,因此*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注释符号(#)有时被称为“散列”。

pp: 记住——在*nix下,将后缀与文件类型相关联只是一种约定,而不是“规则”。可执行文件可以是二进制程序,也可以是百万个脚本类型中的任意一种,还可以是其他东西。因此需要使用#!/bin/bash。

这叫shebang。在unix语言中,#被称为sharp(就像在音乐中)或hash(就像twitter上的标签),而!叫做bang。(实际上,您可以使用!!,叫bang-bang)。所以当组合在一起时,你会得到haSH-BANG,或shebang。

#!告诉Unix使用什么程序来运行它。如果它没有指定,它将尝试使用bash(或sh,或zsh,或任何你的$SHELL变量),但如果它在那里,它将使用该程序。另外,#在大多数语言中是注释,因此在后续执行中会忽略该行。

更准确地说,shebang #!,当它是可执行(x模式)文件的前两个字节时,由execve(2)系统调用(执行程序)解释。但是POSIX对execve的规范没有提到shebang。

它必须跟在解释器可执行文件的文件路径后面(BTW甚至可以是相对的,但大多数情况下是绝对的)。

在用户的$PATH中找到解释器(例如python)的一个很好的技巧(也许不是那么好的一个)是使用env程序(在所有Linux上总是在/usr/bin/env),例如:

 #!/usr/bin/env python

任何ELF可执行文件都可以是解释器。你甚至可以使用#!/bin/cat或#!/bin/true如果你想!(但这通常是没有用的)

它被称为shebang。它由一个数字符号和一个感叹号字符(#!)组成,后面跟着到解释器的完整路径,例如/bin/bash.UNIX和Linux下的所有脚本都使用第一行中指定的解释器执行。