2012-12-14 329 views
68

在bash脚本中,第一行的#!/bin/bash是什么意思?Bash脚本:#!/ bin/bash是什么意思?

UPDATE#!/bin/bash#!/bin/sh之间有区别吗?

+2

@anishsane您的评论激励我写下这个消失的文件 echo -e'#!/ bin/rm \ nGoodbye!' >消失&& chmod 700消失&& ./vanish &&猫消失 –

回答

83

这被称为shebang,它在执行时告诉shell何种程序来解释脚本。

在您的示例中,脚本将由bash shell进行解释和运行。

其他一些例子shebangs是:

(维基百科)

#!/bin/sh — Execute the file using sh, the Bourne shell, or a compatible shell 
#!/bin/csh — Execute the file using csh, the C shell, or a compatible shell 
#!/usr/bin/perl -T — Execute using Perl with the option for taint checks 
#!/usr/bin/php — Execute the file using the PHP command line interpreter 
#!/usr/bin/python -O — Execute using Python with optimizations to code 
#!/usr/bin/ruby — Execute using Ruby 

和一些附加的那些我能想到把我的头顶部,如:

#!/bin/ksh 
#!/bin/awk 
#!/bin/expect 

例如,在使用bash文件的脚本中,您可以使用bash语法编写代码;而在希望使用shebang的脚本中,您可以用期望的语法对其进行编码,等等。

响应更新部分:

这取决于什么/bin/sh实际上指向您的系统上。通常它只是一个符号链接/bin/bash。有时候,可移植的脚本与#!/bin/sh写只是为了表明它是一个shell脚本,但它使用取其壳由/bin/sh该特定系统的简称(也许它指向/bin/bash/bin/ksh/bin/zsh

+0

谢谢!但是'#!/ bin/bash'和'#!/ bin/sh'有区别吗? – Raptor

+1

@ShivanRaptor'#!/ bin/bash'表示在bash中运行这个脚本。 '#!/ bin/sh'表示在'sh'中运行这个脚本,它是默认的unix shell,可能是bash或者任何其他的变体,如ksh,dash,zsh等。 –

+0

当'bash'运行为'sh'时, ,它的行为与运行时的行为不同(比POSIX更像)。阅读手册;它确实涵盖了这个细节。 –

10

当第一个字符一个脚本是#!,这就是所谓的shebang。如果您的文件以 #!/path/to/something开头,则标准运行something并将文件的其余部分作为输入传递给该程序。

随着中说,差异#!/bin/bash之间,#!/bin/sh,甚至#!/bin/zsh无论是在bash,sh或zsh的程序用来解释文件的其余部分。传统上,bashsh只是不同的程序。在一些Linux系统中,它们是同一个程序的两个副本。在其他Linux系统上,shdash的链接,在传统的Unix系统(Solaris,Irix等)上,bash通常是与sh完全不同的程序。

当然,该行的其余部分不必以sh结尾。它也可以是#!/usr/bin/python,#!/usr/bin/perl或甚至#!/usr/local/bin/my_own_scripting_language

+0

'sh'通常是'bash'运行兼容模式,这是真实的,因为bash已经成为大多数Linux发行版的默认shell,而且在此之前的好几年,IIRC可以安全地说它已经有15年了,可能超过了20. – ocodo

+0

在我的Debian和Ubuntu系统上,'/ bin/sh'是破折号。 Android表示它使用'ash'作为'/ bin/sh'。 –

+1

@JoshuaDBoyd很好的捕获,很多(尽管可能不是全部)BSD unixes使用Ash作为它们的默认shell,而不是Bash,而Debian/Ubuntu使用Dash。与Bash类似,Ash和Dash都有'sh'兼容模式。如果我们深入了解Solaris,Aix,HPUX,Ultrix,SCO等,它们都将拥有自己的默认外壳,它将具有'sh'仿真(保持POSIX兼容)。 – ocodo

12

在bash脚本中,第一行的#!/ bin/bash是什么意思?

在Linux系统中,我们有shell来解释我们的UNIX命令。现在在Unix系统中有一些shell。其中,有一个叫做bash的shell,它是非常非常常见的Linux,它有着悠久的历史。这是Linux中的默认shell。

当您编写脚本(unix命令等的集合)时,您可以选择指定可以使用哪个shell。一般来说,你可以使用Shebang来指定它的外壳(是的,它就是它的名字)。

因此,如果您在脚本的顶部#!/ bin/bash,那么您告诉系统将bash用作默认shell。

现在来谈谈第二个问题:#!/ bin/bash和#!/ bin/sh之间有区别吗?

答案是肯定的。当你告诉#!/ bin/bash时,你告诉你的环境/ os使用bash作为命令解释器。这是硬编码的东西。

每个系统都有自己的shell,系统将用它来执行自己的系统脚本。这个系统的shell可以根据操作系统的不同而变化(大多数情况下它会是bash,Ubuntu最近使用dash作为默认的系统shell)。当你指定#!/ bin/sh时,系统将使用它的内部系统shell来解释你的shell脚本。

访问此link欲了解更多信息,我已经解释了这个话题。

希望这会消除你的困惑......祝你好运。