在本章中,您将学习如何利用您的 shell 历史来避免重复输入已经运行过的命令。您还将看到如何通过 shell 配置文件自定义 shell 的行为或外观。最后,我们将向您展示在命令提示符下编辑和修改命令最有用的快捷方式。总而言之,本章将使您在命令行上变得非常快速。
我们将通过介绍以下主题来实现这一点:
Shell 历史使用 ! 执行先前的命令跳转到行首或行尾让我们首先了解 shell 历史。

Shell 历史 大多数 shell 都保留了您运行过的命令的历史记录。这意味着您只需按箭头键就可以查看您运行过的所有成功命令:上箭头键可以回退一个命令,下箭头键可以向前一个命令。像这样滚动您的 shell 历史记录非常有用,特别是当您发现您经常重新运行类似的命令时。
请注意,您也可以像这样编辑命令:使用左箭头和右箭头导航到文本行,它是一个命令,然后直接键入以编辑该命令。
编辑后的命令将添加到您的 shell 历史的末尾(它实际上并没有修改历史中保存的行)。
这些技巧结合在一起,使您能够轻松地回退并重新执行或修改以前的命令。
Shell 配置文件 我们将讨论的一些技巧需要更改 shell 的配置文件。工作流程通常如下:
在 shell 的配置文件中更改您想要更改的选项。保存文件。打开一个新的 shell 会话以查看更改。对于现有的 shell 会话,通过运行命令来重新读取您的 shell 配置文件:source ~/path/to/config/file。以下是最常见的 shell 的位置:
常见 shell
配置文件位置
Bash
~/.bashrc(交互式会话,例如您从图形环境中打开一个新的终端窗口时获得的会话。如果您在工作机器上更改配置,您几乎总是想要这个。这里的“交互式”指的是您作为用户在终端中使用 shell 的情况,而不是运行脚本(例如,由 cron 作业自动调用的脚本)。当您处于某种终端中,手动输入提示并编写命令时,您就在“交互式 shell”中。)<br>~/.bash_profile(登录 shell ——这可能是本地登录,但也是您通过 SSH 登录时获得的。同样,这是与运行脚本时的 shell 实例相比较。)
Zsh(Z shell)
~/.zshrc
历史文件 不同的 shell 在不同的地方保留历史文件,大多数可以配置更改位置。默认情况下,您几乎总是使用 Bash,默认情况下,它将其历史文件保留在 ~/.bash_history。
如果您不确定在哪里找到 shell 历史文件,许多 shell 都有一个名为 HISTFILE 的 shell 配置选项,其中包含历史文件的位置。
在这里,我在运行 zsh OS 时检查我的历史文件在哪里:
% echo $HISTFILE/home/dcohen/.zsh_history
Bash 有两个配置选项,可以防止您的历史文件无限增长,以保持其大小可控和历史搜索快速:
HISTSIZE 控制保存在内存中的最大历史记录HISTFILESIZE 控制在 shell 会话之间保存的历史文件的最大大小如果您想增加 Bash 保留的历史记录量,请在 shell 的配置文件中同时增加上述两个选项。
为此,请打开 shell 的配置文件(例如,~/.bashrc)并通过在文件末尾添加以下行来设置这些变量:
export HISTSIZE=1000export HISTFILESIZE=5000
搜索 shell 历史 您经常会发现自己在寻找一周(或一个月)前运行的命令。那个命令可能在您的历史的更后面,按上箭头数百次到达那里将浪费时间。如果您对您要查找的内容至少有一些概念,交互式 shell 历史搜索是您正在寻找的技巧。以下是如何搜索您的 shell 历史记录:
按 CTRL + R 调用反向搜索。输入您要查找的命令的一部分。您的 shell 将尝试将您输入的字符与您的命令历史匹配,并找到最接近、最近的匹配项。连续按 CTRL + R 遍历历史记录。按 ENTER 选择命令或按 Esc 退出此模式。如果您不小心跳过了您想要的命令,CTRL + SHIFT + R 将向前搜索下一个最近的匹配项。例外 根据您使用的 shell 和配置,此功能有一些例外。
一些 shell 会忘记以错误失败的命令(以非零退出代码退出)。许多 shell 还会忘记以空格字符开头的命令 —— 这些不会被添加到 shell 的历史中。然而,在两种情况下,如果您立即回退(上箭头),通常仍然能够访问历史记录项,而无需执行任何其他命令。
使用 ! 执行先前的命令 使用感叹号执行先前的命令。有多种使用此技巧的方法,我们下面将看看。
使用相同的参数重新运行命令 感叹号命令 ! 将使用上一次的参数执行最后一个命令。例如,!ssh 将回退并找到您上次运行的最后一个 ssh 命令,并使用相同的参数执行它。您可以使用此方法重新运行您经常使用相同参数的命令,例如快速重新连接到您每天连接的 SSH 服务器。
在历史中添加命令前缀 感叹号 !! 将执行您运行的最后一个命令,但是在它前面加上一些其他命令。这听起来可能有些奇怪,但它非常有用,适用于您在没有 sudo 的情况下意外运行需要 root 权限的命令的情况。
apt-get install nginx # 由于权限错误而失败sudo !!# 这是运行的命令:sudo apt-get install nginx
在上述命令因权限不足而失败后,只需运行 sudo !! 就可以在开头加上 sudo 重新运行它。
注意 为了安全起见,不要养成自动习惯:始终确保您知道为什么一个命令需要更多权限,并问问自己是否足够信任它,以给它在您的系统上做任何事情的权限。不小心使用 sudo 可能会使事情变得容易出错,或者允许攻击者在您的系统上获得立足点。
跳转到当前行的开头或结尾 在编辑时,通常需要跳转到行首以更正命令的拼写或添加必需的参数。要做到这一点,请按 CTRL + A。
同样,要跳回行尾,请使用 CTRL + E。
这两个经常会非常有用。
结论 在 Linux shell 环境中工作涉及大量的输入。即使在构建和编辑命令时对速度和准确性做出最小的改进,也能使您感觉基本任务花费的时间从永远变为像经验丰富的 Unix 高手一样快速前进。
本章分享的技巧是我们日常工作中一些最常见和最强大的快捷方式。将您新学命令历史搜索技能与您刚刚学到的编辑和命令修改快捷方式结合起来,将对您在命令行上的舒适度、效率和速度产生巨大影响。