2010-11-24 34 views
4

有人今天給我發了一個腳本,以#開頭:在google搜索後我沒有找到任何答案。#!/ bin/sh和#之間的區別:/ bin/sh

即使腳本有效我不知道這是什麼意思。

+0

當他或她引用`#!`時可能是一個錯字... – 2010-11-24 19:49:10

回答

13

哇!這帶來了很多回憶!

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

Bourne shell有很少用戶友好的東西。沒有別名或命令替換。因此,大多數人喜歡使用C 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而不是伯克利派生的系統。直到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而不是路徑中的Perl版本,你可以使用第一種方法。

2

這僅僅是一個註釋...

#:/bin/sh 

一個家當是#!其他以#開頭的內容都是評論。

例如:

運行開始

#!/usr/bin/perl 

,它會被Perl運行的腳本。現在,替換'!'按':',然後你可以使用defaut解釋器來運行它,這是你的shell。

+0

完全正確。只是一個小紙條。出於歷史原因,`#!`之後首選空格。 – 2010-11-24 19:49:42

+0

@Diego:我認爲這些歷史原因與這種模糊和過時的系統有關,這些日子裏,沒有人再使用這個空間。 – 2010-11-24 20:47:30