Differences between revisions 6 and 7
Revision 6 as of 2011-04-16 04:04:51
Size: 981
Editor: pool-72-81-225-126
Revision 7 as of 2013-07-26 22:44:57
Size: 980
Comment: simplify `perl`, add missing `--`, `-d` won't harm here either.
Deletions are marked like this. Additions are marked like this.
Line 12: Line 12:
perl -e 'print readlink "/bin/sh", "\n"' perl -le 'print readlink "/bin/sh"'
Line 30: Line 30:
        ll=$(LC_ALL=C ls -l "$path" 2>/dev/null) &&         ll=$(LC_ALL=C ls -ld -- "$path" 2>/dev/null) &&

How can I display the target of a symbolic link?

The nonstandard external command readlink(1) can be used to display the target of a symbolic link:

$ readlink /bin/sh

If you don't have readlink, you can use Perl:

perl -le 'print readlink "/bin/sh"'

You can also use GNU find's -printf %l directive, which is especially useful if you need to resolve links in batches:

$ find /bin/ -type l -printf '%p points to %l\n'
/bin/sh points to bash
/bin/bunzip2 points to bzip2

If your system lacks both readlink and Perl, you can use a function like this one:

# Bash
readlink() {
    local path=$1 ll

    if [ -L "$path" ]; then
        ll=$(LC_ALL=C ls -ld -- "$path" 2>/dev/null) &&
        printf '%s\n' "${ll#* -> }"
        return 1

However, this can fail if a symbolic link contains " -> " in its name.


BashFAQ/029 (last edited 2013-07-26 22:44:57 by StephaneChazelas)