<br><br><div class="gmail_quote">On Tue, Jun 15, 2010 at 12:49 AM, Mike Miller <span dir="ltr">&lt;<a href="mailto:mbmiller%2Bl@gmail.com">mbmiller+l@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<div class="im">On Tue, 15 Jun 2010, Mike Miller wrote:<br>
<br>
&gt; Here&#39;s something safe and easy that anyone can try at home:<br>
&gt;<br>
&gt; ( touch foo ; echo bar ; rm -i foo ) 2&gt;&amp;1<br>
&gt;<br>
&gt; ( touch foo ; echo bar ; rm -i foo ) 2&gt;&amp;1 | grep -v bar<br>
&gt;<br>
&gt; ( touch foo ; echo bar ; rm -i foo ) 2&gt;&amp;1 | grep -v baz<br>
&gt;<br>
&gt; See what I mean?  Apparently, rm can&#39;t send its stderr until the grep<br>
&gt; command has completed, so it just sits there waiting for input.<br>
<br>
<br>
</div>If I use cat instead of grep, it&#39;s fine.  It has something to do with the<br>
newline: rm -i doesn&#39;t send a newline with the prompt.  Compare the<br>
behavior of these:<br></blockquote><div><br>When doing I/O, remember that underneath the <br>printf&#39;s and readln&#39;s are &quot;read&quot; and &quot;write&quot; system calls, and<br>that these work against buffers.  Output buffers don&#39;t flush <br>
until they see a newline, EOF marker, or the file handle <br>is closed (causing the OS to flush the buffer <br>as it is deallocated), or the filehandle is the argument of a <br>system call to force a flush (flush()?).  Correspondingly, a flushed <br>
buffer linked to a file on disk is in turn not yet safely written - <br>sync or fsync commands are the safe bet there. <br><br>A lot of times you will see buffers flush as a program exits <br>because many programmers don&#39;t explicitly close their <br>
file handles and so it&#39;s the process-cleanup process that <br>flushes buffers prior to deallocating the filehandles and - if <br>necessary - the buffers themselves.  <br><br>I believe there are ways to configure a filehandle to immediately <br>
flush-through everything that is written.  Of course - that leads <br>to many more interrupts and is not as efficient, but it is possible. <br>I&#39;m not sure how to do that though - I haven&#39;t had to deal with <br>I/O at that level for a long time. <br>
<br></div><blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<br>
Maybe we would be better off if the prompt from &quot;rm -i&quot; sent a newline.<br>
On the other hand, maybe I should just never use &quot;rm -i&quot; in a script.<br>
There has to be a better way.<br>
<div><div></div><br></div></blockquote><div><br>I would not use rm -i in a script, ever, mainly just for style reasons.  For <br>example, it&#39;s possible on some unix implementations your script would <br>work as expected because that implementation of rm does send a new-line, <br>
but then when moving the script somewhere else - whoah - gnu&#39;s rm <br>doesn&#39;t send a new-line - whoops!   And maybe some rm&#39;s write to stdout, <br>and some to stderr.  I&#39;d wrap that rm with my own <br>I/O management code that is (hopefully) more portable and trustworthy. <br>
<br>-Rob <br></div></div>