Problems with command line scratch files in zsh

Mike Meyer mwm at mired.org
Mon Jun 13 03:34:26 GMT 2005


In <20050613020118.GB20259 at dan.emsphone.com>, Dan Nelson <dnelson at allantgroup.com> typed:
> In the last episode (Jun 12), Mike Meyer said:
> > [Format recovered from top posting.]
> > In <1118608948.705.6.camel at localhost>, Christopher Black <cblack at securecrossing.com> typed:
> > > On Sun, 2005-06-12 at 03:31 -0500, Mike Meyer wrote:
> > > > Since going to 5.x with devfd, I've noticed that some of the
> > > > shell constructs used by zsh (and other shells - I know zsh
> > > > didn't invent this) quit working. To wit:
> > > > 
> > > > guru% wc <(cat /etc/motd)
> > > > wc: /dev/fd/11: open: No such file or directory
> > > > 
> > > > The <(...) construct runs the pipe in (), and replaces the <(...)
> > > > with the name of the /dev/fd/ entry for the output of that pipe.
> > > > The file exists for the shell process doing all this. But when
> > > > the comm process tries to open the file to read the data, the
> > > > file doesn't exist. This is pretty nasty.
> > > > 
> > > > Anyone got any suggestions on how to fix this? A bug report with
> > > > a patch, maybe (I couldn't find any such bug report)?
> > > > Workarounds? Maybe this should go to hackers at freebsd.org?
> > > Why not just 'cat /etc/motd | wc' ?
> > 
> > Because I used a trivial example designed to illustrate the problem. A
> > less trivial example would be:
> > 
> > 	comm -12 <(sort file_one) <(sort file_two)
> > 
> > Of course, this can also be rewritten using temp files instead of
> > pipes. But that will be longer, slower, and uglier.
> > 
> > This worked on 4.X. It ought to work on 5.X.
> 
> If you want a tempfile, you should probably use the =() syntax, which
> will always use a tempfile.  <() and >() will attempt to use /dev/fd. 
> It probably worked on 4.* because 4.* creates 64 /dev/fd/* device nodes
> on install.  If for some reason zsh had more than 64 files open
> already, it would have failed even on 4.*.

But I don't want temp files, I want pipes. That's why I used <().

	<mike

-- 
Mike Meyer <mwm at mired.org>		http://www.mired.org/consulting.html
Independent Network/Unix/Perforce consultant, email for more information.


More information about the freebsd-questions mailing list