原创 良许 良许Linux shell
点击「阅读原文」查看良许原创精品视频。微信
你们好,我是良许
相信你们平时都有用 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 命令以及它经常使用的功能:ide
history 命令与许多其余的命令不一样。你可能习惯于命令都做为可执行文件放置在常见的系统级的位置,例如 /usr/bin,/usr/local/bin 或 〜/ bin。可是,内置的 history 命令并不在你的环境变量 PATH 保存的路径中的。
实际上,history 命令并无保存在物理位置中:函数
$ which history which: no history in [PATH]
history 实际上是 Shell 自己的一个内置函数:ui
$ 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 中使用。code
history 命令最基本,最频繁的用法就是查看你的 Shell 会话的命令历史记录:视频
$ echo "hello" hello $ echo "world" world $ history 1 echo "hello" 2 echo "world" 3 history
事件提示符 (!) 是按事件搜索历史记录的。这里的事件,指的是每一条记录在历史记录里的命令。换句话说,它就是一行命令,并被数字索引标记着以供引用。
要从新运行历史记录中的一个命令,用 ! 直接加上 (无空格) 你想要运行的命令前面的索引数字便可。例如,假设历史记录中的第一条指令是 echo hello ,而后你想从新运行它:blog
$ !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
实际上,Bash 的 history 命令的功能远不止本文所提到的,但这是你习惯使用 history 命令的一个很好的开始,而不只仅是利用 history 来查看历史记录。要常用 history 命令,看看你只利用 history 命令而不输入具体的指令能完成多少事情,你会被惊艳到的。
最后,但愿本文对你的工做有所帮助,若是你对 history 命令还有疑问,或者你还知道 history 命令一些更有用的功能,请留言告诉我呗!
良许我的微信