示例一
#!/bin/sh
# purpose: print out current directory name and contents
pwd
ls
示例二
# purpose: print out current directory name and contents
#!/bin/sh
pwd
ls
有什么区别——如果我将第一行设为comment( #
),#!/bin/sh
将第二行设为第二行,会发生什么?
是什么意思#!/bin/sh
?
通常,shell 脚本由 /etc/passwd 文件中定义的默认 shell 运行。但是您可以明确定义一个可以运行您的脚本的程序。
Unices 使用一种通用方法来确定运行特定脚本所需的程序(man execve(2))。如果脚本设置了正确的执行权限并且在脚本中第一行以#!
字符开头,它将由之后定义的程序运行。
例如,如果第一行是#!/usr/bin/awk -f
,那么文件的其余部分将被传递给awk
程序(因此它必须使用awk
语法)。或者,如果 Makefile 以开头,#!/usr/bin/make -f
那么文件的其余部分将被传递给make
. 您可以将脚本作为普通程序启动,并且可以使用awk
或make
(或任何定义的)语法编写脚本。
如果execve
没有找到#!
文件的前两个字符,则将其视为普通脚本文件并按原样运行。
因此,使用#!
您可以确定脚本语言,并且您不需要知道使用您的脚本的其他用户使用什么 shell。在任何其他行将#!
解释您的默认 shell,通常只是一个注释行。
第一个和第二个 shell 脚本有什么区别..?
输出没有区别。但是随着解释器逐行读取,执行两者的时间会略有不同。
如果我在第 2 行的 #!/bin/sh 之后的第 1 行给出注释 (#) 那么会发生什么?
除了 shebang(#!) 以外的任何以 (#) 开头的行都被视为 shell 脚本中的注释。
#!/bin/sh 是什么意思?
它是 shebang (#!) 之后使用的解释器的路径(此处 - /bin/sh)。Shell 会尝试使用 shebang 后面提到的解释器语言来执行脚本。