☰
RH134备考:提升Linux命令行效率的实战技巧
2026/9/28 5:58:29 网站建设 项目流程

备考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,正确的改法是:

  1. 按Ctrl+A跳到行首。
  2. 按Alt+F或Ctrl+F把光标移到dmops这个单词处。
  3. 按Ctrl+W删除光标前的整个单词,重新输入devops。
  4. 按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第一章自测问答:做一遍比自己翻书强

这一章既然是知识点问答题,我把常见的考试题型和易错点集中成一份自测清单。每道题都能直接说破对应知识点,如果哪题卡住,说明对应章节还需要回头巩固。

  1. 查看历史命令列表用什么命令?执行历史里第302条命令怎么写?
    history;!302。破题点:!n里的n是编号。

  2. 想快速获取上一条命令的最后一个参数,有两种方式是什么?
    !$和Alt+.。破题点:!$直接展开成最后一个参数。

  3. 命令行输入到一半,想跳回行首重新修改,按什么?
    Ctrl+A。同样高频的还有Ctrl+E跳到行尾。

  4. 想删除从光标位置到行尾的所有内容,按什么?
    Ctrl+K。删除到行首用Ctrl+U,删除前一个单词用Ctrl+W。

  5. 想从历史记录中搜索刚才那条包含“nginx”的命令,按什么?
    Ctrl+R,然后输入nginx,反复按Ctrl+R继续往前匹配。

  6. 把/data/logs目录下所有.log文件移动到/tmp,用通配符怎么写?
    mv /data/logs/*.log /tmp/。注意*不会匹配隐藏文件。

  7. 一次生成test01.txt到test10.txt,命令是什么?
    touch test{01..10}.txt。破题点:花括号展开自动补零。

  8. 查看系统里所有已定义别名,用什么命令?
    alias。取消单个别名用unalias 别名。

  9. 想让自定义别名永久生效,需要写进哪个文件?
    ~/.bashrc,之后执行source ~/.bashrc或重新登录。

  10. 用命令替换输出当前日期,推荐写法是什么?
    echo $(date +%F)。推荐$()而不是反引号,便于嵌套。

  11. 单引号和双引号在变量展开上的区别是什么?
    双引号里$变量仍然展开,单引号里原样输出。

  12. 发现历史记录被其他终端覆盖,解决办法是什么?
    在~/.bashrc加上shopt -s histappend,让bash退出时追加而不是覆盖历史文件。

这十几道题覆盖了第一章八成以上的考点。我在备考时是先把这些题过一遍,再回到对应小节找自己的薄弱点,比闷头刷书效率高很多。

最后说一点备考之外的体会。这一章的内容不管是在之后的RH134课程,还是实际服务器运维里,都会反复用到。我在做后续章节的练习时,几乎所有服务配置实验都会用Ctrl+R召回命令、用Tab补全路径、用花括号展开批量建目录。把这些操作练成肌肉记忆,不只是为了考试,而是让后面的学习过程省出大量时间。真正开始做题以后你会感谢自己当时多练了这十几分钟。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询