![有没有一种简单的方法可以避免在 bash 的 HISTIGNORE 中重复命令?](https://linux22.com/image/202864/%E6%9C%89%E6%B2%A1%E6%9C%89%E4%B8%80%E7%A7%8D%E7%AE%80%E5%8D%95%E7%9A%84%E6%96%B9%E6%B3%95%E5%8F%AF%E4%BB%A5%E9%81%BF%E5%85%8D%E5%9C%A8%20bash%20%E7%9A%84%20HISTIGNORE%20%E4%B8%AD%E9%87%8D%E5%A4%8D%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
我想忽略全部无论参数如何,都会调用我的 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