On 11/14/2014 06:15 AM, Eric Blake wrote: >> Confused me too when I encountered it first, but tt's required by POSIX: >> http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap04.html#tag_04_11 > > No, actually, POSIX requires that it (attempt to) remove the DIRECTORY, > not the symlink. Linux is intentionally in violation of POSIX on this > front. > > Try this on Solaris: > > $ mkdir a > $ ln -s a b > $ rm b/ > $ ls -d ? > b Uggh, serves me right for typing without testing. I'm mixing up rename(), unlink(), and rmdir() semantics. Basically, unlink("anything/") is required by POSIX to fail because the trailing / means that the only thing to be removed is a directory, but directories can only be removed by rmdir(), not unlink(). Still, my point remains when you use 'rm -r b/': on Linux, it fails (cannot remove 'b/': Not a directory), on Solaris it succeeds at removing 'a' and leaving 'b' dangling. The fact that Linux intentionally violates POSIX on some of the corner cases related to symlinks to directories makes it harder to definitively state what coreutils should do. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org