How to get bash to stop escaping $ during tab completion?
I have this on the command line:
ln -sf $PWD/wine-
and then I hit Tab to complete the filename. In earlier versions of Ubuntu, this worked just fine to complete the wine-
filename (and as a side-effect $PWD
would be expanded at that time). But now it turns it in to
ln -sf \$PWD/wine-
which isn't what I meant at all and doesn't complete anything as the file does not literally start with $
.
How do I get completion back to the less broken behaviour?
set
tells me these are my current settings:
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
Solution 1:
I've found that bash versions >= 4.2.29 have a new direxpand
shopt setting. (See man docs/bash.1
if you check out a new bash, or see bash.1 from line 8951)
If one uses Quantal Quetzal 12.10 or otherwise gets hold of (or checks out and builds) a new bash, then:
shopt -s direxpand
Gives me the behavior I want, need and love.
Workaround: In the meantime, Ctrl+Alt+E instead of Tab does what I want too. But is awkward.
BTW, There are several threads called "bash tab variable expansion question?" in gnu.bash.bug. From reading them, I found the info here.
Solution 2:
shopt -u progcomp
This fixed it for me, it also removed a lot of "intelligent" completion options which I have found get in the way by not completing files that I know are there because the stupid thing thinks I don't want them as arguments to a particular command. ARRRGH
Solution 3:
search _filedir()
in the top level bash_completion script and change the line
compopt -o filenames 2>/dev/null
to
compopt -o filenames -o noquote 2>/dev/null
Solution 4:
On GNU bash, version 4.2.46(2)-release, the options complete_fullquote
and noquote
aren't available. The cdable_vars
option works on cd
only; direxpand
expands the variable.
What worked best for me was:
shopt -u progcomp
It worked on other commands, besides cd
, preserving the variables instead of expanding them.