Recently I encountered a weird situation where the software we were developing was producing symbolic links that didn’t link.

$ ls -l
total 40
-rw-r--r--  1 nfiedler  staff  101 Feb 27 13:53 a1
-rw-r--r--  1 nfiedler  staff  101 Feb 27 13:53 a2
-rw-r--r--  1 nfiedler  staff  101 Feb 27 13:53 a3
lrwxr-xr-x  1 nfiedler  staff    3 Feb 27 13:53 link1 -> a1?
lrwxr-xr-x  1 nfiedler  staff    2 Feb 27 13:58 link2 -> a1

Right, so the length is different, and the link apparently points to something that starts with “a1”, but what’s going on? I used the readlink command to dump the contents of the two links.

$ readlink link1
a1
$ readlink link2
a1

Uh, yeah, so what gives? I read through the readlink man page and found the -n option, which tells readlink not to print a newline after the link contents. Lo and behold, there was now indeed a difference. To be precisely sure what the difference was, I dumped the readlink output to a file and ran hexdump -C on that.

$ readlink -n link1 > foo1
$ hexdump -C foo1
00000000  61 31 0a                                          |a1.|
00000003

$ readlink -n link2 > foo2
$ hexdump -C foo2
00000000  61 31                                            |a1|
00000002

Finally, now we can see it was indeed a newline at the end of the symbolic link. Don’t ask how that got there, that requires a whole ‘nother story.