2015-09-25 43 views
6

我簡單的腳本是這樣的:「。filename」在從/ bin/sh運行時找不到文件,從/ bin/bash運行;爲什麼?

#!/bin/sh 


DEF=.file_name_with_a_leading_dot.sh 

. ${DEF} 

公告頂行的/ bin/sh的。 當我運行這個簡單的腳本時,我得到一個錯誤,找不到該文件。 但是,如果我將第一行更改爲#!/ bin/bash,那麼腳本會在當前目錄中找到該文件。

但是,在我的Ubuntu Linux筆記本電腦上,我看到/ bin/sh是/ bin/bash的符號鏈接。那麼,爲什麼我的腳本行爲不同?

另外,我可以像這樣運行腳本:

/bin/bash ./script.sh 

而且它的確定。

那麼,我錯過了什麼?

+0

你可以看看這裏:http://stackoverflow.com/questions/5725296/difference-between-sh-and-bash。基本上,'bash'和'sh'不是一回事 – ThanksForAllTheFish

+2

當調用'/ bin/sh'時,Bash以兼容模式啓動。 – hek2mgl

+0

但是爲什麼這意味着它找不到文件?我可以重現這一點。 – tripleee

回答

6

Manpage

。文件名[參數]

源文件名[參數]讀取和在當前shell環境中執行從文件名 命令,並返回從文件名中執行的最後一個命令的 退出狀態。 如果文件名 不包含斜槓,則使用PATH中的文件名來查找包含文件名的 目錄。在PATH中搜索的文件不需要 是可執行的。 當bash不處於posix模式時,如果在PATH中找不到文件,則搜索當前目錄 。如果sourcepath選項爲 shopt內置命令關閉,則不會搜索PATH。如果提供了 任何參數,則當執行 文件名時,它們將成爲位置參數。否則,位置參數是 不變。返回狀態是腳本內退出 的最後一個命令的狀態(如果沒有執行命令,則爲0),如果 文件名未找到或無法讀取,則返回false。

所以,看起來shebang #!/bin/sh將您的bash設置爲posix模式。在這種模式下,只評估PATH,而不是當前目錄。

+3

這意味着:使用'。 ./「$ DEF」使它在POSIX模式下工作。 – chepner

相關問題