脚本第一行出现的语言是什么?

脚本第一行出现的语言是什么?

Bash 脚本以下行开头

#!/bin/bash
# Rest of script below
...

bash字符中#是注释的开始,但#!/bin/bash绝对不是注释,因此它不是 bash 而是内核解释该声明。

那么第一行到底是什么?它是一种特定的语言,还是 Linux 内核中的一种特殊的一次性情况?在编写脚本时是否可以使用这种“语言”中的其他命令或语句?

答案1

那就是舍邦。任何接受文件名作为参数的程序都可以在那里指定,并传递脚本的文件名。

$ cat t.ex
#!/bin/cat
I have been cat!
$ ./t.ex
#!/bin/cat
I have been cat!

答案2

正如 Ignacio 所说,这称为 shebang,它实际上对操作系统中的程序加载器来说有点神奇。当用户尝试执行程序时,加载程序会读取程序的前两个字节以了解{something}。如果这两个字节恰好是#和!,则内核读取从字节三到第一个换行符的所有内容(在许多系统中它是换行符)。它使用找到的字符串作为路径名,然后,如果它可以执行路径名中的任何内容,它就会执行并将第一个程序文件的其余部分作为输入提供给该可执行文件。

那些想要更完善的解释的人可以在谷歌上搜索“shebang kernel magic”并点击链接到有关该主题的维基百科条目:http://en.wikipedia.org/wiki/Shebang_(Unix)

答案3

舍邦 ( #!)就是所谓的幻数#!是2个字节0x23和0x21的可读形式。如果您看到 C 函数的手册页,execve()这些 exec 函数系列会在这些字节上获取什么并且在存在时表现不同。

摘自 execve() 手册页

DESCRIPTION
       execve()  executes the program pointed to by filename.  filename must be 
       either a binary executable, or a script starting with a line of the form:

           #! interpreter [optional-arg]

       For details of the latter case, see "Interpreter scripts" below.

       argv is an array of argument strings passed to the new program.  envp is 
       an array of strings, conventionally of the  form key=value,  which are 
       passed as environment to the new program.  Both argv and envp must be 
       terminated by a null pointer. The argument vector and environment can be 
       accessed by the called program's main function, when it is defined as:

           int main(int argc, char *argv[], char *envp[])

       execve() does not return on success, and the text, data, bss, and stack 
       of the calling process are overwritten by that of the program loaded.

       If the current program is being ptraced, a SIGTRAP is sent to it after a
       successful execve().

敏锐的眼睛会注意到 shebang 的形式只需要 2 个参数。一个是口译员,另一个是[optional-arg].这就是为什么你不能传递超过 1 个参数,至少在 Linux 上是这样。

-f所以我相信这样的命令不起作用,会被忽略。

#!/usr/bin/foo -i -f

但是,如果解释器支持它,您可以通过以下方式在一定程度上绕过此限制:

#!/usr/bin/foo -if

相关内容