bash 自动补全转义 $

Din*_*esh 8 bash bash-completion

在 shell ( GNU bash, version 4.2.47(1)-release (x86_64-suse-linux-gnu)) 中,当我点击 tab 进行自动补全时,“$”在变量名补全后被转义,但如果没有补全,那么它只会响铃。例如

$ ls $JDK_H<tab>
Run Code Online (Sandbox Code Playgroud)

结果是

$ ls \$JDK_HOME (with a trailing space)
Run Code Online (Sandbox Code Playgroud)

在旧的 GNU bash 版本 3.2.51(1)-release (x86_64-suse-linux-gnu) 上,它在完成后没有转义“$”,这正是我想要的。

有没有一种方法可以让旧的行为没有强烈的副作用?我的 BASHOPTS 和 SHELLOPTS 是:

# (indented for readability)
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extglob:extquote
            :force_fignore:histappend:interactive_comments:login_shell
            :progcomp:promptvars:sourcepath
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history
            :interactive-comments:monitor
Run Code Online (Sandbox Code Playgroud)

谢谢。我正在使用 SLES SP11。

- 更新。其他完成似乎照常工作,例如cdecho不转义$. 我也暂时注释掉了/etc/share/bash-completion/bash_completion我的/etc/bash.bashrcwhich,阻止了$逃逸。所以这看起来像是某种完整的配置问题。

pyn*_*exj 6

最近的 bash 版本引入了一些与此相关的兼容性问题。尝试这样:

complete -r # temporarily disable all completion rules
shopt -s direxpand
Run Code Online (Sandbox Code Playgroud)

bug-bash邮件列表中报告的类似问题的链接: