2012-05-25 86 views
1

我在站點中成功登錄時會發出一個複雜的長行命令。如果我在控制檯執行它,它工作。但是,如果我複製並粘貼相同的行在bash腳本中不起作用。Bash:在帶捲曲的bash腳本中,「#!/ bin/sh」的效果是什麼

我嘗試了很多東西,卻意外地發現,如果我不使用線

#!/bin/sh 

它的工作!爲什麼這發生在我的mac OSX Lion中?這個配置行在bash腳本中做了什麼?

+1

bash手冊列出了當bash調用爲'sh'時會發生什麼:http://www.gnu.org/software/bash/manual/bashref.html#Bash-POSIX-Mode –

回答

1

「#!/ bin/sh」是確保使用正確的解釋器運行腳本的常用方式。在這裏,「sh」是「Bourne Shell」。 shell腳本的一個很好的,標準的「最不共同的標準」。

然而在你的情況下,「#!/ bin/sh」似乎是錯誤的解釋器。

這裏有更多的信息:

http://www.unix.com/answers-frequently-asked-questions/7077-what-does-usr-bin-ksh-mean.html

最初,我們只有一個殼在UNIX上。當您要求運行 命令時,shell會嘗試調用其中一個exec()系統的調用。它的命令是一個可執行文件,exec將會成功執行 並且該命令將運行。如果exec()失敗,那麼shell將不會放棄,而是嘗試插入命令文件,就好像它的 是一個shell腳本。

然後unix有更多的炮彈,情況變得困惑。大多數 人會在一個shell中編寫腳本並在另一個shell中鍵入命令。 並且每個shell都有將腳本提供給 解釋器的不同規則。

這是當「#!/」技巧被髮明的時候。這個想法是讓內核的exec()系統調用通過shell腳本獲得成功。當 內核嘗試exec()文件時,它會查看前012個字節,其中 表示一個稱爲幻數的整數。這告訴內核是否應該嘗試運行文件 。所以「#!/」被添加到內核知道的神奇 數字中,並且它被擴展爲實際能夠 自己運行shell腳本。但有些人不能輸入「#!/」,他們一直留下空間。所以內核被再次冒險 允許「#!/」作爲一個特殊的3字節幻數。

所以#! /usr/bin/ksh#!/usr/bin/ksh現在意味着同樣的事情。我總是使用前者,因爲至少有些內核可能仍然存在,不瞭解後者。

並注意第一行是內核的信號,而不是 外殼。現在發生的情況是,當shell嘗試通過exec()運行腳本時,它們就成功了。我們從不會偶然遇到各種各樣的回退計劃。

4

經由/bin/sh運行在SH兼容模式,這意味着許多特定的bash-特徵(herestrings,進程替換等)將工作運行bash腳本。

sh-4.2$ cat < <(echo 123) 
sh: syntax error near unexpected token `<' 

如果你希望能夠使用全bash的語法,使用#!/bin/bash爲您的家當線。

+0

在Ubuntu上,例如, '/ bin/sh'根本不運行bash,它運行破折號。 – choroba

0

該腳本的第一行可用於選擇要使用的腳本解釋器。

隨着

#!/bin/bash 

你告訴外殼調用/斌/慶典解釋器來執行你的腳本。 確保在#!/ bin/bash之前沒有空格或空行,否則它將無法工作。