我尝试从源码重新编译 Bash,下面记录了下载、编译和切换 Shell 的过程。

本文使用 Bash 5.1.16,截图来自 Kali 虚拟机。该版本较旧,如需在其他环境中执行,请按实际需求选择版本。

# 查看 Bash Shell 版本

先查看当前账号配置的登录 Shell:

echo "$SHELL"

账号配置的登录 Shell 为 zsh

$SHELL 通常保存登录 Shell 的路径,图中可以看到本环境默认使用 zsh,但通常来说,系统也会默认安装 Bash。

查看已经安装的 Bash 版本:

bash --version

这里使用的是 Bash 5.1.16:

预装的 Bash 版本为 5.1.16

# 下载安装 Bash

这次需要指定编译选项,所以选择从源码安装。编译前需要准备好 C 编译器和 make;Kali 中可以通过 sudo apt install build-essential 安装。

# 下载

在 GNU 下载目录中找到 Bash 5.1.16 源码包,使用 wget 下载:

wget https://ftp.gnu.org/gnu/bash/bash-5.1.16.tar.gz

下载 Bash 5.1.16 源码包

# 解压

解压源码包:

tar -zxvf bash-5.1.16.tar.gz

解压后,当前目录中会生成 bash-5.1.16 文件夹:

解压后的源码目录

进入这个目录:

cd bash-5.1.16

# 配置编译选项

配置安装目录,并显式启用网络重定向:

./configure --prefix=/usr/local/bash --enable-net-redirections

--prefix 指定安装目录。这里将 Bash 安装到 /usr/local/bash ,不会直接替换系统原有的 Bash。

指定安装目录和网络重定向编译选项

# 编译与安装

配置完成后,执行 make 编译:

make

编译 Bash 源码

编译通过后,再安装到前面指定的目录:

sudo make install

截图中使用的是 root 账号,所以直接执行了 make install 。

将编译结果安装到指定目录

# 更换使用

安装完成后,可以直接运行新 Bash,无需先修改默认 Shell:

/usr/local/bash/bin/bash

如果希望登录后默认使用它,先确认 /etc/shells 中是否已有 /usr/local/bash/bin/bash 。没有的话,添加这一行:

echo '/usr/local/bash/bin/bash' | sudo tee -a /etc/shells

然后修改当前账号的登录 Shell:

chsh -s /usr/local/bash/bin/bash

退出账号并重新登录后生效,不必为此重启整台机器。重新登录后,执行 echo "$SHELL" 查看配置的路径:

登录 Shell 已改为新安装的 Bash