Suppose we have this environment:
mkdir -p /tmp/foo/bar/
export TEST=/tmp/foo
Out of the box, bash completion of $TEST is extremely inconsistent. Witness: →
$ cd $TES<Tab> → $ cd $TEST<cursor>
$ cd $TEST<Tab> → $ cd $TEST<cursor>
$ cd $TEST/<Tab> → $ cd $TEST/<cursor>
$ cd $TEST/b<Tab> → $ cd $TEST/b<cursor> # no actual completion!
$ ls $TES<Tab> → $ ls $TES<cursor> # no actual completion!
$ ls $TEST<Tab> → $ ls $TEST<cursor> # same
$ ls $TEST/<Tab> → $ ls /tmp/foo/bar/<cursor> # expands var, annoying!
$ echo $TES<Tab> → $ echo $TEST <cursor> # with a space, annoying!
$ echo $TEST<Tab> → $ echo $TEST <cursor> # same
$ echo $TEST/<Tab> → $ echo /tmp/foo/bar/<cursor> # expands var, annoying!
Compare this with how e.g. tcsh does completion, which is always completing $TES to $TEST/ (if $TEST expands to a directory-name) or to $TEST (if it doesn’t) and never expanding anything. Which is, in my arrogant opinion, The Right Thing, and bash has it completely wrong.
So the question is obvious. Is it possible to make bash do The Right Thing too, and if so, how? I tried to understand the manual, but without much success.
Tab completion in Bash is extremely configurable and quite complex. If you are on Ubuntu, maybe note https://bugs.launchpad.net/ubuntu/+source/bash-completion/+bug/769866