备考RH134时,我把第一章“提高命令行运行效率”当成纯复习内容来刷,毕竟平时天天泡在终端里,觉得命令敲得够熟了。真到做题和实操的时候才发现,这一章根本不是教“命令行是什么”,而是在考你“能不能用最少的按键、最少的错误、最少的时间把一条命令敲完”。RH134的知识点问答题里,这一章的分量很奇妙——不出偏题怪题,全是干活时天天要用的基本功,但答不上来的人往往就是效率上吃亏。
这篇梳理按我自己的学习顺序来写,从红帽官方课程里“效率”二字的真实含义,到历史命令、命令行编辑、补全与展开、别名与命令替换,最后给一套可以自测的问答题。适合正在刷RHCSA/RH134备考题的人,也适合想把手头Linux命令行操作提提速的运维新手。
1. 红帽课程里“效率”二字的真实含义
RH134是红帽系统管理员的第二门课,紧跟在RH124之后。第一章的官方标题叫“提高命令行运行效率”,很容易被当成“基础操作”跳过。但从考试角度看,这一章一点都不基础——RHCSA机考环境下,你能查的资料和操作时间都是有限的,命令敲得越快、越准,后面排错题的时间就越充裕。
我拆下来发现,红帽在这一章里其实把“效率”分成了四个能力维度:
| 维度 | 核心工具 | 最直接的收益 |
|---|---|---|
| 历史命令 | history、!!、!n、Ctrl+R | 不重复敲相同命令 |
| 命令行编辑 | Ctrl+A、Ctrl+E、Ctrl+U、Ctrl+K | 不出错地改长命令 |
| 补全与展开 | Tab、通配符、花括号展开 | 少打字符、批量生成参数 |
| 别名与命令替换 | alias、$()、引号规则 | 把长命令缩成短单词 |
这四个维度不是独立考的,实操时经常叠加在一起。比如先用Ctrl+R找回一条历史命令,再用Tab补全新路径,最后用花括号展开批量创建目录,整个过程可能只有几秒钟。红帽要的就是这种“不假思索”的状态。
我自己备考时做了一个自评清单,你也可以对照一下:
- 不按方向键上箭头,能不能3秒内调出上一条命令?
- 一条100字符的长命令中间写错一个参数,能不能5秒内改完?
- 需要批量创建
01到12月份的目录,能不能一条命令搞定? - 想查看系统里所有别名,或者给别名加时间戳,脑子里有没有立刻浮现出对应的命令?
如果有不止一项卡住,那这一章就需要踏踏实实过一遍,别急着往后面的服务管理、存储配置冲。
2. 历史命令:把上下箭头用出花的实用方案
这一章里最常见的问答题就是“如何快速执行历史中的某条命令”。最直观的做法是方向键上下翻,但效率太低,而且考试时越急越容易翻过。真正要掌握的是history机制和几个历史展开符号。
2.1 历史命令的存储与容量
每敲完一条命令,bash会把它存放在当前会话的内存历史列表里,用history就能看到带编号的列表。退出终端时,内存历史会写入当前用户家目录下的~/.bash_history文件。这个机制背后有两个环境变量最容易弄混:
HISTSIZE:当前shell会话内存里最多记住多少条命令。HISTFILESIZE:历史文件~/.bash_history中最多保留多少行。
简单说,一个管“这次开机记忆多少”,一个管“这次关机存多少”。默认情况下HISTSIZE通常是1000左右,不同发行版有差异,你可以直接执行echo $HISTSIZE确认。想调大就写进~/.bashrc:
export HISTSIZE=5000 export HISTFILESIZE=10000改完记得source ~/.bashrc,否则当前会话不会立刻生效。
2.2 用“!”系列符号快速复用历史命令
历史命令的精华在几个展开符号,这是RH134问答题的常客:
!!:执行上一条命令。最经典的场景是刚敲完一条需要sudo权限的命令,结果忘了加sudo,直接sudo !!重来。!n:执行history里编号为n的那条命令。比如history显示第302条是vim /etc/ssh/sshd_config,执行!302就可以直接打开。!$:取上一条命令的最后一个参数。比如你先执行了cat /var/log/messages,紧接着想用vim打开这个文件,直接vim !$,比重新输路径快得多。这个符号还有另一个等价操作:按Alt+.或者Esc+.,效果一样。!^:取上一条命令的第一个参数。!string:执行最近一条以string开头的命令。比如最近一段时间执行过systemctl restart sshd,下次想再来一遍,敲!systemctl。
举个真实操作片段。我在练习时经常执行这样的动作:
dnf install -y httpd systemctl enable --now httpd ss -ltnp | grep :80第一条装包时经常忘记先确认网络状态,等装上以后想看看端口有没有监听,可以直接!ss,bash会自动把最后一条以ss开头的命令补出来。这个速度比上下箭头翻历史快一大截。
2.3 Ctrl+R反向搜索历史
Ctrl+R是反向搜索历史的入口,也是我认为整章性价比最高的一个快捷键。按下Ctrl+R后,输入任意关键字,bash会从历史记录中倒序匹配出最近一条包含关键字的命令。如果匹配出来不是你要的那条,继续按Ctrl+R向上一条匹配项跳,按Ctrl+G退出搜索,按回车直接执行,按方向键还可以先编辑再执行。
这套操作在日常运维里的价值体现在“记不清完整命令”的场景。比如前几天执行过一个带复杂参数的rsync命令,只记得里面有backup字样,直接Ctrl+R输入backup,历史记录自动帮你翻出来。
2.4 历史记录的调优与排错
备考时经常遇到一个实际问题:开了好几个终端窗口,结果某个终端退出来,其他终端里执行过的命令丢了。原因是每个终端退出时都会把内存历史写回同一个~/.bash_history文件,后写入的会覆盖先写入的。
解决思路之一是开启追加模式,让bash在退出时追加而不是覆盖:
shopt -s histappend把这个写进~/.bashrc后,多个终端的历史就不容易互相覆盖。红帽考试不一定会追到这一步,但面试或实际工作中被问到的概率不低。
还有一个实用调优是忽略部分命令。我不建议把密码直接敲在命令行里,但有些临时命令确实不想进历史,可以设置:
export HISTCONTROL=ignorespace设置后,在命令前面加一个空格,这条命令就不会被写进历史。另外可以加时间戳,让历史记录更可读:
export HISTTIMEFORMAT="%F %T "改完执行history,每行命令前面都会多出日期时间。
3. 命令行编辑:让手指留在主键盘区的肌肉记忆
历史命令解决的是“重新执行已敲过的命令”,命令行编辑解决的是“正在输入的这条命令怎么改”。很多人习惯用方向键一格一格挪光标,效率极低。bash命令行用的是GNU Readline库,它提供了一套类似Emacs的快捷键,学会以后改命令就像在编辑器里操作一样。
3.1 为什么退格键从头改到尾是最亏的
我自己踩过这个坑。一条上百字符的rsync命令,中间源路径少写了一个字母,如果靠方向键一个字符一个字符挪过去,再一个字符一个字符改完,三十秒就没了。考试环境下这种浪费特别可惜。
更夸张的是,有些复制过来的长命令,粘贴后某个中间参数是错的,正常人会想到把整行删掉重敲,而这个操作本身又在浪费时间。正确的做法是:让光标直接跳到你需要的单词上,删除重敲,再跳回行尾补全参数。
3.2 高频快捷键对照表
我整理了一份自己实际高频使用的清单,按记忆优先级排:
| 按键 | 功能 | 备注 |
|---|---|---|
Ctrl+A | 光标跳到行首 | 高频中的高频 |
Ctrl+E | 光标跳到行尾 | 高频中的高频 |
Ctrl+U | 删除光标到行首的所有内容 | 相当于把当前输入清空 |
Ctrl+K | 删除光标到行尾的所有内容 | 适合删掉后半截重新输 |
Ctrl+W | 删除光标前一个单词 | 注意是按空白符分词 |
Ctrl+Y | 粘贴最近一次删除的内容 | 误删后的后悔药 |
Ctrl+L | 清屏 | 相当于clear,但不是删除当前输入 |
Ctrl+D | 行首时退出shell;其他地方是删除光标处字符 | 不要乱按 |
Ctrl+C | 取消当前命令行输入 | 最常用的“放弃”键 |
Ctrl+R | 反向搜索历史 | 前面聊过 |
Alt+F/Alt+B | 按单词向前/向后跳 | 长命令改单词时很好用 |
Alt+D | 删除光标后面的一个单词 | 与Ctrl+W互补 |
一开始不需要全背。我建议先练Ctrl+A、Ctrl+E、Ctrl+U、Ctrl+K、Ctrl+W、Ctrl+Y这六个,日常使用时强迫自己不用方向键,大概两三天就能形成肌肉记忆。
3.3 一条长命令的完整改错演练
举个例子。你想执行:
ssh -p 2222 devops@192.168.1.100 'systemctl restart php-fpm'敲到一半发现用户名devops写成了dmops,正确的改法是:
- 按
Ctrl+A跳到行首。 - 按
Alt+F或Ctrl+F把光标移到dmops这个单词处。 - 按
Ctrl+W删除光标前的整个单词,重新输入devops。 - 按
Ctrl+E跳到行尾,把剩下的引号补完。
全程用不到方向键,速度至少快一倍。如果只是末尾少了一串参数,直接Ctrl+E到行尾补内容就行。
3.4 误删后的后悔药
Ctrl+Y特别适合“误删整行”的场景。我练习时经常有这样的情况:想按Ctrl+A去行首看内容,结果手滑按了Ctrl+U,整行命令瞬间消失。此时不要慌,按Ctrl+Y,删除的内容会原样粘贴回来。
这个功能在text编辑器里叫“yank”,bash同样支持。多删几次后,连续按Ctrl+Y会重新粘贴最近删除的那一段,配合Alt+Y可以从更早的删除内容里翻。不过日常使用一般用不上这么深,记住Ctrl+Y是“取消删除”就够了。
4. Tab补全、通配符与花括号展开:把“敲字”变成“选字”
如果说前两节是“改正”效率,这一节就是“减少输入量”的核心。红帽课程里花了不少篇幅讲Tab补全、通配符和花括号展开,原因是它们能直接减少错误。少敲字符本身也意味着少犯错。
4.1 Tab补全:最被低估的交互设计
Tab补全可以补命令、补路径、补变量名、补用户名。最基础的用法是命令补全,比如敲systemctl restart ssh后按Tab,shell会尝试补全sshd;如果存在多个候选,快速按两次Tab会列出所有可选项。
路径补全更适合实际运维。比如要切换到一个超长目录/var/lib/docker/containers,不必全打出来,输入前几个字符后连按Tab补全即可。路径中只有一个候选时按一次Tab就补全;多个候选时按两次列出。
我特别想强调一个习惯:每次需要敲一个长路径时,先敲一两个字符,剩下交给Tab。考试时很多人在目录路径上拼写错误,反而白白丢分。
4.2 通配符的三板斧
通配符用于匹配已有文件名,红帽这一章通常会考三个:
*:匹配任意多个任意字符。注意它不匹配以.开头的隐藏文件,除非你显式写成.*。?:匹配恰好一个任意字符。[abc]、[a-z]、[0-9]:匹配方括号内指定的一个字符。[^abc]表示匹配不在该范围的字符。
实际应用很容易理解:
ls /etc/[a-c]*.conf rm -f /data/logs/*.log cp /tmp/test?.txt /backup/这里有一个重要差异:通配符匹配的是“已经存在的文件”。如果没有匹配到任何文件,bash会原样把*.log传给命令,最终命令报“没有这个文件或目录”。这是新手最常见的坑。
另外,[a-z]这类范围匹配受语言环境影响,在LANG=en_US.UTF-8和LANG=C下行为可能不一样。考试一般不追这么深,但工作里如果遇到排序或匹配结果不对劲,可以先想到这一层。
4.3 花括号展开:一个命令生成一批参数
花括号展开是我最想推荐的一个功能,它的作用和通配符正好相反——不检查文件是否存在,直接按你给的规则生成字符串列表。因为发生在命令解析的更早阶段,它甚至可以生成通配符想去匹配的“目标”。
基本用法:
echo file{1..5}.txt输出:
file1.txt file2.txt file3.txt file4.txt file5.txt更实用的是批量创建目录:
mkdir -p /srv/{www,logs,backup}/{2024,2025}/{01..12}这一条命令会生成/srv/www/2024/01、/srv/www/2024/02……整个目录树,总共几十个目录。如果用手工mkdir一条条敲,至少得几十条命令,效率和犯错率完全不是一个级别。
还有两个很常用的技巧:
cp nginx.conf{,.bak} touch report_{01..10}.pdf第一条的{,.bak}展开后就是nginx.conf nginx.conf.bak,等价于cp nginx.conf nginx.conf.bak。第二条生成report_01.pdf到report_10.pdf,注意{01..10}会自动补零。
bash 4以上的版本还支持步长,比如echo {1..10..2}会输出1 3 5 7 9。RHEL 8和RHEL 9的bash版本都支持这个特性,可以放心用。
4.4 把通配符和花括号展开合起来用
理解两者区别的一个简单类比:通配符是“从磁盘上找已存在的文件”,花括号展开是“凭空生成一批字符串”。实际命令里它们经常一起出现。
比如想把/data/logs下所有.log文件备份成.log.bak:
for f in /data/logs/*.log; do cp "$f" "$f.bak"; done先由通配符选中文件,再通过变量展开生成新名字。少打不少字,而且循环里的双引号保证了文件名即使带空格也不会拆坏。
5. 别名、命令替换和引号规则:把长命令变成短命令
历史命令和补全解决的是“重复输入”,别名和命令替换解决的是“长命令本身的复杂程度”。日常服务器管理里,有些固定套路很长,每次敲一遍都苦不堪言,这时就该上别名和命令替换了。
5.1 别名:让短名字代表长命令
定义别名用alias:
alias ll='ls -l' alias grep='grep --color=auto' alias today='date +%F'查看当前所有别名直接执行alias,取消别名用unalias。
关键点是别名的生命周期。命令行里临时定义的别名只在当前shell有效,关掉终端就没有了。要想永久生效,得写进~/.bashrc,然后执行source ~/.bashrc加载一遍。
我自己在服务器上常用的几条:
alias untar='tar xzvf' alias ports='ss -ltnp' alias myip='curl -s ifconfig.me'注意一个容易翻车的点:别名在交互式shell里生效,但脚本里默认不会展开。如果写脚本时需要用到别名,必须显式开启shopt -s expand_aliases,而且定义别名的语句要在调用之前。更好的习惯是脚本里直接用完整命令,别依赖别名。
5.2 命令替换:把命令结果当作参数
命令替换的核心思想是“先执行括号里的命令,把输出结果放进当前命令里”。两种写法:
echo "今天日期: $(date +%F)" echo "今天日期: `date +%F`"推荐用$(...)。反引号是旧式写法,最大问题是嵌套困难,比如$(basename $(pwd))这种写法反引号几乎没法优雅实现,可读性也差。
实际运维里最常见的组合是kill $(pgrep xxx):
kill $(pgrep -u tomcat java)先执行pgrep找到进程号,再把结果作为kill的参数。这是“一条命令完成两步操作”的典型代表。
再举个例子,备份配置文件并带时间戳:
tar czf /backup/etc-$(date +%F).tar.gz /etc这里命令替换在文件名里展开成日期,自动生成类似etc-2025-04-27.tar.gz的文件,完全不用手动改名字。
5.3 引号:单引号和双引号的区别
命令替换看起来简单,但和引号结合起来就有很多坑。红帽这一章对引号规则考得很细。
- 双引号内部:
$、反引号、\仍然生效,所以echo "$HOME"会输出家目录路径。 - 单引号内部:所有字符都按字面理解,
echo '$HOME'输出$HOME。 - 不加引号:变量、命令替换、通配符都会执行展开,但有单词拆分风险。
最简单的记忆方法是:需要变量或命令结果参与拼接时用双引号;想把特殊字符原样输出时用单引号;文件操作里涉及空格时也要用双引号包住变量。
实际操作中,我见过不少人踩这个坑:
# 期望输出:今天是2025-04-27 echo "今天是$(date +%F)" # 如果误用了单引号 echo '今天是$(date +%F)'单引号版本会原样输出$(date +%F)这几个字符,而不会得到日期。考试里的问答题经常拿这个做陷阱,答题时要先看清楚用的是哪种引号。
5.4 一个综合场景串联三种能力
假设要清理一个占用8080端口的进程,传统思路是:先用ss -ltnp查端口,看PID,再kill。如果这条命令固定复用,可以结合别名和命令替换一步到位:
alias kill8080='kill $(ss -ltnp | awk "/:8080/{print \$NF}" | tr -d "pid=")'别名里用了命令替换,命令替换里又用了管道和awk。虽然写法长了点,但定义一次后,以后只要执行kill8080即可。这正好说明“别名+命令替换+引号规则”为什么经常放在一起考。
6. RH134第一章自测问答:做一遍比自己翻书强
这一章既然是知识点问答题,我把常见的考试题型和易错点集中成一份自测清单。每道题都能直接说破对应知识点,如果哪题卡住,说明对应章节还需要回头巩固。
查看历史命令列表用什么命令?执行历史里第302条命令怎么写?
history;!302。破题点:!n里的n是编号。想快速获取上一条命令的最后一个参数,有两种方式是什么?
!$和Alt+.。破题点:!$直接展开成最后一个参数。命令行输入到一半,想跳回行首重新修改,按什么?
Ctrl+A。同样高频的还有Ctrl+E跳到行尾。想删除从光标位置到行尾的所有内容,按什么?
Ctrl+K。删除到行首用Ctrl+U,删除前一个单词用Ctrl+W。想从历史记录中搜索刚才那条包含“nginx”的命令,按什么?
Ctrl+R,然后输入nginx,反复按Ctrl+R继续往前匹配。把
/data/logs目录下所有.log文件移动到/tmp,用通配符怎么写?mv /data/logs/*.log /tmp/。注意*不会匹配隐藏文件。一次生成
test01.txt到test10.txt,命令是什么?touch test{01..10}.txt。破题点:花括号展开自动补零。查看系统里所有已定义别名,用什么命令?
alias。取消单个别名用unalias 别名。想让自定义别名永久生效,需要写进哪个文件?
~/.bashrc,之后执行source ~/.bashrc或重新登录。用命令替换输出当前日期,推荐写法是什么?
echo $(date +%F)。推荐$()而不是反引号,便于嵌套。单引号和双引号在变量展开上的区别是什么?
双引号里$变量仍然展开,单引号里原样输出。发现历史记录被其他终端覆盖,解决办法是什么?
在~/.bashrc加上shopt -s histappend,让bash退出时追加而不是覆盖历史文件。
这十几道题覆盖了第一章八成以上的考点。我在备考时是先把这些题过一遍,再回到对应小节找自己的薄弱点,比闷头刷书效率高很多。
最后说一点备考之外的体会。这一章的内容不管是在之后的RH134课程,还是实际服务器运维里,都会反复用到。我在做后续章节的练习时,几乎所有服务配置实验都会用Ctrl+R召回命令、用Tab补全路径、用花括号展开批量建目录。把这些操作练成肌肉记忆,不只是为了考试,而是让后面的学习过程省出大量时间。真正开始做题以后你会感谢自己当时多练了这十几分钟。