最近写脚本来将部分工作自动化,遇到了不少问题,这里笔记下,不过最令人无奈的就是bash和dash的兼容性问题。太坑了。。
CONTENTS
bash:
Bash(GNU Bourne-Again Shell)是许多Linux平台的内定Shell,事实上,还有许多传统UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh等等。
dash:
鉴于 bash 过于复杂,有人把 bash 从 NetBSD 移植到 Linux 并更名为 dash (Debian Almquist Shell),并建议将 /bin/sh 指向它,以获得更快的脚本执行速度。Dash Shell 比 Bash Shell 小的多,符合POSIX标准。
由于dash支持的命令比bash要少很多,因此有些时候bash脚本无法正常的使用dash解析,这里就出现了一些莫名奇妙的兼容性问题。
目前Ubuntu默认的shell执行命令sh指向的是dash
~$ ls -l /bin/*sh -rwxr-xr-x 1 root root 1045704 6月 24 2016 /bin/bash -rwxr-xr-x 1 root root 154072 7月 28 2016 /bin/dash lrwxrwxrwx 1 root root 4 4月 4 00:27 /bin/rbash -> bash lrwxrwxrwx 1 root root 4 4月 4 00:27 /bin/sh -> dash lrwxrwxrwx 1 root root 7 4月 4 00:27 /bin/static-sh -> busybox
因此,假如存在一个脚本test.sh
#!/bin/bash
#第一行告诉系统使用bash来解析
#很多只有bash支持的命令,比如数组等
如果使用命令 sh test.sh来执行,会直接报错,原因很简单:
sh默认指向了dash,该命令的含义是 /bin/dash test.sh,即强制使用dash来解析。
如何才能使用第一行注释中定义的shell来执行
chmod a+x test.sh
./test.sh
这种方式将shell作为可执行文件,那么系统就会根据第一行注释来解析即 /bin/bash test.sh
那么假如讲test.sh中的命令直接拷贝到terminal中,是否会报错呢?答案是不会,原因很简单,ubuntu的sh指向了dash,但是ubuntu的terminal是bash环境。
那么假如我们有一个test.sh文件,如果想让它被bash解析,有如下两种办法:
bash test.sh #强制使用bash解析
####
chmod a+x test.sh
./test.sh #作为可执行文件使用第一行注释解析
如何将ubuntu的sh改为指向bash
方法一
sudo dpkg-reconfigure dash
方法二
sudo ln -fs /bin/bash /bin/sh
发表评论