脚本test.sh内容:
1 |
|
执行./test.sh,屏幕输出为:
1 | ./test.sh: line 2: pcy.sh: No such file or directory |
由此可见,在#!/bin/sh
的情况下,source不成功,不会运行source后面的代码。
修改test.sh脚本的第一行,变为#!/bin/bash
,再次执行./test.sh,屏幕输出为:
1 | ./test.sh: line 2: pcy.sh: No such file or directory |
由此可见,在#!/bin/bash
的情况下,虽然source不成功,但是还是运行了source后面的echo语句。
但是紧接着我又试着运行了一下sh ./test.sh
,这次屏幕输出为:
1 | ./test.sh: line 2: pcy.sh: No such file or directory |
表示虽然脚本中指定了#!/bin/bash,但是如果使用sh 方式运行,如果source不成功,也不会运行source后面的代码。
为什么会有这样的区别呢?
- sh一般设成bash的软链
1 | [work@zjm-testing-app46 cy]$ ll /bin/sh |
- 在一般的linux系统当中(如redhat),使用sh调用执行脚本相当于打开了bash的POSIX标准模式
- 也就是说 /bin/sh 相当于 /bin/bash –posix
所以,sh跟bash的区别,实际上就是bash有没有开启posix模式的区别
so,可以预想的是,如果第一行写成 #!/bin/bash –posix,那么脚本执行效果跟#!/bin/sh是一样的(遵循posix的特定规范,有可能就包括这样的规范:“当某行代码出错时,不继续往下解释”)
其它解释
等等, 这里就完了吗? 这里有更明确的说法
在CentOS
里,/bin/sh是一个指向/bin/bash的符号链接: (只是在 CentOS 里哦)
1 | [ ] |
但在Mac OS上不是,/bin/sh和/bin/bash是两个不同的文件,尽管它们的大小只相差100字节左右:
1 | iMac:~ wuxiao$ ls -l /bin/*sh |