文章目录

概述

故事背景是这样的:在一个阳光明媚的早上,公司给新来的同事小 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 38 21:21 /bin/sh -> dash

既然我们已经知道 Debian 系的默认 shell 是 dash,那我们只需要将 /bin/sh 指向 dash 的符号链接重定向到 bash 即可。Debian 提供了 dpkg-reconfigure 来完成这个工作,命令行执行:

sudo dpkg-reconfigure dash

dash-reconfigure
在弹出的对话框界面中选择 <No> 然后按回车。

再检查一下当前系统下的 /bin/sh 符号链接:

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 38 21:21 /bin/sh -> bash

系统默认的 shell 已经由 dash 修改为 bash 了。

小 C 根据老 K 的指引,在网上疯狂百度一轮之后,终于可以正常编译了,而此时也早已夜深人静……

欢迎关注我的公众号:飞翔的小黄鸭
也许会发现不一样的风景

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐