问题的发现
写代码的肯定少不了和 shell
接触,今天执行一个 shell
脚本时发现报错了,报错内容如下:
脚本内容排查了很多遍都没有找到原因,执行的方式为 sh xx.sh
然后使用 source xx.sh
执行和 bash xx.sh
执行都是 ok 的。
知识的了解
此时就需要了解 sh source bash
执行文件的区别。
首先看两张图
-
source
执行命令是直接执行命令,不创建子shell
-
sh
创建子shell
。子shell
里面的变量父shell
无法使用,对环境变量的修改也不影响父shell
,但是父shell
里面的变量子shell
可以使用。子shell
执行完毕后,回到父shell
,不会影响父shell
原本的环境
看完,这些好像和我们使用 sh
命令执行的报错并没有什么关系。
通过 wihch
命令查看 sh
命令可以发现,sh
只是 bash
的软链接,那为什么和 bash
执行结果有区别呢?
bash
执行时,如果 $0
是 sh
,则要求脚本内容遵循 POSIX
(Portable Operating System Interface of UNIX,缩写为 POSIX )规范,当不符合规范的语法存在时,则会报错。
所以当我们使用 sh
执行时,并不是一个程序,而是一种标准(POSIX),
这种标准,在一定程度上保证了脚本的跨系统性(跨UNIX系统)。
解决问题
找到了问题的原因,我们就可以解决了
如果你仍要使用 sh
的方式执行,那么请在代码的第一行加上
命令,这条命令会关闭使用 POSIX
规范的检测。
关注我,随时获取最新文章