大家都知道,sh 是 bash 的一个软链接,可是有时候,用 bash 可以执行成功的脚本用 sh 执行却会报错,这是为什么呢?
例如当shell 脚本第一行采用下面这两张写法的时候效果有时是不尽相同的。
#!/bin/sh
#!/bin/bash
先看看环境:
-
[user@host ~]$ which sh bash
-
/usr/local/bin/sh
-
/usr/local/bin/bash
-
-
[user@host ~]$ ls -l /usr/local/bin/sh /usr/local/bin/bash
-
lrwxrwxrwx 1 root root 9 Sep 21 2012 /usr/local/bin/bash -> /bin/bash
-
lrwxrwxrwx 1 root root 7 Sep 21 2012 /usr/local/bin/sh -> /bin/sh
举一个例子:
-
[user@host ~]$ cat test.sh
-
# myfile.sh dosn't exst!
-
source myfile.sh
-
echo hello
-
-
[user@host ~]$ sh test.sh
-
test.sh: line 2: myfile.sh: No such file or directory
-
-
[user@host ~]$ bash test.sh
-
test.sh: line 2: myfile.sh: No such file or directory
-
hello
另外一个例子:
-
[user@host ~]$ cat test.sh
-
while read i;do
-
echo "+++"$i"+++"
-
done< <(ls -1 /var/log/sa)
-
-
-
[user@host ~]$ sh test.sh
-
test.sh: line 3: syntax error near unexpected token `<'
-
test.sh: line 3: `done< <(ls -1 /var/log/sa)'
-
-
-
[user@host ~]$ bash test.sh
-
+++sa04+++
-
+++sa05+++
-
+++sa06+++
-
+++sa07+++
-
+++sa08+++
-
+++sa09+++
-
+++sa10+++
第一个例子中,很明显可以看到,当使用 sh 执行时,如果第一行执行失败,则脚本退出,而使用 bash 执行时虽然第一行失败,但脚本仍然会继续向下执行;
第二个例子则是语法是否支持的问题,当使用 sh 执行时,会报一个预发错误,而 bash 执行时则正常;
原因说明:
1)一般 linux 系统默认 sh 都是 bash 的软连接:
/bin/sh -> bash
2)
一般的linux系统当中(如redhat),使用sh调用执行脚本相当于打开了bash的POSIX标准模式,也就是说 /bin/sh 相当于 /bin/bash --posix
3)--posix Change the behavior of bash where the default operation differs from the POSIX standard to match the standard (posix mode).
POSIX,全称为可移植性操作系统接口,是一种关于信息技术的IEEE标准。它包括了系统应用程序接口(简称API),以及实时扩展[C语言]。
该标准的目的是定义了标准的基于UNIX操作系统的系统接口和环境来支持源代码级的可移植性。现在,标准主要提供了依赖C语言的一系列标准服务,再将来的版本中,标准将致力于提供基于不同语言的规范。
参考:http://blog.csdn.net/novagx/article/details/2077561
阅读(851) | 评论(0) | 转发(0) |