10

示例一

#!/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

4

2 回答 2

4

通常,shell 脚本由 /etc/passwd 文件中定义的默认 shell 运行。但是您可以明确定义一个可以运行您的脚本的程序。

Unices 使用一种通用方法来确定运行特定脚本所需的程序(man execve(2))。如果脚本设置了正确的执行权限并且在脚本中第一行以#!字符开头,它将由之后定义的程序运行。

例如,如果第一行是#!/usr/bin/awk -f,那么文件的其余部分将被传递给awk程序(因此它必须使用awk语法)。或者,如果 Makefile 以开头,#!/usr/bin/make -f那么文件的其余部分将被传递给make. 您可以将脚本作为普通程序启动,并且可以使用awkmake(或任何定义的)语法编写脚本。

如果execve没有找到#!文件的前两个字符,则将其视为普通脚本文件并按原样运行。

因此,使用#!您可以确定脚本语言,并且您不需要知道使用您的脚本的其他用户使用什么 shell。在任何其他行将#!解释您的默认 shell,通常只是一个注释行。

于 2013-05-13T07:37:40.313 回答
2

第一个和第二个 shell 脚本有什么区别..?

输出没有区别。但是随着解释器逐行读取,执行两者的时间会略有不同。

如果我在第 2 行的 #!/bin/sh 之后的第 1 行给出注释 (#) 那么会发生什么?

除了 shebang(#!) 以外的任何以 (#) 开头的行都被视为 shell 脚本中的注释。

#!/bin/sh 是什么意思?

它是 shebang (#!) 之后使用的解释器的路径(此处 - /bin/sh)。Shell 会尝试使用 shebang 后面提到的解释器语言来执行脚本。

于 2013-05-14T06:35:34.417 回答