On Mon, 30 Oct 2006, Ensel Sharon wrote: > I have a script that, among other things, removes a line from > /etc/ftpchroot. > > I do this with this method: > > > cat /etc/ftpchroot | grep -v $remove > /etc/ftpchroot > > > Easy. You cat all of the file except the line you want to remove, and > redirect it back to itself. > > The problem is, about 50% of the time, I end up with an empty ftpchroot > file. It is zero bytes. This obviously has nothing to do with a bad > variable, since if it wasn't there, the starting file and ending file > would just be identical. > > Instead, I get an empty file. I have reproduced this with other files in > other places - works some of the time, other times gives me an empty file. > > What gives ? > > (note, I know a lot of ways to work around this - so I'm not so much > asking how to fix this, as I am asking "why does this happen" ?)
It happens because the two processes either side of the pipe are competing for CPU resource. If the "cat" gets to run first then it'll slurp in the contents of the existing file (which will probably fit into one stdio buffer) and everything's hunky-dory. If the other half gets to go first, then the shell will open the file for output, truncating it in the process, and exec grep. At that point the "cat" will have another go and find nothing there. Basically, what you've written is buggy and you need to use one of your workarounds. Cheers, jan -- jan grant, ISYS, University of Bristol. http://www.bris.ac.uk/ Tel +44 (0)117 3317661 http://ioctl.org/jan/ stty intr ^m _______________________________________________ email@example.com mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-questions To unsubscribe, send any mail to "[EMAIL PROTECTED]"