Bash: how to get real path of a symlink?
if you are working on Linux readlink -f $LINK
and on mac you can also use that greadlink -f $LINK
lets assume we have real script or file and symbolic link to it:
$ ls -la
-rwxr-xr-x 1 root root 0 Mar 20 07:05 realscript.sh
lrwxrwxrwx 1 root root 10 Mar 20 07:05 symlink -> realscript.sh
And the part of GNU coreutils are few very useful commands:
$ realpath symlink
/home/test/realscript.sh
see also on original:
realpath realscript.sh
/home/test/realscript.sh
Also very good combination in scripting is to use dirname
on script
$ dirname /home/test/realscript.sh
/home/test
so to wrap it up, you can use in script
echo $( dirname $(realpath "symlink") )
or to get and store in variable real script home dir and save code to get real path script realscript.sh:
script_home=$( dirname $(realpath "$0") )
echo Original script home: $script_home
Where "$0" is defined as "self" in shell script.
To test everything, we put symlink into /home/test2/, amend some additional things and run/call it from root directory:
$ /home/test2/symlink
/home/test
Original script home: /home/test
Original script is: /home/test/realscript.sh
Called script is: /home/test2/symlink
Please try to write your self the amended outputs :)
Update 2021, there is also command:
readlink - print resolved symbolic links or canonical file names
DESCRIPTION Note realpath(1) is the preferred command to use for canonicalization functionality.
readlink
is not a standard command, but it's common on Linux and BSD, including OS X, and it's the most straightforward answer to your question. BSD and GNU readlink implementations are different, so read the documentation for the one you have.
If readlink
is not available, or you need to write a cross-platform script that isn't bound to a specific implementation:
If the symlink is also a directory, then
cd -P "$symlinkdir"
will get you into the dereferenced directory, so
echo "I am in $(cd -P "$symlinkdir" && pwd)"
will echo the fully dereferenced directory. That said, cd -P
dereferences the entire path, so if you have more than one symlink in the same path you can have unexpected results.
If the symlink is to a file, not a directory, you may not need to dereference the link. Most commands follow symlinks harmlessly. If you simply want to check if a file is a link, use test -L
.