概述
故事背景是这样的:在一个阳光明媚的早上,公司给新来的同事小 C 配了一台新的 Ubuntu 20.04 的电脑,小 C 根据老同事老 K 的指引从一个代码库拉取了源码回来准备进行编译,不编译不打紧,这一运行编译脚本一堆报错,可把小 C 吓得不轻,于是小 C 赶紧跑到老 K 处求救。老 K 用余光扫了一眼小 C 的屏幕,不紧不慢地说道:“把 dash 改成 bash”……
-
什么是 bash
Bash 是 Bourne shell 的后继兼容版本与开放源代码版本,它的名称来自 Bourne shell(sh)的一个双关语:Bourne-Again Shell。Bash (GNU Bourne-Again Shell) 是许多 Linux 发行版的默认 Shell,bash 的命令语法是 Bourne shell 命令语法的超集,很多来自 Korn shell(ksh)和 C shell(csh), 使用 ‘function’ 关键字时,Bash 的函数声明与 Bourne/Korn/POSIX 脚本不兼容(Korn shell 有同样的问题)。不过 Bash 也接受 Bourne/Korn/POSIX 的函数声明语法。因为许多不同,Bash 脚本很少能在 Bourne 或 Korn 解释器中运行,除非编写脚本时刻意保持兼容性。然而,随着 Linux 的普及,这种方式正变得越来越少。不过在 POSIX 模式下,Bash 更加符合 POSIX。
详细介绍可参考:百度百科 Bash -
什么是 dash
Dash,GNU/Linux 操作系统中的 /bin/sh 本是 bash 的符号链接,但鉴于 bash 过于复杂,有人把 bash 从 NetBSD 移植到 Linux 并更名为 dash (Debian Almquist Shell),并建议将 /bin/sh 指向它,以获得更快的脚本执行速度。但是后来经过 shell 脚本测试存在运行问题。因为原先在 bash shell 下可以运行的 shell script (shell 脚本),会出现一些意想不到的问题,不是 100% 的兼用。
Ubuntu 继承了 Debian,所以从 Ubuntu 6.10 开始默认是 Dash Shell。
更多信息可以参考:百度百科 Dash shell
解决方案
首先我们查看一下当前系统下的 /bin/sh
符号链接:
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 3月 8 21:21 /bin/sh -> dash
既然我们已经知道 Debian 系的默认 shell 是 dash,那我们只需要将 /bin/sh 指向 dash 的符号链接重定向到 bash 即可。Debian 提供了 dpkg-reconfigure 来完成这个工作,命令行执行:
sudo dpkg-reconfigure dash
在弹出的对话框界面中选择 <No> 然后按回车。
再检查一下当前系统下的 /bin/sh
符号链接:
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 3月 8 21:21 /bin/sh -> bash
系统默认的 shell 已经由 dash 修改为 bash 了。
小 C 根据老 K 的指引,在网上疯狂百度一轮之后,终于可以正常编译了,而此时也早已夜深人静……
欢迎关注我的公众号:飞翔的小黄鸭
也许会发现不一样的风景