> We could add it to the $sysparams hash provided by the zsh/system module? It just occurred to me that, with zsh/system, I can have the child process send its pid as the first line of output. Something like: ``` % zmodload zsh/system % exec {FOO}< <(echo $sysparams[pid]; sleep 100; echo foo bar) % read childpid <&$FOO # Get the pid, stored in $childpid % cat <&$FOO # Handle the rest of the output ``` So it may not actually be necessary to add procsubstpid. In fact, the approach above may be preferred if you need to get pids for multiple process substitutions in one command (which I think is possible?). Next question: Is it possible to get the current subshell's pid without having to load the zsh/system module ($sysparams param)? Bash seems to have the $BASHPID variable. Is there anything like that in zsh core? Or, alternatively, is it reasonable to assume that everyone will be able to load the zsh/system module? Background here is that I had a user send a pull request to zsh-autosuggestions requesting we don't depend on zsh/zpty module since some people may not have it installed, so I'm trying to minimize dependencies on non-core modules. Eric Freese 303 875 2359 On Tue, Jun 12, 2018 at 5:32 AM, Peter Stephenson wrote: > On Mon, 11 Jun 2018 19:55:32 -0600 > Eric Freese wrote: > > Do you know if there is any way to get the PID of the process spawned > > for process substitution? It looks like `$!` doesn't hold it as it > > does in bash. > > Hmm, this is obviously useful but I'd be loath simply to make $! do this > as the fact there's an asynchronous process involved is a bit hidden and > the mechanism is rather different from creating a background job, so > that could be confusing. > > We could add it to the $sysparams hash provided by the zsh/system > module? This already contains some PID information. (It's > not strictly a system parameter but I don't think anyone's > going to hold a gun to my head and tell me this hash can only > return the result of immediate system calls.) > > pws > > diff --git a/Doc/Zsh/mod_system.yo b/Doc/Zsh/mod_system.yo > index 7f2009b..a27bab4 100644 > --- a/Doc/Zsh/mod_system.yo > +++ b/Doc/Zsh/mod_system.yo > @@ -255,6 +255,11 @@ Returns the process ID of the parent of the current > process, even in > subshells. Compare tt($PPID), which returns the process ID of the parent > of the main shell process. > ) > +item(tt(procsubstpid))( > +Returns the process ID of the last process started for process > +substitution, i.e. the tt( +tt(>LPAR())var(...)tt(RPAR()) expansions. > +) > enditem() > ) > enditem() > diff --git a/Src/Modules/system.c b/Src/Modules/system.c > index 9fd4d25..7a4f4ee 100644 > --- a/Src/Modules/system.c > +++ b/Src/Modules/system.c > @@ -772,6 +772,8 @@ fillpmsysparams(Param pm, const char *name) > num = (int)getpid(); > } else if (!strcmp(name, "ppid")) { > num = (int)getppid(); > + } else if (!strcmp(name, "procsubstpid")) { > + num = (int)procsubstpid; > } else { > pm->u.str = dupstring(""); > pm->node.flags |= PM_UNSET; > @@ -805,6 +807,8 @@ scanpmsysparams(UNUSED(HashTable ht), ScanFunc func, > int flags) > func(&spm.node, flags); > fillpmsysparams(&spm, "ppid"); > func(&spm.node, flags); > + fillpmsysparams(&spm, "procsubstpid"); > + func(&spm.node, flags); > } > > static struct mathfunc mftab[] = { > diff --git a/Src/exec.c b/Src/exec.c > index 963b0a5..d445278 100644 > --- a/Src/exec.c > +++ b/Src/exec.c > @@ -174,6 +174,11 @@ mod_export int zleactive; > /**/ > pid_t cmdoutpid; > > +/* pid of last process started by <(...), >(...) */ > + > +/**/ > +mod_export pid_t procsubstpid; > + > /* exit status of process undergoing 'process substitution' */ > > /**/ > @@ -4850,6 +4855,7 @@ getproc(char *cmd, char **eptr) > return NULL; > if (!out) > addproc(pid, NULL, 1, &bgtime); > + procsubstpid = pid; > return pnam; > } > closem(FDT_UNUSED, 0); > @@ -4887,6 +4893,7 @@ getproc(char *cmd, char **eptr) > { > addproc(pid, NULL, 1, &bgtime); > } > + procsubstpid = pid; > return pnam; > } > entersubsh(ESUB_ASYNC|ESUB_PGRP); > @@ -4937,6 +4944,7 @@ getpipe(char *cmd, int nullexec) > } > if (!nullexec) > addproc(pid, NULL, 1, &bgtime); > + procsubstpid = pid; > return pipes[!out]; > } > entersubsh(ESUB_PGRP); > @@ -6172,6 +6180,7 @@ execsave(void) > es->cmdoutpid = cmdoutpid; > es->cmdoutval = cmdoutval; > es->use_cmdoutval = use_cmdoutval; > + es->procsubstpid = procsubstpid; > es->trap_return = trap_return; > es->trap_state = trap_state; > es->trapisfunc = trapisfunc; > @@ -6207,6 +6216,7 @@ execrestore(void) > cmdoutpid = en->cmdoutpid; > cmdoutval = en->cmdoutval; > use_cmdoutval = en->use_cmdoutval; > + procsubstpid = en->procsubstpid; > trap_return = en->trap_return; > trap_state = en->trap_state; > trapisfunc = en->trapisfunc; > diff --git a/Src/zsh.h b/Src/zsh.h > index 8535d48..8e7f20b 100644 > --- a/Src/zsh.h > +++ b/Src/zsh.h > @@ -1095,6 +1095,7 @@ struct execstack { > pid_t cmdoutpid; > int cmdoutval; > int use_cmdoutval; > + pid_t procsubstpid; > int trap_return; > int trap_state; > int trapisfunc; > >