Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Capture stderr to variable without new process



On Mon, Jan 21, 2013 at 06:35:49PM -0500, Phil Pennock wrote:
> On 2013-01-22 at 01:41 +0530, rahul wrote:
> > I guess the typical way would be:
> > 
> >    ERR=$(popd 2>&1)
> > 
> > However, the command cannot run in a sub-shell as it would have no effect
> > in the current shell.
> > Is writing to a file the only way ?
> 
> If the output can only be one line and you have an unbuffered cat(1) (-u
> option).
> 
> % coproc cat -u
> [1] 6550
> % popd 2>&p
> % read -p foo
> % echo $foo
> popd: directory stack empty
Good method. I think we can improve it by using a loop and add
a timeout to read:

% coproc cat
% git abc 2>&p
% while read -t 2 -p line;do ERR+=$line$'\n';done
% print "$ERR"
git: 'abc' is not a git command. See 'git --help'.

Did you mean this?
add

%
> % coproc -
This is interesting. How could we figure out this method, please?
> 
> Otherwise, you need to script a cat-command which can exit on a sentinel
> line; I don't know of a way to close the coproc's stdin while leaving
> the coproc running to collect its output later.  Perhaps someone else
> does?  If you could send EOF on the coproc's stdin, then you could just
> use:
>   popd_stderr="$(cat <&p)"
> after closing its stdin.
> 
> -Phil



Messages sorted by: Reverse Date, Date, Thread, Author