LinuxZSH配置
前情提要
在用过Kali Linux和ArchLinux的Kconsole之后就会发现,Ubuntu默认的shell终端不仅很丑也很难看,所以本教程是如何在Kubuntu上的Kconsole上配置一个好看的终端界面
Shell中的sh和bash
一、核心摘要
- Shell:是一个命令行解释器,是用户与 Linux 内核进行交互的界面。它接收用户输入的命令,并将其转化为系统调用,执行后返回结果。
- sh (Bourne Shell):是 Unix 系统上最初的、标准的 Shell,由 Stephen Bourne 在 1970 年代开发。它的功能相对基础。
- bash (Bourne-Again SHell):是 sh 的增强版,也是目前绝大多数 Linux 发行版的默认 Shell。它完全兼容 sh,并在此基础上添加了大量实用功能(如命令历史、Tab 补全、数组、算术运算等)。
简单来说,bash 是 sh 的超集。在大多数现代 Linux 系统上,/bin/sh 实际上是一个指向 /bin/bash(或 /bin/dash)的符号链接,但 bash 在以 sh 名义被调用时,会遵循 POSIX 标准,行为上会变得更像传统的 sh。
二、详细区别分析:bash vs. sh
为了更直观地理解,我们来看一个对比表格:
| 特性 | sh (Bourne Shell) | bash (Bourne-Again Shell) |
|---|---|---|
| 全称/历史 | Bourne Shell | Bourne-Again Shell |
| 开发者 | Stephen Bourne | Brian Fox (GNU 项目) |
| 定位 | 原始的、标准的、最小化的 Shell | sh 的增强版,Linux 默认 Shell |
| 兼容性 | - | 完全向后兼容 sh |
| 命令历史 | 不支持 | 支持(history, !!, !$ 等) |
| 命令补全 | 不支持 | 支持 Tab 键补全 文件和命令 |
| 算术运算 | 使用 expr 命令(笨重) |
使用 $(( ... )) 语法(直观高效) |
| 数组 | 不支持 | 支持 索引数组和关联数组 |
| 提示符定制 | 功能有限 | 高度可定制(PS1, PS2 等变量) |
| 作业控制 | 功能有限 | 强大的作业控制(jobs, fg, bg, &) |
| 配置文件 | .profile |
~/.bashrc, ~/.bash_profile, ~/.bash_logout |
| 脚本调试 | 困难 | 支持 -x, -v 等调试选项 |
| 默认提示符 | $ |
[user@host directory]$ |
一个简单的例子展示语法区别:
1. 算术运算
- 在 sh 中(古老的方式):
1
2
3
result=`expr 10 + 20`
echo $result - 在 bash 中(现代的方式):
1
2
3
4
5
result=$(( 10 + 20 ))
echo $result
# 或者直接
echo $(( 10 + 20 ))
2. 数组
- 在 sh 中:根本不支持数组。
- 在 bash 中:
1
2
3
my_array=("apple" "banana" "cherry")
echo ${my_array[1]} # 输出 "banana"
现代系统中的 /bin/sh:dash 的引入
在 Debian 和 Ubuntu 等发行版中,为了追求更快的启动速度和执行效率,它们将 /bin/sh 默认链接到了一个更精简、更符合 POSIX 标准的 Shell,叫做 dash。
- dash (Debian Almquist Shell):它比 bash 小得多,速度快,但功能也少得多(没有交互式功能如补全、历史等)。
- 目的:系统启动时的 Shell 脚本(如
/etc/init.d/*中的脚本)通常只用到了 POSIX 标准语法,使用 dash 来执行它们可以显著加快系统启动过程。
总结一下现状:
- 你登录后使用的交互式 Shell 几乎总是 bash(功能丰富,适合人类使用)。
- 系统执行系统脚本时可能调用的是
/bin/sh,它可能是 dash(速度快,适合机器执行标准化任务)。
你可以通过以下命令查看你系统中 /bin/sh 指向哪里:
1 | ls -l /bin/sh |
三、其他常见的 Shell
除了 bash 和 sh,Unix/Linux 世界还有其他几种重要的 Shell:
| Shell 名称 | 全称 | 特点与区别 |
|---|---|---|
| csh / tcsh | C Shell / TENEX C Shell | 语法类似 C 语言,曾是 Berkeley Unix 的默认 Shell。不兼容 sh 语法。tcsh 是 csh 的增强版,增加了命令行补全等功能。现在已不常用。 |
| ksh | Korn Shell | 由 David Korn 开发,兼容 sh 语法,同时引入了 csh 的某些交互特性。功能强大,在 AIX、Solaris 等商业 Unix 上流行。 |
| zsh | Z Shell | 目前最流行的“终极”Shell。完全兼容 bash,但提供了更强大的功能: • 更智能的补全:可补全命令、选项、文件名、甚至 Git 分支等。 • 主题支持:丰富的提示符主题(Oh My Zsh 框架)。 • 拼写纠正:输入错误命令时会提示纠正。 • 全局别名等高级功能。 macOS 从 Catalina 开始已将其设为默认 Shell。 |
| fish | Friendly Interactive Shell | 专注于用户体验和易用性,不追求 POSIX 兼容。 • 开箱即用:拥有漂亮的彩色提示、自动建议。 • 易于配置:通过网页界面进行配置。 • 语法与 bash/zsh 不同,对新手友好,但可能不适用于编写通用系统脚本。 |
| dash | Debian Almquist Shell | 如上所述,一个轻量、快速、严格遵循 POSIX 标准的 Shell。主要用于执行系统启动脚本,不适合交互式使用。 |
四、如何查看和切换 Shell
查看当前使用的 Shell:
1
2echo $SHELL # 显示你登录时使用的默认 Shell
echo $0 # 显示当前会话的 Shell 进程名查看系统已安装的 Shell:
1
cat /etc/shells
临时切换 Shell:
直接在命令行输入 shell 的路径即可,例如zsh、fish。退出后即恢复原 Shell。永久更改默认 Shell:
1
chsh -s /bin/zsh # 将默认 Shell 更改为 zsh,需要重新登录生效
五、总结与建议
- 对于初学者和绝大多数 Linux 用户:使用系统自带的 bash 就足够了。它功能强大,资源丰富,是事实上的标准。
- 对于追求效率和美观的开发者:强烈推荐尝试 zsh,并配合 Oh My Zsh 框架,会极大提升你的命令行体验和效率。
- 对于系统脚本编写:
- 如果你希望脚本具有最好的可移植性(能在各种 Unix-like 系统上运行),请使用
#!/bin/sh作为 Shebang,并确保脚本使用 POSIX 标准语法。 - 如果你的脚本需要用到 bash 的独有特性(如数组),请务必使用
#!/bin/bash作为 Shebang。
- 如果你希望脚本具有最好的可移植性(能在各种 Unix-like 系统上运行),请使用
- 理解
/bin/sh的真相:知道它在不同发行版上可能指向bash或dash,这有助于你理解为什么某些脚本在 Ubuntu 和 CentOS 上行为可能略有不同。
终端提示符修改
下面是 Arch Linux 风格 + 彩色两行提示符 + 显示 Git 分支 + 显示时间 的 .bashrc 配置(适用于 Ubuntu / Arch / Mint / Debian 等 bash 环境)。
我已将样式调校成类似 Arch Linux 默认的美观两行提示符格式,支持彩色与 Git 状态检测。
🧩 完整 .bashrc(可直接替换)
1 | # ~/.bashrc |
💡 效果预览
当你打开终端时,将显示:
1 | ┌─[furina@dell]─[~/Documents]─[ main]─[2025-10-10 23:12:19] |
带有颜色:
- 用户名:青色
- 主机名:蓝色
- 当前路径:黄色
- Git 分支:紫色
- 时间:绿色
🚀 应用方法
将以上内容 替换 你上传的
~/.bashrc文件内容。保存后执行:
1
source ~/.bashrc
重新打开终端,你就能看到 Arch 风格两行提示符啦!
