http://qs1969.pair.com?node_id=331667

z3d has asked for the wisdom of the Perl Monks concerning the following question:

Looking for some answers to my "HUH?!?" of the day. I have a script (don't we all?) that needs to perform an action on some files/directories. No biggie. But what I've found is that if there are symlinks in the tree, it performs them against the symlink targets. For instance, say i have /tmp/mike/cat, symlinked to /tmp/dogfood. It seems that perl (5.6.1 and 5.8.2, tested both) will return true on both the -l and the -d tests when scanning /tmp/mike and hitting cat. Is this just a quirk of perl? (Would expect perl to say it's either a dir or a sym, not evaluate both the source and the target). I can explain better if needed, hate posting this, but it *seems* like a bug in the implimentation of the stat tests.



"I have never written bad code. There are merely unanticipated features."

Replies are listed 'Best First'.
Re: stat weirdness?
by Abigail-II (Bishop) on Feb 25, 2004 at 15:12 UTC
    Is this just a quirk of perl?
    No. It's not just a quirk of perl. Perl does what the 'test' utility does as well (and many shells have this baked in). I don't have the POSIX standard handy at the moment, but I expect that POSIX requires this behaviour as well.

    Abigail

      To quote the page of the POSIX standard pertaining to stat:

      If the named file is a symbolic link, the stat() function shall continue pathname resolution using the contents of the symbolic link, and shall return information pertaining to the resulting file if the file exists.

      So the behavior that the OP is experiencing should be expected.

      antirice    
      The first rule of Perl club is - use Perl
      The
      ith rule of Perl club is - follow rule i - 1 for i > 1

      Abigail, antirice, thank you both. Now I'm wishing there was a "remove this node thank you" button. Not sure why I never ran into this aspect before - definitely an ignorance issue on my part. I appreciate the quick responses :)



      "I have never written bad code. There are merely unanticipated features."
Re: stat weirdness?
by ysth (Canon) on Feb 25, 2004 at 16:55 UTC
    To work on the symlink instead of following it, do an lstat instead of stat. To use the tests, do an lstat and then e.g. -d _
      They should make it easy to find this stuff, like perldoc -f or something (that is a knock against me, btw). Thanks ysth,
      -mike



      "I have never written bad code. There are merely unanticipated features."