There are several realpath
commands around.
The realpath
utility is a wrapper around the realpath
library functions and has been reinvented many times.
Debian used to maintain a realpath
package (separated from dwww
since woody) which hasn't changed except regarding packaging and documentation since 2001, but has now been phased out. This utility was deprecated because there are now more standard alternatives (GNU readlink
and soon GNU realpath
), but at the time, GNU utilities didn't even have readlink
at all. This implementation of realpath
supports a few options
to prevent symbolic link resolution or produce null-terminated output.
BusyBox also includes its own realpath
command (which takes no option).
GNU coreutils introduced a realpath
command in version 8.15 in January 2012. This is a compatible replacement for BusyBox's and Debian's realpath
, and also has many options in common with GNU readlink
.
realpath
has the same effect as readlink -f
with GNU readlink
. What distinguishes the two commands (or rather the various realpath
commands from readlink -f
) is the extra options that they support.
GNU realpath
is not deprecated; it has the opposite problem: it's too new to be available everywhere. Debian used to omit GNU realpath
from its coreutils
package and stick with its own realpath
. I don't know why, since GNU realpath
should be a drop-in replacement. As of Debian jessie and Ubuntu 16.04, however, GNU realpath
is used.
On Linux systems, at the moment, your best bet to canonicalize a path that may contain symbolic links is readlink -f
.
BSD systems have a readlink
command, with different capabilities from GNU readlink
. In particular, BSD readlink
does not have an option to canonicalize paths, it only traverses the symlink passed to it.
readlink
, incidentally, had the same problem — it was also invented many times (not adding this utility when symbolic links were added to Unix was a regrettable omission). It has now stabilized in several implementations with many incompatible flags (in particular BSD vs. GNU).
readlink -f
was in OpenBSD long before GNU. All of NetBSD, FreeBSD and OpenBSD now havereadlink -f
(your link even mentions it).realpath
has been in FreeBSD and IRIX for a long time (don't know if it predates the one in Debian). HPUX and IRIX also havereadlink
, though not-f
. Therealpath
package in Debian experimental is now the one from coreutils (as an experiment to see if it breaks things). The dwwwrealpath
acts more likereadlink -e
while the GNU one likereadlink -f
so it's not a complete dropin replace – Stéphane Chazelas Jun 11 '14 at 08:22realpath
has been in FreeBSD since 2002. Before that,pwd
was doing it (since 2000,pwd some-file
would callrealpath()
onfile
). Debian has had arealpath
package since 1996. The one on IRIX probably predates it though I found no evidence other than it was in IRIX 6.5 in 1998. OpenBSD added a-f
toreadlink
in 1997. GNU addedreadlink
in 2003 and it had-f
from the start. – Stéphane Chazelas Jun 11 '14 at 09:09realpath
. Does anyone know if it is somehow different from thereadlink -f
version? – Felipe Leão Jun 11 '14 at 12:50