26

Within a bash script, I know I can check if a file is a symbolic link with the following syntax

if [ -L $path ]

Does any one know how I would test if that path was linked to a particular path? E.g. I want to check whether the target of $path is /some/where.

5
  • possible duplicate of How do I check if a file is a symbolic link to a directory?
    – A.B.
    Commented Mar 24, 2015 at 20:54
  • 2
    Do you mean linked to by a particular path? Couldn't you do a readlink on the known path and compare it against the path you're testing?
    – Bratchley
    Commented Mar 24, 2015 at 20:55
  • @Bratchley. Yes, that's what I meant.. thanks for the answer.
    – BillMan
    Commented Mar 24, 2015 at 20:57
  • 4
    I strongly urge you to always put shell variables in quotes (e.g., if [ -L "$path" ] ) unless you have a good reason not to and you're sure you know what you're doing. Commented Mar 25, 2015 at 0:02
  • @G-Man thanks for the great feedback.. subconsciously I know to do that, but forget it in practice.. the reinforcement helps.
    – BillMan
    Commented Mar 25, 2015 at 13:23

1 Answer 1

33

If you want to check whether $path is a symbolic link whose target is /some/where, you can use the readlink utility. It isn't POSIX, but it's available on many systems (GNU/Linux, BusyBox, *BSD, …).

if [ "$(readlink -- "$path")" = /some/where ]; then …

Note that this is an exact text comparison. If the target of the link is /some//where, or if it's where and the value of $path is /some/link, then the texts won't match.

Many versions of readlink support the option -f, which canonicalizes the path by expanding all symbolic links.

Many shells, including dash, ksh, bash and zsh, support the -ef operator in the test builtin to test whether two files are the same (hard links to the same file, after following symbolic links). This feature is also widely supported but not POSIX.

if [ "$path" -ef "/some/where" ]; then …
7
  • the first example does not work when the link points to a relative path...
    – inemanja
    Commented Nov 4, 2019 at 12:20
  • 1
    @inemanja Sure it does. But as I state, this is a text comparison. It treats different paths to the same target as different. If you want to test whether the target of a symbolic link is a particular file, rather than a particular path, use one of the methods I describe below. Commented Nov 4, 2019 at 12:46
  • It's not safe to treat file location as strings for that exact reason - the first example compares strings hence it shows that "/dir/file.txt" and "/dir/../dir/../dir/file.txt" are different files, and they are not. The second example is much more precise.
    – inemanja
    Commented Jul 9, 2020 at 15:42
  • How about wrapping the path in $(realpath "../dir/../otherdir/file.ext") ? Commented Dec 10, 2021 at 12:21
  • @MogensTrasherDK How about that? I don't understand what you're asking. Commented Dec 10, 2021 at 19:53

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .