Super User is a question and answer site for computer enthusiasts and power users. Join them; it only takes a minute:

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

Maybe not programming related, but I want to reference this directory in c program.

I thought it is $HOME, but when I unset $HOME, I can still cd ~/ in bash.

It is also not $USER's home, since I can be root with USER="another", but the “~/" still point to "/root".

so how bash explains this "~/"?.

share|improve this question

migrated from Sep 17 '09 at 9:09

This question came from our site for professional and enthusiast programmers.

possible duplicate of What does the little squiggly ~ do in Linux? – Wuffers Feb 18 '12 at 3:51
up vote 2 down vote accepted

Maybe not programming related, but I want to reference this directory in c program.

If you try to opendir the string literal "~/" in C, you'll find it doesn't exist. It is a Bash/Csh shorthand notation that is expanded by the shell to the home directory. It does not exist as such on the filesystem and so a C program will fail- unless it invokes Bash, for example, and allows Bash to expand the string.

share|improve this answer

Using home dir information from /etc/passwd (6th field).

share|improve this answer
No, don't do this. Use (in shell) getent passwd, or in C, getpwent(3). Both will succeed on NIS or LDAP systems where /etc/passwd will fail you. – kmarsh Oct 2 '09 at 16:01

It is $HOME, but changing it's value will not effect expansion. See this link for more information.

share|improve this answer
Changing its value will, but unsetting it won't. When $HOME is unset, bash sets it while expanding ~, as can be checked by running strace echo ~ On Cygwin I see this line: 79 56614 [main] echo 2380 cygheap_user::ontherange: Set HOME (from /etc/passwd) to /cygdrive/g – reinierpost Sep 17 '09 at 10:04

Bash Hackers Wiki - Documentation - Tilde Expansion:

The tilde expansion is used to expand to several specific pathnames:

  • home directories
  • current working directory
  • previous working directory
share|improve this answer

~ is interpreted as home-dir by the shell. it's a "keyword"

share|improve this answer

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .