Change in behavior to stat(1)

Doug Barton dougb at FreeBSD.org
Sat Mar 5 21:15:04 UTC 2011


On 03/04/2011 11:05, Jilles Tjoelker wrote:
> On Mon, Feb 28, 2011 at 11:15:39AM -0600, Stephen Montgomery-Smith wrote:
>> I had a little script that would remove broken links.  I used to do it
>> like this:
>
>> if ! stat -L $link>  /dev/null; then rm $link; fi
>
>> But recently (some time in February according to the CVS records) stat
>> was changed so that stat -L would use lstat(2) if the link is broken.
>
>> So I had to change it to
>
>> if stat -L $link | awk '{print $3}' | grep l>  /dev/null;
>> then rm $link; fi
>
>> but it is a lot less elegant.
>
>> What is the proper accepted way to remove broken links?
>
> A better answer to your original question was already given, but for
> that command, isn't it sufficient to do
>
>    if ! [ -e $link ]; then rm $link; fi
>
> All test(1)'s primaries that test things about files follow symlinks,
> except for -h/-L.

I'd do '[ -e "$link" ] || unlink $link' but Jilles is definitely right 
that simply using 'test -e' is the way to go.

Stephen, sorry to hear that the change in behavior to stat(1) was 
troubling to you. A little bit of the history might be useful. I 
originally imported stat(1) from NetBSD in 2002, but did not keep up 
with the improvements that NetBSD made to it. I recently found time to 
catch up with the work that they've done, and the change to the behavior 
of readlink seemed like a useful one so I brought it over. hopefully it 
won't cause too many more problems. :)


Doug

-- 

	Nothin' ever doesn't change, but nothin' changes much.
			-- OK Go

	Breadth of IT experience, and depth of knowledge in the DNS.
	Yours for the right price.  :)  http://SupersetSolutions.com/



More information about the freebsd-stable mailing list