2013-05-13 60 views
6

例一影响(#)线之前和/或注释,如#!/ bin/sh的行之后

#!/bin/sh 
# purpose: print out current directory name and contents 
pwd 
ls 

例二

# purpose: print out current directory name and contents 
#!/bin/sh 
pwd 
ls 

是什么差异 - 如果我在第一行发表评论(#),#!/bin/sh作为第二行,会发生什么情况?

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

+0

如果您使用代码标签包围脚本,将会更容易。不规则字体使它真的让人困惑...... – user1581900 2013-05-13 07:32:10

+0

#!/ bin/sh指定应该用于脚本的shell的路径。在这里回答了类似的问题:http:// stackoverflow。com/questions/8967902/why-do-you-need-to-put-bin-bash-at-the-a-start-of-a-script-file – user1581900 2013-05-13 07:34:24

+2

可能会出现重复的情况。/7366775/what-do-line-bin-sh-mean-in-a-unix-shell-script – Peeyush 2013-05-13 07:34:27

回答

2

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

Unices使用常用方法来确定运行特定脚本所需的程序(man execve(2))。如果脚本具有适当的执行权限并在脚本中第一行以#!个字符开始,则它将由之后定义的程序运行。

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

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

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

+0

如果我在第二行的#!/ bin/sh之后的第一行给出注释(#),那么会发生什么? – Manikanta 2013-05-13 07:42:05

+0

@Manikanta:这是'sh'中的注释行,所以它会被跳过。在linux机器上,'ls -l/bin/sh'是bash的符号链接。 – TrueY 2013-05-13 07:47:20

+0

@TrueY'/ bin/sh'在所有Linux系统上绝对不是'bash'的链接,例如。基于Debian的系统在一段时间之前转换为“短跑”。另外,它不是寻找'#!'的shell,内核就是这样做的。 – 2013-05-13 11:30:50

1

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

输出没有差异。但是,执行这两者的时间与解释者一条一条地读取内容会有些不同。

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

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

什么意思#!/ bin/sh?

它是在shebang(#!)之后使用的解释器的路径(这里是/ bin/sh)。 Shell将尝试使用shebang之后提到的解释器语言来执行脚本。

+2

这不完全正确。取决于在缺少shebang的情况下执行的shell,输出可能会根据有问题的shell的功能而有所不同(不是针对此片段,而是针对任何实际情况)。而且,他们通常不会逐行读取脚本,而是逐块阅读。 – 2013-05-14 19:20:47

+0

您可以评论第二个例子中的shebang行吗?换句话说,是否需要如果你想要一个shebang它**必须是你文件中的第一个东西?没有其他意见可以在它之前? – FGreg 2018-01-30 20:12:55