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

In bash I can go to my home directory with cd ~ and actually refer to my home directory with any command with ~.

Can I make new, custom "directory aliases" (?) to refer to other directories? Hypothetical example:

make_alias "~~" /mnt/photon/work/foo_project/

cp ~/home.png ~~/set_8/home_4.png

How it can be done, if so? If it cannot, is it by design and why so?

Nice to have: Where and how ~ is set and bound to this "~"?

share|improve this question
Not particularly helpful to you, but you can do that with global aliases in.... ZSH, but not BASH. : alias -g ~~='/mnt/photon/work/foo_project/' – SuperMagic Mar 14 '13 at 12:06
@SuperMagic: I like global aliases, too. But in the second example (cp ~~/set...) they will fail. Named directories are more appropriate: n=/mnt/photon/work/foo_project and then cp foo ~n/bar. (Note for the OP: Also limited to zsh). – mpy Mar 14 '13 at 12:15
@OliverSalzburg: I don't think this is a duplicate. The other question asks about single character remappings (@ or _), which isn't possible in bash, while ~~ certainly is (hacky, but possible). Also, it doesn't answer how this remapping is done. – Dennis Mar 14 '13 at 12:17
The related question was: – n611x007 Mar 14 '13 at 12:56
up vote 17 down vote accepted

The tilde is not an alias, it's part of bash's shell expansion (just like *.txt or $((1 + 2))).

Bash tilde expansion supports the following tilde-prefixes:

~            The value of $HOME

~/foo        $HOME/foo

~fred/foo    The subdirectory foo of the home directory of the user fred

~+/foo       $PWD/foo

~-/foo       ${OLDPWD-'~-'}/foo

~N           The string that would be displayed by `dirs +N'

~+N          The string that would be displayed by `dirs +N'

~-N          The string that would be displayed by `dirs -N'

dirs uses the directory stack. You can use pushd to add a directory to it.

To answer your specific question about ~~, yes, it is possible to map a directory to it. Just create a user called ~ and set /mnt/photon/work/foo_project/ as its home directory:

sudo useradd '~'
sudo sed -i 's#:/home/~:[^:]*$#:/mnt/photon/work/foo_project:/bin/false#' /etc/passwd

Of course, a much "saner" approach is just defining a shell variable that points to your directory in your ~/.bashrc with the command


which can be accessed via $foo, as usual.

share|improve this answer

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.