有人今天给我发了一个脚本,以#:开头,谷歌搜索后我没有找到任何答案。
即使脚本有效,我也想知道这是什么意思。
答案 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脚本运行。
#!
)出现了,但那只是针对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。