2014-02-06 24 views
0

我很難理解我的Ubuntu unix環境如何處理腳本執行。我寫了下面的bash腳本(稱爲script.sh),以顯示我的困惑:使用「sh script.sh」或「./script.sh」運行shell腳本會產生兩種不同的結果?

#!/usr/bin/env bash 
if [ $1 == "yes" ]; then 
    echo -ne "Caught\n" 
fi 
if [ $1 != "yes" ]; then 
    echo -ne "Not Caught\n" 
fi 

當我執行使用sh script.sh yes這個劇本,我得到下面的輸出:

`tester.sh: 2: [: yes: unexpected operator` 

然而,當我使用chmod 775 script.sh來使腳本可執行,然後使用命令./script.sh yes,我得到相應的輸出Caught

有人可以告訴我我做錯了什麼嗎?無論我使用sh還是./方法,我都希望腳本正確執行。

感謝您的幫助!

+2

'sh'運行Ubuntu是'dash',而不是'bash'。當你用'sh'執行時,你正在使用'dash',當你執行'./ script.sh'時,你正在使用'bash'。 –

+0

無論如何改變我的shebang線或什麼,以確保'sh'將使用bash?我想發佈一個腳本,讓其他人在不同的機器上使用,我需要腳本始終在'bash'中執行。 – jake9115

+1

@ jake9115否,'sh'是'sh',而不是'bash'。在某些系統中,'sh'是'bash'的符號鏈接,但即使如此,當調用'sh'時bash的行爲與調用bash時的行爲不同。 – kojiro

回答

2

sh ...將使用shell中運行你的腳本,而不是抨擊...您的腳本使用什麼在shabang規定,首先要那麼你的可執行腳本中的現代版本使用./script.sh

2

您必須使用單個=而不是==,這是一種雙擊,即不是標準。

所以,當你運行./script.sh bash解釋你的腳本,它都很好。當你運行sh script.sh時,一個不同的程序會執行這個操作(也許老式的bourne sh,破折號或者甚至是變相的bash)。

無論我使用sh還是./ 方法,我都希望腳本正確執行。

然後不要依賴非便攜式功能,如==


  • 通過變相bash我的意思是bash關注的argv [0] - 你怎麼稱呼它的方式 - 和採取相應的行動。如果你把它叫做sh(也許使用鏈接),那麼它會試圖像Bourne shell那樣工作。
+0

'shellism'怎麼樣,有這樣的事情嗎? –

+1

@ l'L'l有POSIX,指定'test'應該如何表現。 – cnicutar

相關問題