我想忽略全部无论参数如何,都会调用我的 bash 历史记录中的命令。例如,要排除所有ls
、ls -l
和ls SOME_DIRECTORY
,我的理解是我需要这样做:
HISTIGNORE='ls:ls *'
我不能仅仅使用它,HISTIGNORE='ls*'
因为这也会忽略恰好以 开头的其他命令ls
,这是不可取的。但是,ls
当ls *
我将条目添加到HISTIGNORE
.
是否有一种模式可以用来单独匹配命令和有论据?
答案1
HISTIGNORE
模式匹配遵循 shell 选项的设置extglob
,并且通过扩展的通配符,您可以使用它来匹配ls
以空格开头并后跟任何其他内容或不接任何内容(行尾)的命令。
shopt -s extglob
HISTIGNORE='ls@( *|)'
bash 扩展 glob 的格式将与或@(foo|bar)
之一完全匹配。在这里,我们给出的模式是这样的,它将在行的开头匹配,然后是一个空格和 0 个或多个其他后续字符,或者根本不匹配任何字符。foo
bar
ls@( *|)
ls
这是在行动中:
$ shopt -s extglob
$ export HISTIGNORE='ls@( *|)'
$ history -c
$ ls > /dev/null
$ ls * > /dev/null
$ ls -la > /dev/null
$ ls file > /dev/null
$ lsa
-bash: lsa: command not found
$ history
1 lsa
2 history