善用Bash history 命令

良许Linux

共 2951字,需浏览 6分钟

 · 2020-09-04


点击「阅读原文」查看良许原创精品视频。


大家好,我是良许

相信大家平时都有用 history 命令来查看命令历史记录,但是实际上 history 命令并非只有这个功能,history 还有很多有用的功能。尤其是 Bash 版本的 history 命令,它所提供的功能比所有其他的 Linux Shell history 命令所提供的都要多。

Bash 的历史悠久,是一个古老的 Shell ,并且它还有一个更古老的前身 the Bourne Shell (sh) 。因此,Bash 的 history 命令是所有的 Linux Shell history 命令中功能最丰富的。Bash 版本的 history 命令不仅支持反向搜索、快速调用,还支持重写历史记录等等功能。

善用 Bash history 命令以上的这些功能都可以提高你的工作效率,因此,让良许为你一一讲解 Bash history 命令以及它常用的功能:

history 是内置的命令

history 命令与许多其他的命令不同。你可能习惯于命令都作为可执行文件放置在常见的系统级的位置,例如 /usr/bin/usr/local/bin〜/ bin。但是,内置的 history 命令并不在你的环境变量 PATH 保存的路径中的。

实际上,history  命令并没有保存在物理位置中:

$ which history
which: no history in [PATH]

history 其实是 Shell 本身的一个内置函数:

$ type historyhistory is a shell builtin$ help historyhistory: history [-c] [-d offset] [n] orhistory -anrw [filename] orhistory -ps arg [arg...]
Display or manipulate the history list.[...]

由于 history 是 Shell 的内置函数,所以每种 Shell 的 history 函数都是独一无二的。因此,你在 Bash 中能使用的功能可能无法在 Tcsh,Fish 或 Dash 中使用,同样的,在 Tcsh,Fish 或 Dash 中能使用的功能也可能无法在 Bash 中使用。

查看你的 Bash 命令历史记录

history 命令最基本,最频繁的用法就是查看你的 Shell 会话的命令历史记录:

$ echo "hello"hello$ echo "world"world$ history  1  echo "hello"  2  echo "world"  3  history

事件提示符

事件提示符 (!) 是按事件搜索历史记录的。这里的事件,指的是每一条记录在历史记录里的命令。换句话说,它就是一行命令,并被数字索引标记着以供引用。

要重新运行历史记录中的一个命令,用 ! 直接加上 (无空格) 你想要运行的命令前面的索引数字即可。例如,假设历史记录中的第一条指令是 echo hello ,然后你想重新运行它:

$ !1echo "hello"hello

你还可以通过从历史记录中的当前位置开始提供负数的行来使用相对定位。例如,返回历史记录中倒数第3条命令:

$ echo "alvin"alvin$ echo "hello"hello$ echo "world"world$ !-3echo "alvin"alvin

如果你只想返回上一条命令,你可以使用简写 !! 来替代 !-1。这整整节省了一次按键的时间!!!

$ echo "alvin"alvin$ !!echo "alvin"alvin

字符串搜索

你也可以通过特定的字符串来搜索历史记录中的命令并运行它。

若是想要搜索以特定字符串开头的命令,就用 ! 直接加上 (无空格) 你想要搜索的字符串:

$ echo "alvin"alvin$ true$ false$ !echoecho "alvin"alvin

你还可以搜索在任意位置包含特定字符串的命令。要做到这点,你只需要用 ! 直接加上前后两端都被 ? 包围的特定字符串即可,像这样:

$ echo "alvin"alvin$ true$ false$ !?alvin?echo "alvin"alvin

如果你知道你想要搜索的字符串在命令的最后面,那就可以省略字符串后面的 ?,像这样:

$ echo alvinalvin$ !?alvinecho alvinalvin

值得注意的是,若是历史记录中包含目标字符串的命令不止一条,则它只会执行符合条件的命令中最后的一条:

$ echo "hello world"hello world$ echo "hello alvin"hello alvin$ !?hello?echo "hello alvin"hello alvin

字符串替换

你可以搜索一个特定的字符串并用新字符串替换它,从而更改命令:

$ echo "hello"hello$ echo "world"world$ ^hello^alvinecho "alvin"alvin

但是它只能替换第一次出现的目标字符串,若是命令中出现两次目标字符串,则只有第一次出现的会被替换,像这样:

$ echo "hello hello"hello hello$ ^hello^alvinecho "alvin hello"alvin hello

与字符串搜索一样,当历史记录中包含目标字符串的命令不止一条时,只替换并执行最后一条:

$ echo "hello world"hello world$ echo "hello"hello$ ^hello^alvinecho "alvin"alvin

充分利用 history 命令

实际上,Bash 的 history 命令的功能远不止本文所提到的,但这是你习惯使用 history 命令的一个很好的开始,而不仅仅是利用 history  来查看历史记录。要经常使用 history 命令,看看你只利用 history 命令而不输入具体的指令能完成多少事情,你会被惊艳到的。

最后,希望本文对你的工作有所帮助,如果你对 history 命令还有疑问,或者你还知道 history 命令一些更有用的功能,请留言告诉我呗!


良许个人微信


添加良许个人微信即送3套程序员必读资料


→ 精选技术资料共享

→ 高手如云交流社群





本公众号全部博文已整理成一个目录,请在公众号里回复「m」获取!

推荐阅读:

哈哈哈,Chrome 被黑的最惨一次

如何在Ubuntu系统中重置root密码

终于,百度网盘等来了真正的对手


5T技术资源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,单片机,树莓派,等等。在公众号内回复「1024」,即可免费获取!!


浏览 3
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报