前情提要

在用过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
    #!/bin/sh
    result=`expr 10 + 20`
    echo $result
  • bash 中(现代的方式):
    1
    2
    3
    4
    5
    #!/bin/bash
    result=$(( 10 + 20 ))
    echo $result
    # 或者直接
    echo $(( 10 + 20 ))

2. 数组

  • sh 中:根本不支持数组。
  • bash 中:
    1
    2
    3
    #!/bin/bash
    my_array=("apple" "banana" "cherry")
    echo ${my_array[1]} # 输出 "banana"

现代系统中的 /bin/sh:dash 的引入

DebianUbuntu 等发行版中,为了追求更快的启动速度和执行效率,它们将 /bin/sh 默认链接到了一个更精简、更符合 POSIX 标准的 Shell,叫做 dash

  • dash (Debian Almquist Shell):它比 bash 小得多,速度快,但功能也少得多(没有交互式功能如补全、历史等)。
  • 目的:系统启动时的 Shell 脚本(如 /etc/init.d/* 中的脚本)通常只用到了 POSIX 标准语法,使用 dash 来执行它们可以显著加快系统启动过程

总结一下现状

  • 登录后使用的交互式 Shell 几乎总是 bash(功能丰富,适合人类使用)。
  • 系统执行系统脚本时可能调用的是 /bin/sh,它可能是 dash(速度快,适合机器执行标准化任务)。

你可以通过以下命令查看你系统中 /bin/sh 指向哪里:

1
2
3
ls -l /bin/sh
# 在 CentOS 等系统上,你可能看到:/bin/sh -> bash
# 在 Ubuntu 等系统上,你可能看到:/bin/sh -> dash

三、其他常见的 Shell

除了 bash 和 sh,Unix/Linux 世界还有其他几种重要的 Shell:

Shell 名称 全称 特点与区别
csh / tcsh C Shell / TENEX C Shell 语法类似 C 语言,曾是 Berkeley Unix 的默认 Shell。不兼容 sh 语法tcshcsh 的增强版,增加了命令行补全等功能。现在已不常用。
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

  1. 查看当前使用的 Shell:

    1
    2
    echo $SHELL    # 显示你登录时使用的默认 Shell
    echo $0 # 显示当前会话的 Shell 进程名
  2. 查看系统已安装的 Shell:

    1
    cat /etc/shells
  3. 临时切换 Shell:
    直接在命令行输入 shell 的路径即可,例如 zshfish。退出后即恢复原 Shell。

  4. 永久更改默认 Shell:

    1
    chsh -s /bin/zsh  # 将默认 Shell 更改为 zsh,需要重新登录生效

五、总结与建议

  • 对于初学者和绝大多数 Linux 用户:使用系统自带的 bash 就足够了。它功能强大,资源丰富,是事实上的标准。
  • 对于追求效率和美观的开发者:强烈推荐尝试 zsh,并配合 Oh My Zsh 框架,会极大提升你的命令行体验和效率。
  • 对于系统脚本编写
    • 如果你希望脚本具有最好的可移植性(能在各种 Unix-like 系统上运行),请使用 #!/bin/sh 作为 Shebang,并确保脚本使用 POSIX 标准语法
    • 如果你的脚本需要用到 bash 的独有特性(如数组),请务必使用 #!/bin/bash 作为 Shebang。
  • 理解 /bin/sh 的真相:知道它在不同发行版上可能指向 bashdash,这有助于你理解为什么某些脚本在 Ubuntu 和 CentOS 上行为可能略有不同。

终端提示符修改

下面是 Arch Linux 风格 + 彩色两行提示符 + 显示 Git 分支 + 显示时间.bashrc 配置(适用于 Ubuntu / Arch / Mint / Debian 等 bash 环境)。
我已将样式调校成类似 Arch Linux 默认的美观两行提示符格式,支持彩色与 Git 状态检测。


🧩 完整 .bashrc(可直接替换)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# ~/.bashrc
# ────────────────────────────────────────────────
# Arch Linux 风格两行彩色提示符
# 含用户、主机、路径、Git分支、时间显示
# Last updated: 2025-10-10 11:12:19 PM
# ────────────────────────────────────────────────

# 如果不是交互式 shell,直接退出
[[ $- != *i* ]] && return

# 启用颜色支持
if [ -x /usr/bin/dircolors ]; then
test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)"
alias ls='ls --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'
fi

# 常用别名
alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
alias cls='clear'
alias ..='cd ..'
alias ...='cd ../..'

# 检测 Git 分支函数
parse_git_branch() {
git branch 2>/dev/null | sed -n '/\* /s///p'
}

# ────────────────────────────────────────────────
# 🎨 彩色定义
# ────────────────────────────────────────────────
# 颜色转义序列
RED="\[\033[0;31m\]"
GREEN="\[\033[0;32m\]"
YELLOW="\[\033[0;33m\]"
BLUE="\[\033[0;34m\]"
MAGENTA="\[\033[0;35m\]"
CYAN="\[\033[0;36m\]"
WHITE="\[\033[0;37m\]"
BOLD="\[\033[1m\]"
RESET="\[\033[0m\]"

# ────────────────────────────────────────────────
# 🧠 提示符样式设置 (两行 Arch 风格)
# ────────────────────────────────────────────────
PS1='\n┌─['$BOLD$CYAN'\u'$RESET'@'$BOLD$BLUE'\h'$RESET']─['$BOLD$YELLOW'\w'$RESET']\
$([ -n "$(parse_git_branch)" ] && echo "─['$MAGENTA' $(parse_git_branch)'$RESET']")─['$GREEN'\D{%Y-%m-%d %H:%M:%S}'$RESET']\n└─\$ '

# ────────────────────────────────────────────────
# 🧩 其他配置
# ────────────────────────────────────────────────
# 历史记录设置
HISTSIZE=1000
HISTFILESIZE=2000
HISTCONTROL=ignoredups:erasedups
shopt -s histappend

# 自动补全
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
elif [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
fi

# 欢迎信息
echo -e "${BLUE}Welcome back, ${CYAN}${USER}${RESET}! ${YELLOW}$(date +"%Y-%m-%d %H:%M:%S")${RESET}"
echo -e "${MAGENTA}Arch-style colorful shell ready.${RESET}"

💡 效果预览

当你打开终端时,将显示:

1
2
┌─[furina@dell]─[~/Documents]─[ main]─[2025-10-10 23:12:19]
└─$

带有颜色:

  • 用户名:青色
  • 主机名:蓝色
  • 当前路径:黄色
  • Git 分支:紫色
  • 时间:绿色

🚀 应用方法

  1. 将以上内容 替换 你上传的 ~/.bashrc 文件内容。

  2. 保存后执行:

    1
    source ~/.bashrc
  3. 重新打开终端,你就能看到 Arch 风格两行提示符啦!