Bash 的声明 -p HISTIGNORE 使 bash 停止!为什么?

Tim*_*ske 4 bash command-history glob

在 GNU bash,版本 4.2.45(1)-release (x86_64-redhat-linux-gnu),Fedora 19 中执行以下代码...

shopt -s extglob
export HISTIGNORE="!(+(!([[\:space\:]]))+([[\:space\:]])+(!([[\:space\:]])))"
declare -p HISTIGNORE
Run Code Online (Sandbox Code Playgroud)

... 使 bash 完全停止。此后它不会打印命令提示符。这是为什么。

背景:

我只想告诉 bash 忽略任何简单的命令,即一个单词的命令。Bash 不应该记住像cd, pwd,history等命令行。我对HISTIGNORE变量的原始定义如下所示:

export HISTIGNORE="!(+(!([[:space:]]))+([[:space:]])+(!([[:space:]])))"
Run Code Online (Sandbox Code Playgroud)

\在每个:冒号字符之前添加了一个反斜杠字符,因为根据bash信息页面,后者将每个(扩展的)shell glob,即模式与另一个分开。不转义单个模式没有任何效果,一个简单的命令仍然使它成为历史。

Gil*_*il' 6

你的模式很复杂。否定正则表达式往往在正则表达式的大小上具有指数行为,并且在否定中存在否定,这可能导致双指数。乌尔普。

尽管如此,如此长时间的冻结是不可取的。我在 Debian 上使用 bash 4.2.37 在 Debian 上观察到相同的行为,因此将其报告为上游错误。但是要准备好被告知,要使这种边缘情况有效,工作量太大而收益太少。

同时,我怀疑该模式是否真的符合您的要求。有一种更简单的方法可以忽略单字命令:

HISTIGNORE='+([a-z])'
Run Code Online (Sandbox Code Playgroud)

如果您想忽略名称中包含其他字符的罕见命令,或者您想忽略空格,请调整此项。例如:

HISTIGNORE=$'*([\t ])+([-%+,./0-9\:@A-Z_a-z])*([\t ])'
Run Code Online (Sandbox Code Playgroud)

请注意,您不需要也确实不应该 export HISTIGNORE。这是一个 bash 内部变量,而不是一个环境变量。