今天调试一个脚本,用./的方式直接运行脚本没有发现任何问题,但是当我用如下命令打印调试信息的时候就会发现各种问题:
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这个程序的来源:
snow@snow-desktop:~$ ll `which sh`
lrwxrwxrwx 1 root root 4 11月 9 10:17 /bin/sh -> dash*
表明sh实际上是dash,和./sample.sh方式使用的并不是同一种shell,所以才会发生奇怪的语法错误。