Red Hat Bugzilla – Bug 453208
perl -e file test misses broken symlinks
Last modified: 2008-08-14 08:57:23 EDT
Description of problem:
Version-Release number of selected component (if applicable):
Steps to Reproduce:
1. create a directory (mkdir /tmp/test1)
2. make a symlink to it (ln -s /tmp/test1 /tmp/linktest1)
3. move or delete the directory (mv /tmp/test1 /tmp/test1moved)
4. now the link is broken, so try running this script:
my $filename = "/tmp/linktest1";
my $directory = "/tmp";
if( -e $filename)
`/bin/rm -f $filename`;
if( -d $directory)
`/bin/ln -s /tmp/test1moved $filename`;
The script gives this for output:
/bin/ln: `/tmp/linktest1': File exists
Basically, it does not enter the first if statement, and the broken link is
not deleted. However, if you replace the "-e" test with the "-l" test, the
broken link is deleted.
I would expect that the -e flag with see the broken link as a file, which
would then cause it to be deleted. Note that the above test program does work
fine if the link is not broken.
Additional info: Obviously, I don't really need the rm command inside of the
if statement, because it doesn't really matter if the file exists or not.
However, I noticed that the -e flag didn't work as I expected it to, and I
thought someone else might run into it unexpectedly on something more
important. Let me know if you need more info.
This must be a conventional behaviour. If you try the same with bash, it ends the same way.