ubuntu默认shell分两种:用户登录shell由chsh修改(如chsh -s /bin/bash),影响交互环境;系统脚本shell由dpkg-reconfigure dash控制(选no使/bin/sh指向bash),影响#!/bin/sh脚本执行。两者独立,需按需分别配置。

Ubuntu 里“默认 Shell”其实分两种:一种是用户登录后启动的交互式 shell(比如你打开终端看到的),另一种是系统执行 /bin/sh 脚本时用的 POSIX 兼容 shell。很多人混淆这两者,改错地方会导致脚本失败或登录异常。
chsh -s 只改当前用户的登录 Shell
这是最常用也最安全的操作,只影响你本人下次登录后的交互环境:
-
chsh -s /bin/bash把当前用户默认登录 shell 改成 bash -
chsh -s /usr/bin/zsh改成 zsh(前提是已安装且路径在/etc/shells中) - 必须先确认目标 shell 已安装:
which zsh或cat /etc/shells - 改完要重新登录(不是重开终端窗口,而是登出再进)才生效
- 错误现象:执行
chsh -s /usr/bin/fish后无法登录图形界面——大概率是/usr/bin/fish没写进/etc/shells
dpkg-reconfigure dash 决定 /bin/sh 指向谁
这个命令控制的是系统级的 /bin/sh 符号链接,影响所有以 #!/bin/sh 开头的脚本:
-
sudo dpkg-reconfigure dash运行后选 No →/bin/sh指向/bin/bash - 选 Yes → 指向
/bin/dash(Ubuntu 默认,轻量快,但不兼容 bash 扩展语法) - 常见坑:某些 SDK 或构建脚本用了数组、
[[判断等 bash 特性,却写了#!/bin/sh,此时 dash 会直接报错退出 - 验证方式:
ls -l /bin/sh,输出应为/bin/sh -> /bin/bash或/bin/sh -> dash
直接改 /bin/sh 链接风险高但见效快
绕过包管理器手动操作,适合 Dockerfile 或 CI 环境,但 Ubuntu 升级时可能被覆盖:
sudo rm /bin/sh && sudo ln -s /bin/bash /bin/sh- 比
dpkg-reconfigure更彻底,连包管理器自己调用的脚本也会走 bash - 危险点:如果误删或链接错路径,可能导致
apt、systemd相关脚本执行失败 - 恢复方法:
sudo ln -sf dash /bin/sh(前提是/bin/dash存在)
真正容易被忽略的是:改了 /bin/sh 并不会让新终端自动变成 bash —— 那是 $SHELL 和 chsh 控制的;而改了 chsh 也不会让 #!/bin/sh 脚本变 bash —— 那得动 /bin/sh 链接。两个开关独立,得看清楚你要修的是哪条链路。











