当你在 Linux 环境下打开一个 Shell 终端时,会看到命令行中出现了类似下面的一个 Bash 提示符:

[user@$host ~]$

你知道命令行提示符其实是可以自己设置添加许多非常有用的信息的吗?在这篇文章中就会教你如何自定义自己的 Bash 命令行提示符,想看的话就接着看吧~

如何设置 Bash 提示符

Bash 提示符是通过环境变量 PS1 (提示符字符串 1Prompt String 1) 来设置的,它用于交互式 shell 提示符。当然如果你需要更多的输入才能完成一个 Bash 命令时,PS2 环境变量就是用来设置多行提示符的:

[dneary@dhcp-41-137 ~]$ export PS1="[Linux Rulez]$"
[Linux Rulez] export PS2="..."
[Linux Rulez] if true; then
... echo "Success!"
... fi
Success!
在哪里设置 PS1 的值?

PS1 就是一个普通的环境变量,系统默认值设置在 /etc/bashrc 中,在我的系统中,默认提示符通过以下命令来设置的:

["$PS1" = "\\s-\\v\\\$"] && PS1="[\u@\h \W]\\$"

它判断 PS1 是否是系统的默认值 \s-\v$ ,如果是的话则将值设置为 [\u@\h \W]\$。(LCTT 译注:注意命令中用 \ 做了转义。)

但如果你想要自定义提示符,不应该修改 /etc/bashrc ,而是应该在你的主目录下将自定义命令加到 .bashrc 文件中。

上面提到的 \u、\h、\W、\s 和 \v 是什么意思?

在 man bash 中的 PROMPTING 章节中,你能够找到所有 PS1 和 PS2 相关的特殊字符的描述,以下是一些比较常用的:

 

  • \u:用户名
  • \h:短主机名
  • \W:当前你所在的目录的名称(basename),~ 表示你的主目录
  • \s:Shell 名字(bash 或者 sh,取决于你的 Shell 的名字是什么)
  • \v:Shell 的版本号
还有哪些特殊的字符串可以用在提示符当

除了上面这些,还有很多有用的字符串可以用在提示符当中:

  • \d:将日期扩展成 “Tue Jun 27” 这种格式
  • \D{fmt}:允许自定义日期格式——可通过 man strftime 来获得更多信息
  • \D{%c}:获得本地化的日期和时间
  • \n:换行(参考下面的多行提示符)
  • \w:显示当前工作目录的完整路径
  • \H:当前工作机器的完整主机名

除了以上这些,你还可以在 Bash 的 man 页面的 PROMPTING 部分找到更多的特殊字符和它的用处。

多行提示符

如果你的提示符过长(比如说你想包括 \H 、\w 或完整的日期时间时 ),想将提示符切成两行,可以使用 \n 将提示符切断成两行显示,比如下面的多行的例子会在第一行显示日期、时间和当前工作目录,第二行显示用户名和主机名:

PS1="\D{%c} \w\n[\u@\H]$"

还能再好玩点吗?

人们偶尔也想将提示符变成彩色的。虽然我觉得彩色提示符让人分心、易怒,但是也许你很喜欢。如果我们想将日期变成红色的,目录变成青蓝色,用户名搞一个黄色背景,你可以这样做:

PS1="\[\e[31m\]\D{%c}\[\e[0m\] \[\e[36m\]\w\[\e[0m\]\n[\[\e[1;43m\]\u\[\e[0m\]@\H]$ "

ag

比 grep、ack 更快的递归搜索文件内容。

ag

tig

字符模式下交互查看 git 项目,可以替代 git 命令。

tig

mycli

mysql 客户端,支持语法高亮和命令补全,效果类似 ipython,可以替代 mysql 命令。

mycli

jq

 json 文件处理以及格式化显示,支持高亮,可以替换 python -m json.tool。

jp

shellcheck

shell 脚本静态检查工具,能够识别语法错误以及不规范的写法。

shellcheck

yapf

Google 开发的 python 代码格式规范化工具,支持 pep8 以及 Google 代码风格。

mosh

基于 UDP 的终端连接,可以替代 ssh,连接更稳定,即使 IP 变了,也能自动重连。

fzf

命令行下模糊搜索工具,能够交互式智能搜索并选取文件或者内容,配合终端 ctrl-r 历史命令搜索简直完美。

fzf

PathPicker(fpp)

在命令行输出中自动识别目录和文件,支持交互式,配合 git 非常有用。

 

运行以下命令:

 

git diff HEAD~8 --stat | fpp

fpp

htop

提供更美观、更方便的进程监控工具,替代 top 命令。

htop

axel

多线程下载工具,下载文件时可以替代 curl、wget。

axel -n 20 http://centos.ustc.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1511.iso

axel

sz/rz

交互式文件传输,在多重跳板机下传输文件非常好用,不用一级一级传输。

cloc

代码统计工具,能够统计代码的空行数、注释行、编程语言。

cloc

ccache

高速 C/C++ 编译缓存工具,反复编译内核非常有用。使用起来也非常方便:

gcc foo.c

改成:

ccache gcc foo.c

tmux

终端复用工具,替代 screen、nohup。

tmux

neovim: 替代 vim。

script/scriptreplay: 终端会话录制。

script -t 2>time.txt session.typescript # 录制开始

# your commands

exit # 录制结束

回放:

scriptreplay -t time.txt session.typescript

you-get: 非常强大的媒体下载工具,支持 youtube、google+、优酷、芒果 TV、腾讯视频、秒拍等视频下载。

还有 mac 专有的 pbcopy/pbpaste:

把命令行输出拷贝到系统粘贴板:

cat test.sh| pbcopy

把系统粘贴板内容拷到终端:

pbpaste

mac 下的 say 命令支持多种语言 (英语、普通话、粤语) 文本朗读,支持各种销魂恐怖的语气。跑这个命令感受下,小心被吓着了:

for i in `say -v '?' | cut -d ''-f 1`; do echo $i && say -v"$i"'Hello World';done

知乎原帖中,也有答友推荐了 The Fuck。用途是每次命令行打错了以后,打一句 fuck 就会自动更正命令。比如 apt-get 打成了 aptget。fuck 以后自动变成 apt-get。但还是没加 sudo。再 fuck,成功!

thefuck