善用Bash history 命令

善用Bash history 命令

原创 良许 良许Linux 善用Bash history 命令善用Bash history 命令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 是内置的命令

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

查看你的 Bash 命令历史记录

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

充分利用 history 命令

实际上,Bash 的 history 命令的功能远不止本文所提到的,但这是你习惯使用 history 命令的一个很好的开始,而不只仅是利用 history 来查看历史记录。要常用 history 命令,看看你只利用 history 命令而不输入具体的指令能完成多少事情,你会被惊艳到的。
最后,但愿本文对你的工做有所帮助,若是你对 history 命令还有疑问,或者你还知道 history 命令一些更有用的功能,请留言告诉我呗!

良许我的微信善用Bash history 命令

相关文章
相关标签/搜索