Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I've long set my most-recently visited directories to shell variables d1, d2, etc.

On an ancient Fedora machine I could type a command like

$ cp $d1/

and the shell would replace $d1 with text like /home/acctname/projects/blog/ and would then show me the contents of .../blog, like you would expect any tab-completion to do.

Now, both ubuntu wheezy/sid and fedora 16 just \-escape the '$', and naturally there are no completions to show.

You can see this behavior in action in an OSX Terminal window. On 10.8, do something like

ls $HOME/ to see what I mean.

Is there a bash shell variable or option that can restore the old behavior?

man bash suggests this is a bug:

   complete (TAB)
          Attempt  to  perform  completion  on  the  text  before  point.  Bash
          attempts completion treating the text as  a  variable  (if  the  text
          begins  with  $),  username (if the text begins with ~), hostname (if
          the text begins with @), or command (including aliases and functions)
          in  turn.   If none of these produces a match, filename completion is

I get the above described completion when a token starts with '~' or a letter. It's just '$'-completion that's broken.

share|improve this question
up vote 6 down vote accepted

As of bash 4.2, this behavior is governed by

shopt -s direxpand # enable
shopt -u direxpand # disable

See for background information.

share|improve this answer
I really wanted to check this off, but I got this result: ericp@pacer:apps $ shopt -s direxpand bash: shopt: direxpand: invalid shell option name ericp@pacer:client $ bash --version GNU bash, version 4.2.24(1)-release (x86_64-pc-linux-gnu) ericp@pacer:client $ echo $BASHOPTS checkwinsize:cmdhist:expand_aliases:extglob:extquote: force_fignore:histappend:interactive_comments:progcomp: promptvars:sourcepath This is on Ubuntu 12.04.1 LTS – Eric Oct 26 '12 at 16:16
How do I add newlines in stackexchange comments? – Eric Oct 26 '12 at 16:16

Not quite sure if you are asking for a solution on your Mac or for *nix. If you are asking about changing your Mac, I just ran through this simple tutorial to upgrade my OSX bash from

GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin15)
Copyright (C) 2007 Free Software Foundation, Inc.


GNU bash, version 4.3.42(1)-release (x86_64-apple-darwin15.0.0)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
share|improve this answer
Actually, it works the way I expected it to on both osx 10.1 and ubuntu 14.04 (jessie/sid): '$d<TAB>' expands all vars that start with '$d', and '$d1/<TAB>' shows the files in the dir referenced by '$d1'. Thanks all. – Eric Jan 22 at 0:15

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.