History 命令


你敲的每一个命令都会被忠实地记录下来 —- 我.


上面说的也不完全对啦, 因为这个"忠实"会被各种方法破解…

首先你要有一个历史记录的概念, 然后你要知道这些记录存放到哪儿, 最后你要知道这些记录可以被删除, 修改.

搜索历史命令

快捷键 Ctrl + r

非常建议你使用这个命令, 因为当你曾经输过一个很长的命令之后, 当你再次想输入这个命令的时候, 你就可以按下这个快捷键, 然后键入那条长命令的关键词, 然后就会显示出含有那个关键词的命令, 每次按下这个键都会再往上搜一个.

( 还有一些其他的快捷键, 在我的博客上: HERE)

重复上一次的命令

  • 向上的方向键
  • 两个叹号: !!
  • 还有这个: !-1
  • 快捷键Ctrl+p
    最好用的还是方向键, 不是么~

从历史记录中执行某个命令

还是沿袭上一个中的!-n模式, 其中n是一个编号.

  1. # history | more
  2. 1 service network restart
  3. 2 exit
  4. 3 id
  5. 4 cat /etc/redhat-release
  6. # !4
  7. cat /etc/redhat-release

作者给出的例子中, 执行了编号为4的命令.

执行曾经的命令中特定开头的

假设你的部分历史命令如下:

  1. 1719 find . -type f
  2. 1720 find . -type f | cpio -o > test.cpio
  3. 1721 find . | cpio -o > test.cpio
  4. 1722 ls
  5. 1723 l
  6. 1724 du -h

那么, 怎样重复执行1721条呢? 除了利用!-1721这么麻烦的方法, 我们还可以用!f这样的姿势.

因为开头的f是离着最后一条命令最近的, 所以!f就执行了它.

清空历史记录

  1. history -c

从历史记录中截取参数

在下面的例子中, !!:$ 等价于上一条命令的最后一个参数:

  1. # ls anaconda-ks.cfg
  2. anaconda-ks.cfg
  3. # vi !!:$
  4. vi anaconda-ks.cfg

下面的例子中, !^则等价于上一条命令的第一个参数:

  1. # cp anaconda-ks.cfg anaconda-ks.cfg.bak
  2. anaconda-ks.cfg
  3. # vi !^
  4. vi anaconda-ks.cfg

从特定的历史记录中截取特定的参数

下面的例子中, !cp:2 等价于当前历史记录中, 最后一个以cp开头的命令的第二个参数; !cp:$则等价于当前历史记录中最后一个以cp开头的命令的最后一个参数.

是不是有点啰嗦…

  1. # cp ~/longname.txt /really/a/very/long/path/long-
  2. filename.txt
  3. ... ... ...
  4. # ls -l !cp:2
  5. ls -l /really/a/very/long/path/long-filename.txt
  6. # ls -l !cp:$
  7. ls -l /really/a/very/long/path/long-filename.txt