大家好,我是良许

相信大家平时都有用 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 history
history is a shell builtin
$ help history
history: history [-c] [-d offset] [n] or
history -anrw [filename] or
history -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 ,然后你想重新运行它:

$ !1
echo "hello"
hello

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

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

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

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

字符串搜索

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

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

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

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

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

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

$ echo alvin
alvin
$ !?alvin
echo alvin
alvin

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

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

字符串替换

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

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

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

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

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

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

充分利用 history 命令

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

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


公众号:良许Linux

有收获?希望老铁们来个三连击,给更多的人看到这篇文章

善用Bash history 命令的更多相关文章

  1. Linux Shell基础 Bash常见命令 history、alias命令以及常用快捷键

    概述  shell中常见命令history 历史纪录命令:history 命令格式如下: [root@localhost ~]# history [选项] [历史命令保存文件] -c:清空历史命令: ...

  2. 『忘了再学』Shell基础 — 4、Bash基本功能(history命令)

    目录 1.history历史命令 2.设置命令历史记录的条数 3.清空历史命令 4.历史命令的调用 5.命令与文件的补全 在Linux系统中默认的Shell就是Bourne-AgainShell(简称 ...

  3. Linux下history命令用法

    如果你经常使用 Linux 命令行,那么使用 history(历史)命令可以有效地提升你的效率.本文将通过实例的方式向你介绍 history 命令的 15 个用法. 使用 HISTTIMEFORMAT ...

  4. history命令详解

    Linux下history命令用法 ^_^在项目中希望调用history命令来获取用户的历史记录,方便分析,可是我们平时所见到的history结果是下面这样: # history | head -10 ...

  5. linux下history命令显示历史指令记录的使用方法

    Linux系统当你在shell(控制台)中输入并执行命令时,shell会自动把你的命令记录到历史列表中,一般保存在用户目录下的.bash_history文件中.默认保存1000条,你也可以更改这个值 ...

  6. history and its relevant variables in Linux/GNU and Mac OS history命令以及相关环境变量

    对于Terminalor们,history命令并不陌生,什么!n, !!更是很常用的,而且您在命令行敲的cmds是默认保存在/home/$USER/.bash_history(linux) /User ...

  7. bash内部命令-2

    http://www.gnu.org/software/bash/ http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/ [root@250-shiyan ~]# ...

  8. Linux下history命令详解---转载

    Linux下History命令主要用于显示历史指令记录内容, 下达历史纪录中的指令 . >History命令语法:[www.linuxidc.com@linux]# history [n][ww ...

  9. Linux history命令

    history命令主要用于显示历史命令, 重新执行历史命令. Linux系统当你在shell(控制台)中输入并执行命令时,shell会自动把你的命令记录到历史列表中,一般保存在用户目录下的.bash_ ...

随机推荐

  1. 认识SpringData JPA

    简介 JPA全称Java Persistence API,中文名是Java持久层API.用来描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. 名词解释 RDS:关系型数据库服务 Re ...

  2. Python自动化爬取App数据

    基本环境配置 版本:Python3 系统:Windows 需要安装: 1.JDK - Download JDK,Appium要求用户必须配置JAVA环境, 否则启动Seesion报错. 很多人学习py ...

  3. Python3 网络爬虫:漫画下载,动态加载、反爬虫这都不叫事

    一.前言 作者:Jack Cui 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那 ...

  4. 打破你的认知!Java空指针居然还能这样玩,90%人不知道…

    相信在座的各位都遇到过空指针异常,不甚其烦,本文不是教你避免空指针,而是一些对空指针其他方面的理解. 本文可能有点另类,也可能会打破你对空指针的认知. 1.null.method() 空指针? 我们知 ...

  5. Django中的ORM如何通过数据库中的表格信息自动化生成Model 模型类?

    Inspectdb Django项目通过绑定的数据库中的相应表格直接自动化生成Model 模型类 python manage.py inspectdb Django 中的 ORM 可以实现对象关系映射 ...

  6. C#LeetCode刷题-树状数组

    树状数组篇 # 题名 刷题 通过率 难度 218 天际线问题   32.7% 困难 307 区域和检索 - 数组可修改   42.3% 中等 315 计算右侧小于当前元素的个数   31.9% 困难 ...

  7. Probabilistic PCA、Kernel PCA以及t-SNE

    Probabilistic PCA 在之前的文章PCA与LDA介绍中介绍了PCA的基本原理,这一部分主要在此基础上进行扩展,在PCA中引入概率的元素,具体思路是对每个数据$\vec{x}_i$,假设$ ...

  8. # c++运算符重载之 前置++, 后置++, 负号运算符, 类型转换函数, 以及输入输出运算符

    c++运算符重载之 前置++, 后置++, 负号运算符, 类型转换函数, 以及输入输出运算符 标签(空格分隔): c++ 前言 我在c++学习的过程中, 对这几个不太常见的运算符重载不太会写.出现了很 ...

  9. Vue-Router 基础入门教程

    Vue-Router 基础入门教程 前言 这周的计划是用VUE将之前的小demo的前端给重构了,并且做成前后端分离的样式,因为之前的那个聊天室的demo几乎都是在一个路由上完成的,所以学习Vue-ro ...

  10. 实战开发,使用 Spring Session 与 Spring security 完成网站登录改造!!

    上次小黑在文章中介绍了四种分布式一致性 Session 的实现方式,在这四种中最常用的就是后端集中存储方案,这样即使 web 应用重启或者扩容,Session 都没有丢失的风险. 今天我们就使用这种方 ...