On Wed, 05 Mar 2008 13:10:37 -0800 Bob McGowan <[EMAIL PROTECTED]> wrote:
> Mark Clarkson wrote: > > On Wed, 05 Mar 2008 12:16:02 -0800 > > Bob McGowan <[EMAIL PROTECTED]> wrote: > > > >> Brian wrote: > >>> So can you explain exactly what the first < <( echo > >>> "$teststring" ) does exactly please? > >>> > >> In any case, I'd be interested in knowing where you found this > >> construct. > >> > > > > The bash man page seems to be one of the few that can be read a > > thousand times and /still/ find something new in it each time! > > > > The following extract is from 'man bash' ;-) ,although what it > > doesn't make clear is that <(list) is preceeded by '< ', which I > > guess is why it's often missed. > > > > <blockquote> > > > > Process Substitution > > Process substitution is supported on systems that support > > named pipes (FIFOs) or the /dev/fd method of naming open files. It > > takes the form of <(list) or >(list). The process list is run > > with its input or out- put connected to a FIFO or some file > > in /dev/fd. The name of this file is passed as an argument to > > the current command as the result of the expansion. If the >(list) > > form is used, writing to the file will pro- vide input for > > list. If the <(list) form is used, the file passed as an argument > > should be read to obtain the output of list. > > > > When available, process substitution is performed > > simultaneously with parameter and variable expansion, command > > substitution, and arithmetic expansion. > > > > </blockquote> > > > > Cheers > > Mark. > > > > > > Interesting. But... > > If I do the "process substitution" using a stand alone programs, it > works as described: > > $ wc <(echo this is a test) > 1 4 15 /dev/fd/63 > > And, note the '/dev/fd' "device", just as the man page describes. > > If I put the above, verbatim, in a script file, it also works exactly > as described. > > It "breaks" when the command used is a builtin command: > > $ read list <(echo this is a test) > bash: read: `/dev/fd/63': not a valid identifier > > In this case, I typed a <CR> after the first line and it "hung", in > fact it was waiting for input to the 'read' builtin. So I typed a > '^D', with the error message then following. > > The string '< <(' does not appear anywhere in the bash man page, > hence my failure to make the association with 'process substitution'. > > But, my question is still not completely answered. What prompted > Brian (or the original poster, if different), to add a second '<' to > the '<('? > > I suppose the next question should be what type of bug is this? Is > it a documentation issue, where the '< <(...)' syntax simply needs > explaining or is it a bash bug, in that a 'read list <(...)' should > work? > This should explain it: $ exec 4<>4 $ echo "this is a test" >4 $ wc /dev/fd/4 1 4 15 /dev/fd/4 which of course is equivalent to $ wc <(echo this is a test) and is not a redirection! The man page tells me that <(list) substitutes the list and it's up to the user to choose what to do with it. I chose to redirect it, hence the additional '< '. -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]