History 扩展

用这个功能可以选择特定的历史记录, 不论是修改还是立即执行, 都可以完成.

这个扩展以!(叹号)开头.

  • !! 重复上一条命令
  • !10 重复历史记录中第10条命令
  • !-2 重复历史记录中倒数第二条命令
  • !string 重复历史记录中最后一条以string开头的命令
  • !?string 重复历史记录中最后一条包含string的命令
  • ^str1^str2^ 把上一条命令中的str1替换成str2, 然后再执行
  • !!:$ 扩展成上一条命令的最后一个参数 ( 完全可以用Alt+.快捷键啊! )
  • !string:n 扩展成最后一条以string开头的命令的第n个参数….

!?string栗子

假设你曾经执行过这样一条命令:

  1. $ /usr/local/apache2/bin/apachectl restart

然后过了一会儿你想重复这个命令, 然后你这样做:

  1. $ !apache
  2. -bash: !apache: event not found

哔~ 找不到!

当然, 因为曾经的那条命令并不是以apache开头的, 但是:

  1. $ !?apache
  2. /usr/local/apache2/bin/apachectl restart

这样就会执行, 因为这条命令包含了apache这个字.

^str1^str2^栗子

作者给的例子太牵强, 我给个实用的:

  1. cat cal_random.sh
  2. #!/bin/bash
  3. echo hi
  4. test(){
  5. for i in {1..9};do
  6. echo $i;
  7. done
  8. }
  9. ... ... ...
  10. exit 0
  11. ^cat^less
  12. less cal_random.sh

哈, 这个也不实用, 因为要达到这样的目的有好多方法, 而替换这一种实在太麻烦了.

!!:$栗子

废话不说, 上代码 ~!

  1. cp cal_random.sh cal_random.sh.bak
  2. head -n 2 !!:$
  3. head -n 2 cal_random.sh.bak
  4. #!/bin/bash
  5. echo hi

在这个例子中, !!:$被扩展成了上一条命令的最后一个参数, 可以理解为正则的$表示最后一样.

!string:n 栗子

曾经执行了这样一条命令

  1. cat file1 file2 file3

然后你想截取其中的第二个参数,

那么你就可以这样(确保最后一条以cat开头的命令是它):

  1. ls !cat:2

上面这些东西用好了真的很方便! 尽管我一直用快捷键…