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 4 8 Answers
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 direxpandGives 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.
10shopt -u progcompThis 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
4search _filedir() in the top level bash_completion script and change the line
compopt -o filenames 2>/dev/nullto
compopt -o filenames -o noquote 2>/dev/null 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 progcompIt worked on other commands, besides cd, preserving the variables instead of expanding them.
For those (like me) with 12.04 can use ~+ instead of $PWD...
for example :
cd /bin
echo ~+/ls
/bin/ls Even with the updated bash, I was finding $ still gets escaped.
- Removing the
bash-completion (1:2.1-3.fc20)package - or simply not sourcing
/etc/bashrcfrom~/.bashrcseemed to fix it.
I suspect I'll now be missing some features I'm normally used to but haven't noticed any yet.
Alternative (at least for Fedora 26), add export BASH_COMPLETION_VERSINFO=0 before sourcing /etc/bashrc. This makes the problematic script think its already been sourced.
Disabling the shell option 'complete_fullquote' does the job:
shopt -u complete_fullquote 2 If you do not care for programmable completion (usually installed by bash-completion), then any method mentioned here to disable those will do (like shopt -u progcomp).
If you want Bash to expand the variable when you type TAB, then shopt -s direxpand will do.
If you do not want to use shopt -s direxpand, and want to keep programmable completions from bash-completion, and you have root access, you can apply the same patch as Ubuntu applies, i.e. this patch.
If you do not have root access you can disable the system bash-completion (see bash-completion's README and install a patched version in your $HOME (download and extract the tarball and --configure --prefix=$HOME or similar)
EDIT the above is valid for Bash 4.4.19. It seems Bash 5.0 and above break the whole thing again...