I think it's quite self-explanatory, so I don't really know the part which sounds ambiguous for you...
Let's see with an example:
--canonicalize
$ mkdir /tmp/realdir
$ mkdir /tmp/subdir
$ ln -s /tmp/realdir /tmp/subdir/link
$ cd /tmp
$ readlink -f ./subdir/link/nonexistentdir/
/tmp/realdir/nonexistentdir
$ readlink -f ./subdir/link/nonexistentfile.txt
/tmp/realdir/nonexistentfile.txt
Whatever the options are, readlink will:
- translate the relative path to absolute path
- translate the symlink name to the real path
And as you can see above, with -f, readlink doesn't care if the last part of this path (here nonexistentfile.txt) exists or not.
If another part of this path does not exist, readlink will output nothing and will have a return code different than 0 (which means an error occured). See:
$ readlink -f /tmp/fakedir/foo.txt
$ echo $?
1
--canonicalize-existing
If you try the same with -e:
$ readlink -e ./subdir/link
/tmp/realdir
$ readlink -e ./subdir/link/nonexistentfile.txt
$ echo $?
1
With -e, in case any of the path component doesn't exist, readlink will output nothing and will have a return code different than 0.
--canonicalize-missing
-m option is the opposite of -e. No test will be made to check if the components of path exist:
$ readlink -m ./subdir/link/fakedir/fakefile
/tmp/realdir/fakedir/fakefile
$ ln -s /nonexistent /tmp/subdir/brokenlink
$ readlink -m ./subdir/brokenlink/foobar
/nonexistent/foobar