如何让bash在选项卡完成期间停止转义$?

ket*_*urn 68 command-line bash

我在命令行上有这个:

ln -sf $PWD/wine-
Run Code Online (Sandbox Code Playgroud)

然后我点击Tab完成文件名。在早期版本的 Ubuntu 中,这可以很好地完成wine-文件名(并且$PWD在当时会扩展副作用)。但现在它变成了

ln -sf \$PWD/wine-
Run Code Online (Sandbox Code Playgroud)

这根本不是我的意思,也没有完成任何事情,因为该文件并不是从字面上开始的 $.

我如何完成恢复到较少损坏的行为?

set 告诉我这些是我当前的设置:

BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
Run Code Online (Sandbox Code Playgroud)

Pet*_*rch 67

我发现bash 版本 >= 4.2.29有一个新的direxpandshopt 设置。(看看man docs/bash.1你是否检查了一个新的 bash,或者从 8951 行查看bash.1

如果使用 Quantal Quetzal 12.10 或以其他方式获取(或检出并构建)一个新的 bash,则:

shopt -s direxpand
Run Code Online (Sandbox Code Playgroud)

给我我想要、需要和爱的行为。

解决方法:在此期间Ctrl+ Alt+ E,而不是Tab我想要做什么了。但是很别扭。

顺便说一句,有几个线程称为“bash tab 变量扩展问题?” 在gnu.bash.bug 中。通过阅读它们,我在这里找到了信息。

  • 如果我没有扩展我的大路径并且可以继续使用未转义的变量完成会更好。 (15认同)
  • 下面 user3080602 的回答对我有用 - `shopt -u progcomp` 解决了这个问题,而无需将变量扩展到它的值 (5认同)
  • 带有 direxpand 的 bash 版本正在进入 Precise (12.04):见 https://bugs.launchpad.net/bugs/778627 (2认同)

小智 20

shopt -u progcomp
Run Code Online (Sandbox Code Playgroud)

这为我修复了它,它还删除了许多“智能”完成选项,我发现这些选项妨碍了我不完成我知道在那里的文件,因为愚蠢的事情认为我不希望它们作为特定的参数命令。ARRRGH

  • 我还失去了对 git tab-completion 的支持(例如 `git checkout ` + Tab,用于分支名称)。否则,这很好。 (2认同)

小智 6

_filedir()在顶级 bash_completion 脚本中搜索并更改行

compopt -o filenames 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

compopt -o filenames -o noquote 2>/dev/null
Run Code Online (Sandbox Code Playgroud)


小智 5

在 GNU bash 版本 4.2.46(2)-release 上,选项complete_fullquotenoquote不可用。该cdable_vars选项仅适用于cddirexpand展开变量。

对我来说最有效的是:

shopt -u progcomp
Run Code Online (Sandbox Code Playgroud)

除此之外,它还适用于其他命令,cd保留变量而不是扩展它们。