Ars Asks: Share your shell and show us your tricked-out terminals!

TL;DR · AI 摘要
文章探讨了命令行界面(CLI)的重要性及其对个人工作和生活的影响,强调了其在某些任务中的优越性。
核心要点
- 命令行界面比图形界面更精确地传达指令
- 作者因工作需求开始使用bash,逐渐喜欢上了命令行
- 作者最终转向Mac,因为Mac提供了图形界面和命令行的结合
结构提纲
按章节快速跳转。
- §引言
文章庆祝了使CLI更易用的调整和定制。
命令行允许用户精确地告诉计算机他们想要做什么。
作者因工作需求开始使用bash,逐渐喜欢上了命令行。
作者转向Mac,因为它提供了图形界面和命令行的结合。
思维导图
用一张图看清主题之间的关系。
查看大纲文本(无障碍 / 无 JS 友好)
- 命令行的重要性
金句 / Highlights
值得收藏与分享的关键句。
命令行,由对比,给用户机会用词而不是一两个手势来告诉计算机他们想要什么。
作者最终转向Mac,因为它提供了图形界面和命令行的结合。
标题: Ars 问答:分享你的 Shell 并展示我们你那装点一新的终端!
URL 来源: https://arstechnica.com/information-technology/2026/05/ars-asks-share-your-shell-and-show-us-your-tricked-out-terminals/
发布时间: 2026-05-06T13:32:47+00:00
Markdown 内容: bash 装点
庆祝那些让命令行界面更便捷的调整和定制。

图片来源: Aurich Lawson | Getty Images
图片来源: Aurich Lawson | Getty Images
如今我比以往任何时候都更多地与终端窗口互动,这可能是过去的我早年间在上世纪90年代无法想象的。当时,可怜的MS-DOS是行业的保守代名词,至少在消费端,像Windows这样的图形环境(甚至可能是像AmigaOS这样奇怪的存在)似乎准备将命令行打入冷宫,让我们告别文本界面,进入黏糊糊的GUI未来。
然而,事实证明,命令行仍然是某些工作的最佳工具——事实上,是许多工作的最佳工具。几年前,我读到一篇明智的文章(可能是在Slashdot上),文章认为鼠标驱动的点击式界面实际上将用户简化为在屏幕上指指点点,并对着计算机发出“做这个!”的声音。(右键菜单的出现增加了用户可以发出“更多东西!”的声音,但这并没有增加词汇量。)
相比之下,命令行让用户有机会用词语精确告诉计算机他们想要做什么,而不是依赖于计算机必须根据上下文解释的一两个手势。

并不是说你不能用图形界面做这种事——但确实需要改变一点方法。
并不是说你不能用图形界面做这种事——但确实需要改变一点方法。
听起来有点傻,但命令行最终在2007年把我从Windows日常使用中拉了出来。当时,我在工作中被迫开始频繁使用bash,因为我接手了波音休斯顿公司当时全新的EMC Celerra NSX企业NAS设备的日程管理,虽然有可用的图形管理选项(我可能会触发一小部分老读者对“EMC控制中心”的创伤),但我继承的环境主要靠bash脚本支撑。
起初,我对这一切的Linux特性不屑一顾,但就像《最后生还者》中的真菌一样,shell的触角慢慢感染了我的大脑。我开始意识到,那个可怜的cmd.exe和MS-DOS批处理文件确实很糟糕,也许,只是也许,我那位愤怒的老管理员导师的Linux狂言并不像看起来那么疯狂。
我不认为我会达到他那种只运行手动编译的Slackware的程度——事实上,20年后,我甚至还没有接近这一点——但他确实有道理。我在工作中使用Unix风格的shell越多,我就越在家里怀念它。Windows Vista及其早期的WDDM问题将我之前拥有两块Nvidia 7900GT显卡的强力主电脑变成了一个卡顿的蓝屏机器,微软操作系统的未来看起来一片黯淡——Windows 7几年后才来改变这种情况。
对bash shell的暴露疗法让我达到了临界点,我跳槽到了Mac阵营。这是一个旨在给我带来最好世界的举动——一个带有我工作中依赖的相同bash shell的好图形界面。
我从未回头。如今,我在家里运行三种不同的操作系统。MacOS仍然是我的桌面主力;Windows存在于角落里的游戏PC上;而Linux(以Ubuntu服务器LTS的形式)则无头地藏在壁橱里,这才是它该待的地方。上帝在他的天堂里,我的计算世界一切安好——而且,就像自2007年初以来的每一天一样,我每天至少花一两个小时在终端窗口中以传统的方式做事。
fish shell 很早就成了我在Mac上的默认选择,部分原因是我喜欢fish的颜色并且觉得它们很有帮助(别评判我!)。当我登录到Linux时,我还是坚持使用经典的bash。我知道zsh和其他现代替代品也有粉丝,但我找到了自己的幸福之地,我愿意留在那里。
作为一个BBS时代的产物,当ANSI图形是最热门的东西时,我已经花费了和其他喜欢终端的管理员一样多的时间来定制我的环境,让它成为一个让我感到舒适的工作场所。
……天啊,我正在这么做。我正在做那些食谱网站上人们做的事,读者们只想知道如何制作核桃派,而不是得到一大段个人背景故事。原谅我吧。我老了。让我们回到正题,这里的“正题”是指截图和代码!
我最喜欢的东西:终端计时器
使用易于查看的参考来了解上一个命令运行了多长时间非常方便,至少对我来说是这样。(你可能不会觉得需要这个功能,直到某一天你需要它,而那时你往往会非常需要它。)为此,我在我的 .bashrc 文件中放置了一些函数,这些函数会记录每个命令的运行时间,然后将该时间和最后一个错误代码附加到下一个 bash 提示符。实际上,它看起来像这样:

看到每个操作执行了多长时间真是很酷。而且有时候这确实很有用!
感谢:Lee Hutchinson
看到每个操作执行了多长时间真是很酷。而且有时候这确实很有用!感谢:Lee Hutchinson
我喜欢这种方式。结合在提示符中打印当前时间,它不仅让你知道上一个或几个命令花了多长时间运行,还能告诉你它们是在什么时候运行的。这对那些长时间让终端会话保持打开状态的健忘管理员(我举手表示)来说非常有用,他们可能会在终端里放着重要的工作。
以下是实现这一功能的代码,你可以根据自己的需求自由修改。如前所述,我把这段代码放在了 .bashrc 中作为 PS1 提示符的一部分:
color_prompt=yes
if [ "$color_prompt" = yes ]; then
function timer_now_us {
local seconds=${EPOCHREALTIME%.*}
local micros=${EPOCHREALTIME#*.}
micros="${micros}000000"
REPLY="${seconds}${micros:0:6}"
}
function timer_stop {
if [[ ${timer_command_active:-0} -ne 1 ]] || [[ -z ${timer_started_at_us:-} ]]; then
timer_show=0us
return
fi
timer_now_us
local delta_us=$((REPLY - timer_started_at_us))
local us=$((delta_us % 1000))
local ms=$(((delta_us / 1000) % 1000))
local s=$(((delta_us / 1000000) % 60))
local m=$(((delta_us / 60000000) % 60))
local h=$((delta_us / 3600000000))
# 总是显示三位精度
if ((h > 0)); then timer_show=${h}h${m}m
elif ((m > 0)); then timer_show=${m}m${s}s
elif ((s >= 10)); then timer_show=${s}.$((ms / 100))s
elif ((s > 0)); then timer_show=${s}.$(printf %03d $ms)s
elif ((ms >= 100)); then timer_show=${ms}ms
elif ((ms > 0)); then timer_show=${ms}.$((us / 100))ms
else timer_show=${us}us
fi
unset timer_started_at_us
timer_command_active=0
}
# 提示符及提示符颜色
function set_prompt {
local Last_Command=${1:-$?}
FancyX='\342\234\227'
Checkmark='\342\234\223'
export PS1="\n$WHITE[\t] "
if [[ $Last_Command == 0 ]]; then
PS1+="\$? $GREEN$Checkmark "
else
PS1+="\$? $RED$FancyX "
fi
timer_stop
PS1+="$WHITE($timer_show)"
PS1+="\n\[$HOSTCOLOR\]\u@\h\[\033[00m\]:\[\033[1;38;5;027m\]\w\[\033[00m\] \\$ "
}
function timer_prompt_command {
local last_command=${1:-$?}
set_prompt "$last_command"
}
PS0='${ timer_now_us; timer_started_at_us=$REPLY; timer_command_active=1; }'
PROMPT_COMMAND='timer_prompt_command'
fi这些函数会将所有这些功能整合到你的提示符中,包括如果程序以错误代码 0 退出则显示一个漂亮的绿色“勾”,否则显示红色的“叉”以及错误代码。颜色定义——$WHITE、$BLUEBOLD、$HOSTCOLOR 和其他颜色——只是在 .bashrc 的其他地方定义的普通 ANSI 转义序列,并未在此处展示以避免代码片段过长。你可以并应该替换为你喜欢的颜色。
timer_stop 函数还负责将计时器转换为人类可读的格式,可能比实际需要的更复杂。我不是开发人员,所以这是过去的我经过几个小时搜索示例后决定的方案。
为像我这样的人在 fish 中实现
当我通过 SSH 登录到我的 Linux 主机时,我使用的是 bash,但在 Mac 上我使用的是 fish。我为 fish 编写了一个单独的函数来获得相同的结果,其中包含一些粗略的技巧,用于将测量结果转换为人类可读的形式。这是我编写的代码,我对此毫无歉意。见证我拼凑起来的 StackOverflow 源码拙劣之作。
function fish_prompt --description '写出提示符'
# 保存上一个状态
set -l last_status $status
# 如果可用,计算命令持续时间
set -l cmd_duration ""
if set -q CMD_DURATION
# 将毫秒转换为微秒以进行更精确的比较
set -l duration_us (math "$CMD_DURATION * 1000")
# 计算不同的时间单位
set -l us (math "$duration_us % 1000")
set -l ms (math "floor($duration_us / 1000) % 1000")
set -l s (math "floor($duration_us / 1000000) % 60")
set -l m (math "floor($duration_us / 60000000) % 60")
set -l h (math "floor($duration_us / 3600000000)")
# 格式化持续时间字符串
if test $h -gt 0
set cmd_duration (string join '' "(" $h "h" $m "m)")
else if test $m -gt 0
set cmd_duration (string join '' "(" $m "m" $s "s)")
else if test $s -ge 10
set -l fraction (math "floor($ms / 100)")
set cmd_duration (string join '' "(" $s "." $fraction "s)")
else if test $s -gt 0
set cmd_duration (string join '' "(" $s "." (printf "%03d" $ms) "s)")
else if test $ms -ge 100
set cmd_duration (string join '' "(" $ms "ms)")
else if test $ms -gt 0
set -l fraction (math "floor($us / 100)")
set cmd_duration (string join '' "(" $ms "." $fraction "ms)")
else
set cmd_duration (string join '' "(" $us "us)")
end
end
# 定义状态的unicode符号
set -l checkmark "✓"
set -l cross "✗"## 一抹色彩
在我成长的岁月里,我沉浸在 ANSI BBS 图形中,这可能让我比一般的沉闷、拘谨的管理员更喜欢终端中的彩色文本。我知道有些人认为语法高亮和颜色会 [损害理解并鼓励略读](https://www.linusakesson.net/programming/syntaxhighlighting/),但我说什么呢?我喜欢它们,并依赖它们。也许我略读得太多了,但就这样吧。你可以从我冰冷的尸体上夺走我的彩色壳工具。
为此,我依靠一个小程序 GRC(用于 [通用着色器](https://github.com/garabik/grc))来为其他工具添加高亮和着色。它广泛可用且无需任何额外配置即可工作。

[查看大图](https://cdn.arstechnica.net/wp-content/uploads/2026/04/shelltrix_grc2.png)
有一些别名(我像一个好公民一样将其保留在 `.bash_aliases` 中),使一些常用命令的彩色输出成为默认:
alias ls='ls --color=auto' alias ll='ls -AlFh --group-directories-first' alias df='grc df -h' alias du='grc du -h' alias free='grc free -h' alias ping='grc ping' alias traceroute='grc traceroute' alias ip='grc ip'
我也很喜欢让数字更易于人类阅读,因此 `-h` 开关被广泛使用。
(请注意,如果将命令(如 `ip`)包装在 GRC 中并将输出管道到其他内容,则可能会出现奇怪的情况。请谨慎使用。或者不要!这是你的电脑,随你便!)但是到达那一步需要大量的沮丧搜索和对旧的 StackOverflow 帖子大喊大叫。让 Vim 对我来说变得舒适的一件事是 Vim-Airline 和 Promptline 的结合使用,它们共同提供了一个不错的状态栏,在编辑文件时帮助突出显示一些有用的信息。
我还喜欢调整 Ubuntu 风格的 Vim 所使用的注释颜色,因为维护者几年前将其从深蓝色改为了青色的浅蓝色,这让我很恼火。针对特定的颜色并使其更改生效实际上变成了一场真正的冒险,Ars 老校友 Jim Salter 最终破解了到底应该编辑哪个文件(提示,它不是 .vimrc!)。如果你有兴趣深入研究 Vim 的颜色设置,可以阅读这篇链接的文章。(向 Jim 致敬!)
当然,既然提到了 .vimrc,我们也要看看里面的内容:
syntax on
set hlsearch "高亮搜索结果
set ignorecase "搜索时忽略大小写...
set smartcase " ...除非搜索包含混合大小写
set gdefault "替换默认为全局
set colorcolumn=80 "高亮第80列
set linebreak "以单词为单位换行
imap <silent> <Down> <C-o>gj
imap <silent> <Up> <C-o>gk
nmap <silent> <Down> gj
nmap <silent> <Up> gk
filetype plugin indent on
set tabstop=4
set softtabstop=4
set shiftwidth=4
set expandtab
highlight MatchParen ctermbg=black guibg=black
highlight MatchParen cterm=underline gui=underline
set guifont=Menlo\ for\ Powerline
" air-line
let g:airline_powerline_fonts = 1
if !exists('g:airline_symbols')
let g:airline_symbols = {}
endif
" unicode symbols
let g:airline_left_sep = '▶'
let g:airline_right_sep = '◀'
let g:airline_symbols.linenr = '␊'
let g:airline_symbols.branch = '⎇'
let g:airline_symbols.paste = 'ρ'
let g:airline_symbols.whitespace = 'Ξ'
" airline symbols
let g:airline_left_sep = ''
let g:airline_left_alt_sep = ''
let g:airline_right_sep = ''
let g:airline_right_alt_sep = ''
let g:airline_symbols.branch = ''
let g:airline_symbols.readonly = ''
let g:airline_symbols.linenr = ''简要说明一下:
- 首先,我们始终启用语法高亮。
- 接下来的三行修改了 Vim 的搜索行为,使全小写的搜索忽略大小写,但保持混合大小写的搜索敏感,并且一次高亮所有搜索结果。
gdefault行使替换默认为全局,这对我来说很有用,因为我几乎总是希望在进行替换时全局生效。- 接下来,
colorcolumn会在第 80 列点亮,这样我可以注意到需要的地方的宽度。 linebreak设置强制 Vim 以单词为单位进行换行,而不是在中间开始新行。- 四个
imap和nmap行通过显示行而不是实际文件行来使箭头键在正常模式和插入模式下移动光标上下,这对于长换行线的箭头键导航非常有帮助。(我知道,我知道,真正的解决方法是摆脱这个拐杖,更好地掌握 Vim,但嗯。) filetype行使 Vim 意识到文件类型,并且某些文件类型可能在插件目录中有特定的插件,确实如此。- 四个
set行强制执行我偏好的制表符正统性——四个空格,制表符和退格键都意识到这一点。 - 最后两个
highlight行通过改变高亮方法为下划线而不是一个大的全高度光标模拟块来改变 Vim 高亮匹配括号的方式。默认行为看起来太像终端默认光标,经常使我失去对实际光标的视觉跟踪,而下划线则不会。 - 最后一半都是 Airline/Powerline 的内容。你可以忽略这些,特别是那些带有损坏符号的部分(当你安装了正确的字体时,它们就不会损坏了!),除非你想借鉴我的特定 Airline 特殊字符配置。
关于字体的一些话
我是 Monaspace 字体系列的忠实粉丝,喜欢在终端中使用它们,我特别喜欢并使用 Monaspace Neon——它出现在本文的所有终端截图中。我知道终端字体就像挑选内衣一样个人化,但在尝试了数十年的各种选项之后,Monaspace Neon 是我找到的最接近我的等宽理想型的字体。当然,每个人的体验可能会有所不同,但我喜欢它,我使用它,并且我觉得发现它意味着结束了我职业生涯中的搜索。
在评论中分享你的终端技巧!
我不能声称想出这篇文章中的任何自定义。这些自定义是随着时间积累起来的,从多年的 StackExchange 帖子和 Reddit 讨论中吸取而来。每当我看到一些酷炫的东西时,我会复制代码并尝试使用。现在,如果你觉得这些对你有用,你也可以这样做。
但最终,这篇文章的全部目的是——你的酷炫终端技巧和黑客技术是什么?我们很想看到你是如何驾驭命令行的,从精心培育的 Neofetch 登录画面到完全从零开始的终端替代品,以及两者之间的所有内容。我们将把最好的内容放在文章下方供所有人查看。
所以,请分享吧!与我们分享你的终端,让我们一起欢庆,因为我们正处于后图形用户界面时代,这远没有我以前认为的那么可怕。至少颜色很好看。

李是高级技术编辑,负责监督 Ars Technica 的科技产品、文化、IT 和视频版块的故事发展。他是 Ars OpenForum 的长期成员,拥有丰富的企业存储和安全背景,现居休斯顿。
[244 条评论](https://arstechnica.com/information-technology/2026/05/ars-asks-share-your-shell-and-show-us-your-tricked-out-terminals/#comments "244 条评论")
- 