揭开UNIX高手的那些重大秘密(3) - 51CTO.COM
来源:百度文库 编辑:神马文学网 时间:2024/06/30 20:58:01
揭开UNIX高手的那些重大秘密(3)
使用历史记录重写如果您经常在 shell 提示符中花费大量时间,保存 shell 历史记录可以节约时间和输入。但是如果历史记录不能被修改,就会导致一些麻烦:记录重复的命令,且多个 shell 实例可能会干扰各自的历史记录。这两个问题很容易解决,只需在您的 .bashrc 中添加两行:
export HISTCONTROL=ignoreboth shopt -s histappend
第一行将移除您的 shell 历史记录中连续的重复命令。如果您想移除所有零散的副本,可将 ignoreboth
更改为 erasedups
。第二行在 shell 退出时将 shell 的历史记录附加到您的记录文件。默认情况下,Bash 记录文件命名为 ~/~/.bash_history (不错,这是一个点文件)。可以通过设置 HISTFILE(不错,这是一个环境变量)来更改它的位置。如果您想将一个 shell 的最近 10,000 命令保存在一个包含 100,000 条目的记录文件中,将 export HISTSIZE=10000 HISTFILESIZE=100000
添加到您的 shell 启动文件中。要查看一个 shell 的历史记录,在任意提示处键入 history
即可。
如果不能调用,那么保存的命令历史记录就用处不大。而这正是 shell !
(或 bang)操作符的作用所在:
!!
("bang bang") 完整地重复最后一条命令。!:0
是前一条命令的名称。!^
是前一条命令的第一个参数。!:2
、!:3
...!$
等命令是前一条命令的第二、第三......以及最后一个参数。!*
是最后一条命令的所有参数,命令名除外。!n
重复历史中编号为n
的命令。!handle
重复以handle
中的字符开始的最后一条命令。例如,!ca
将重复以字符ca
开始的最后一条命令,如cat README
。!?handle
重复包含handle
中的字符组成的字符串的最后一条命令。例如,!?READ
还会匹配cat README
。^original^substitution
使用substitution
替换original
的第一个 实例。例如,如果前一条命令是cat README
,,命令^README^license.txt
将生成一条新命令cat license.txt
。!:gs/original/substitution
将使用substitution
替换original
的所有 实例(!:gs
表示 “全局替换[global substitution]”)。!-2
是倒数第二条命令,!-3
是倒数第三条命令,以此类推。
您甚至可以合并历史表达式来生成 !-2:0 -R !^ !-3:2
这样的 “魔汤”,该命令将扩展为倒数第二条命令的名称,加上 -R
,再加上前一条命令的第一个参数,以及倒数第三条命令的第二个参数。要使这样的神秘命令更具可读性,可以在键入时扩展历史参考。在任意提示符键入命令 bind Space:magic-space
,或者将其添加到一个启动文件,从而将空格键绑定到函数 magic-space,该函数将扩展内联历史替换。