#!/ bin / sh和#:/ bin / sh之间的区别

时间:2010-11-24 16:08:27

标签: bash

有人今天给我发了一个脚本,以#:开头,谷歌搜索后我没有找到任何答案。

即使脚本有效,我也想知道这是什么意思。

2 个答案:

答案 0 :(得分:13)

哇!这带来了很多回忆!

早在20世纪80年代和90年代初,有两个基本shell,Bourne shell(/bin/sh)和C shell(/bin/csh)。

Bourne shell几乎没有用户友好的东西。没有别名或命令替换。因此,大多数人都喜欢使用C Shell作为默认shell。

然而,Csh是一种可怕的脚本语言。 (见http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/)。因此,您使用C shell作为shell,但是在Bourne shell中编写了具有更好语法的脚本。

但是,有一个小小的问题:由于您的默认shell是C Shell,在命令行键入shell脚本名称,C Shell会选择它并尝试执行它。

要解决此问题,请将:作为程序的第一行。这是一个Bourne shell注释,但是是一个无效的C Shell命令。因此,如果忘记将sh放在前面,脚本将无法运行。

稍后,系统会知道第一行是:,它应该是Bourne shell脚本。而且,即使以后,你也可以放#:所以这将是一个评论,而不是一个命令。有些人将shell的名称/bin/sh放在旁边,以帮助提醒人们将其作为Bourne shell脚本运行。

在Kornshell开始变得流行之后,C shell开始消失。就在这个时候,shebang(#!)出现了,但那只是针对AT& T而不是Berkeley衍生系统。直到20世纪80年代后期,BSD系统才得到了shebang。并且,在Solaris发布之前,Sun人员使用C Shell作为他们的默认shell。

我很久没见过以#: /bin/sh开头的节目了。

顺便说一句,通常以这种方式启动脚本:

#! /usr/bin/env perl

这样,您可以使用路径中的Perl版本,而不必担心它所在的目录。例如,如果您使用以下命令开始编写脚本:

#! /usr/local/bin/perl

并且,Perl实际上在/usr/bin,您的脚本将无法运行。 env计划始终位于/usr/bin,并且可以保证正常运行。当然,如果你想使用特定版本的Perl而不是路径中的那个,你可以使用第一种方法。

答案 1 :(得分:2)

这只是评论......

#:/bin/sh
一个shebang是#!以#开头的所有其他内容都是评论。

示例:

运行以

开头的脚本
#!/usr/bin/perl

它将由perl运行。现在,替换'!'通过':'然后你将使用defaut解释器运行它,这是你的shell。