Linux – Difference between $HOME and ‘~’ (tilde)

bashcentoslinux

I had always thought that $HOME and ~ were exactly the same and thus could
be used interchangeably. Today, when I tried to install pylibmc, a python
binding to memcached, on my shared server the use of ~ gave me error but not
$HOME. I would like to reason out why.

libmemcached is a requirement for pylibmc. I have libmemcached installed
under my home directory because I have no root on the server. As a result, to
install pylibmc, I need to make sure the installation script knows where to
find libmemcached.

When executing python setup.py install --with-libmemcached=~, the installation
script runs

gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall \
  -Wstrict-prototypes -fPIC -DUSE_ZLIB -I~/include \
  -I/usr/local/include/python2.7 -c _pylibmcmodule.c \
  -o build/temp.linux-i686-2.7/_pylibmcmodule.o -fno-strict-aliasing

which gives the errors that libmemcached can't be found.

If I change to --with-libmemcached=$HOME, the script runs

gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall \
  -Wstrict-prototypes -fPIC -DUSE_ZLIB -I/home/waterbotte/include \
  -I/usr/local/include/python2.7 -c _pylibmcmodule.c \
  -o build/temp.linux-i686-2.7/_pylibmcmodule.o -fno-strict-aliasing

without any problem. It looks like the problem is that tilde doesn't get resolved. But why?

Best Answer

The tilde is part of a shell expansion (like in bash, csh, zsh, etc). The $HOME variable is exportable and can be used independent of a specific shell.

Related Topic