Daniel Janus’s blog
Today’s lesson: Mind the symlinks
11 June 2008
Probably every day I keep learning new things, without even realizing it most of the time. The vast majority of them are minor or even tiny tidbits of knowledge; but even these might be worth noting down from time to time, especially when they are tiny pitfalls I’d fallen into and spent a couple of minutes getting out. By sharing them, I might hopefully prevent someone else for slipping and falling in.
So here’s a simple Unix question: If you enter a subdirectory of the current directory and back to
.., where will you end up? The most obvious answer is, of course, “in the original directory”, and is mostly correct. But is it always? Let’s see.
nathell@breeze:~$ pwd /home/nathell nathell@breeze:~$ cd foobar nathell@breeze:~/foobar$ cd .. nathell@breeze:~$ pwd /home/nathell
So the hypothesis seems to be right. But let’s try doing this in Python, just for the heck of it:
nathell@breeze:~$ python Python 2.5.2 (r252:60911, Apr 21 2008, 11:12:42) [GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import os >>> print os.getcwd() /home/nathell >>> os.chdir("foobar") >>> os.chdir("..") >>> print os.getcwd() /var
Whoa, hang on! What’s that
/var doing there? Of course the one thing I didn’t tell you is that
foobar is not really a directory, but rather a symlink pointing to one (
/var/log in this case).
The corollary is that the shell builtin
cd is not the same as Unix
chdir() (it is easily checked that both Perl and C exhibit the same behaviour). In fact, the shell builtin has an oft-forgotten command-line switch,
-P, which causes it to follow physical instead of logical path structure.
On a closing note: I have somewhat neglected the blog throughout the previous month, but I hope to revive it soon. It is not unlikely that such irregularities will recur.