bergman on 13 Jan 2009 07:13:27 -0800


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: [PLUG] Process substitution



In the message dated: Tue, 13 Jan 2009 00:08:51 EST,
The pithy ruminations from "Paul L. Snyder" on 
<[PLUG] Process substitution> were:
=> It has been quite a while since I've had a need to use process
=> substitution, so it wasn't at the tip of my mind during the presentation
=> tonight.  Here's a quick overview.  (Examples were tested in zsh, not
=> bash.)
=> 
=> Process substitution is a generalized way to pipe data to commands that are
=> expecting files as input.  In zsh, it can take three forms: >(lst), <(lst),
=> and =(lst).
=> 
=> <(...) and >(...) exist in bash as well, and use either a file descriptor


Wow! I've been using *nix for over 20 years, and this is the first thing I've 
seen in quite a while that's made me say "That's so cool!". Thanks for posting 
this and reminding me (and the other list members) of the depth of features in 
the shell.

Yet another thing to add to the toolbox.

Mark

=> or a named pipe.  They take the output of the command represented here by
=> '...' and make it available through one of those two mechanisms.  In bash,
=> I believe it will always be a /dev/fd/<n> file descriptor; in zsh, it will
=> be a named pipe as long as the system supports them, a /dev/fd file
=> descriptor otherwise.
=> 
=> To get a feel for what's going on, try running
=> 
=>   $ vim <(ls)
=> 
=> It's worth noting that for these two forms, the command is run
=> asynchronously.
=> 
=>   $ mkdir foo1 foo2
=>   $ # create bar01 to bar10 in each directory
=>   $ touch foo{1,2}/bar{01..10}
=>   $ # delete files from one of the directories
=>   $ rm foo2/bar0[468]
=>   $ # compare the two directories
=>   $ diff <(ls foo1) <(ls foo2)
=> 
=> >(...) works similarly, except anything written to it will be passed to the
=> command inside the parentheses as input.
=> 
=> =(...) is not implemented in bash, and uses an actual temporary file
=> instead of a named pipe or /dev/fd/* file.  This is necessary if you are
=> using a process that wants to lseek(2) on the data, which won't work on a
=> pipe.
=> 
=> I'll try to come up with some useful examples of process substitution for
=> next month's encore presentation at PLUG East.
=> 
=> Thanks to everyone who showed up tonight!
=> 
=> Paul
=> ___________________________________________________________________________
=> Philadelphia Linux Users Group         --        http://www.phillylinux.org
=> Announcements - http://lists.phillylinux.org/mailman/listinfo/plug-announce
=> General Discussion  --   http://lists.phillylinux.org/mailman/listinfo/plug
=> 



___________________________________________________________________________
Philadelphia Linux Users Group         --        http://www.phillylinux.org
Announcements - http://lists.phillylinux.org/mailman/listinfo/plug-announce
General Discussion  --   http://lists.phillylinux.org/mailman/listinfo/plug