[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Help-bash] does bash stop children processes when reading from them
From: |
Greg Wooledge |
Subject: |
Re: [Help-bash] does bash stop children processes when reading from them?? |
Date: |
Tue, 25 Nov 2014 08:25:03 -0500 |
User-agent: |
Mutt/1.4.2.3i |
On Tue, Nov 25, 2014 at 04:09:22AM -0800, R . wrote:
> alright, say we have this:
>
> while read line; do echo "$line"; done < <(func_or_process)
>
> when doing piping and redirection, does bash run "func_or_process" all in one
> go, then dump all the output to an intermediate file then makes use of them
> for the rest of the commands??
It depends on the platform bash is built for. Process substitution may
use a FIFO (named pipe), or it may use a special entry in /dev/fd/, or
it may (I think) use a temporary file.
On systems with /dev/fd/* (like BSD and Linux), func_or_process is
executed as a detached background process, with /dev/fd/* reading
to its output.
On Unix-like systems without /dev/fd/* (like HP-UX), a named pipe is
created, and func_or_process is executed as a detached background
process, writing to the named pipe, which is opened for reading by
the foreground shell.
On systems with neither (like Microsoft Windows?), I think it uses
a temp file. The func_or_process is executed first, writing to the
temp file. When it terminates, the rest of the shell command is
allowed to run, reading from the temp file.
I've never used bash on a system without Unix semantics, so I'm just
speculating about the previous paragraph.
> or does bash halt the process like sending a SIGTSTP right after
> func_or_process flushes it's output buffer?? then uses that value for the
> iteration and then SIGCONT it at the very beginning of another iteration?
If a temp file is used, there won't be signals. It will just run the
func_or_process as a normal foreground child and wait() for it.
> does it matter if it's a function or a process?? i'm asking as i want to know
> if it's still worth using command substitution at all.
THIS IS NOT COMMAND SUBSTITUTION.
This is PROCESS substitution.
Command substitution looks like this: x=$(foo)
Or like this: y=`bar`
Process substitution looks like this: foo < <(bar)
Or like this: bar > >(foo)
And no, it does not matter whether the command you issue is a function
or a script or a compiled program. It will be a child process in any
case.