1. 程式人生 > >sh執行shell指令碼出現語法錯誤

sh執行shell指令碼出現語法錯誤

今天除錯一個指令碼,用./的方式直接執行指令碼沒有發現任何問題,但是當我用如下命令列印除錯資訊的時候就會發現各種問題:

sh -x sample.sh

下面給出sample.sh

#!/bin/bash

hello(){
    echo "Hello, this is a function."
}

if [ ! -z $1 ] && [ $1 == '1' ] ; then
    hello
else
    echo "no argument."
fi

通過sh執行發現報如下錯誤:

sample.sh: 3: sample.sh: Syntax error: "(" unexpected
但是用./sample.sh方式執行卻不會發生任何錯誤,也就是說指令碼的自身執行是沒有問題的,執行sh程式的時候才會有語法錯誤。

其實語法錯誤的原因在於兩次執行的不是同一種shell,在用./sample的方式執行的時候,系統會使用指令碼首行宣告的/bin/bash來解釋指令碼,而用sh方式執行的時候,系統會呼叫sh這個程式,在我的機器上看一下sh這個程式的來源:

[email protected]:~$ ll `which sh`
lrwxrwxrwx 1 root root 4 11月  9 10:17 /bin/sh -> dash*

表明sh實際上是dash,和./sample.sh方式使用的並不是同一種shell,所以才會發生奇怪的語法錯誤。