好记性不如铅笔头

linux, 操作系统

Ubuntu的bash和dash的一些吐槽

最近写脚本来将部分工作自动化,遇到了不少问题,这里笔记下,不过最令人无奈的就是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

bash和dash在语法上有什么区别

参考网址【 http://ju.outofmemory.cn/entry/135

发表评论

15 + 15 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据