* multios and unnecessary processes
@ 2005-01-09 16:47 Stephane Chazelas
2005-01-09 20:32 ` Bart Schaefer
0 siblings, 1 reply; 8+ messages in thread
From: Stephane Chazelas @ 2005-01-09 16:47 UTC (permalink / raw)
To: Zsh hackers list
Hi, I would expect:
zsh -c 'lsof -ag $$ -d0-2,10-15 >&2 >&- >&2'
and
zsh -c 'lsof -ag $$ -d0-2,10-15 >&2'
To work the same. However, in the first case, I get:
~$ zsh -c 'lsof -ag $$ -d0-2,10-15 >&2 >&- >&2'
~$ COMMAND PID PGID USER FD TYPE DEVICE SIZE NODE NAME 16:39
lsof 7684 7684 chazelas 0u CHR 136,6 8 /dev/pts/6
lsof 7684 7684 chazelas 1w FIFO 0,7 21985 pipe
lsof 7684 7684 chazelas 2u CHR 136,6 8 /dev/pts/6
zsh 7685 7684 chazelas 13u CHR 136,6 8 /dev/pts/6
zsh 7685 7684 chazelas 14r FIFO 0,7 21985 pipe
(note that my prompt is displayed before the result of lsof
because the output is written by that background zsh process).
In the second case, I get the expected behavior:
~$ zsh -c 'lsof -ag $$ -d0-2,10-15 >&2'
COMMAND PID PGID USER FD TYPE DEVICE SIZE NODE NAME
lsof 7702 7702 chazelas 0u CHR 136,6 8 /dev/pts/6
lsof 7702 7702 chazelas 1u CHR 136,6 8 /dev/pts/6
lsof 7702 7702 chazelas 2u CHR 136,6 8 /dev/pts/6
I came accross this while trying to make some code independant
of the multios setting (hence the >&- to cancel the teed
redirection).
~$ zsh -f
% zmodload zsh/parameter
% echo $options[multios]
on
I'm not too sure it's a good idea to make multios the default.
--
Stéphane
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: multios and unnecessary processes
2005-01-09 16:47 multios and unnecessary processes Stephane Chazelas
@ 2005-01-09 20:32 ` Bart Schaefer
2005-01-10 9:49 ` Stephane Chazelas
0 siblings, 1 reply; 8+ messages in thread
From: Bart Schaefer @ 2005-01-09 20:32 UTC (permalink / raw)
To: Zsh hackers list
On Jan 9, 4:47pm, Stephane Chazelas wrote:
} Subject: multios and unnecessary processes
}
} zsh -c 'lsof -ag $$ -d0-2,10-15 >&2 >&- >&2'
}
} and
}
} zsh -c 'lsof -ag $$ -d0-2,10-15 >&2'
}
} To work the same.
Interesting. For me, they *do* work the same *if* the command is run
from the shell prompt rather than from "zsh -c". In fact, I can only
reproduce your results if I use a non-interactive shell. If I put those
two commands in files and execute the files with "zsh -if" I get (in
both cases):
OMMAND PID PGRP USER FD TYPE DEVICE SIZE NODE NAME
zsh 22683 22683 schaefer 0u CHR 136,8 10 /dev/pts/8
zsh 22683 22683 schaefer 1u CHR 136,8 10 /dev/pts/8
zsh 22683 22683 schaefer 2u CHR 136,8 10 /dev/pts/8
zsh 22683 22683 schaefer 10r REG 3,1 36 159782 /tmp/lsof1
zsh 22683 22683 schaefer 11u CHR 136,8 10 /dev/pts/8
But if I leave off the -i I get the extra pipe descriptors in the first
case. I don't know offhand why multios would behave differently when
the shell is interactive.
} I came accross this while trying to make some code independant
} of the multios setting (hence the >&- to cancel the teed
} redirection).
I'm a little puzzled by that statement, because in your second example
there is no teed redirection. It's only the doubled >&2 that creates
a teed redirection in the first place.
The right way to write multios-independent code is to wrap things in
curly braces, e.g.: { lsof -ag $$ -d0-2,10-15 >&2 } >&2
} I'm not too sure it's a good idea to make multios the default.
If I had been in Paul Falstad's place 15 years or so ago, I'd have
thought about making the default value of multios follow the the initial
value of interactive; that is, having it on for interactive shells
unless explicitly turned off, and the reverse for non-interactive
shells. Maybe he did think about it, but that's not what he decided.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: multios and unnecessary processes
2005-01-09 20:32 ` Bart Schaefer
@ 2005-01-10 9:49 ` Stephane Chazelas
2005-01-10 16:53 ` Bart Schaefer
0 siblings, 1 reply; 8+ messages in thread
From: Stephane Chazelas @ 2005-01-10 9:49 UTC (permalink / raw)
To: Zsh hackers list
On Sun, Jan 09, 2005 at 08:32:18PM +0000, Bart Schaefer wrote:
> On Jan 9, 4:47pm, Stephane Chazelas wrote:
> } Subject: multios and unnecessary processes
> }
> } zsh -c 'lsof -ag $$ -d0-2,10-15 >&2 >&- >&2'
> }
> } and
> }
> } zsh -c 'lsof -ag $$ -d0-2,10-15 >&2'
> }
> } To work the same.
>
> Interesting. For me, they *do* work the same *if* the command is run
> from the shell prompt rather than from "zsh -c". In fact, I can only
> reproduce your results if I use a non-interactive shell. If I put those
> two commands in files and execute the files with "zsh -if" I get (in
> both cases):
>
> OMMAND PID PGRP USER FD TYPE DEVICE SIZE NODE NAME
> zsh 22683 22683 schaefer 0u CHR 136,8 10 /dev/pts/8
> zsh 22683 22683 schaefer 1u CHR 136,8 10 /dev/pts/8
> zsh 22683 22683 schaefer 2u CHR 136,8 10 /dev/pts/8
> zsh 22683 22683 schaefer 10r REG 3,1 36 159782 /tmp/lsof1
> zsh 22683 22683 schaefer 11u CHR 136,8 10 /dev/pts/8
>
> But if I leave off the -i I get the extra pipe descriptors in the first
> case. I don't know offhand why multios would behave differently when
> the shell is interactive.
[...]
That's because of the -g option to lsof (process group $$, and
lsof is run in a different process group in interactive mode),
but you get the same behavior in interactive shells (you need to
give other options to lsof)
> } I came accross this while trying to make some code independant
> } of the multios setting (hence the >&- to cancel the teed
> } redirection).
>
> I'm a little puzzled by that statement, because in your second example
> there is no teed redirection. It's only the doubled >&2 that creates
> a teed redirection in the first place.
>
> The right way to write multios-independent code is to wrap things in
> curly braces, e.g.: { lsof -ag $$ -d0-2,10-15 >&2 } >&2
That was for:
{ cmd 2>&1 >&- >&3 3>&- | cmd2 3>&-; } 3>&-
(which can be written cmd 2> >(cmd2) on some systems)
Thanks for the
{ { cmd 2>&1 >&3 3>&-; } | cmd2 3>&-; } 3>&-
~$ zsh -c '{ { lsof -ag $$ -d 0-2,10-15 2>&1 >&3 3>&-; } | tr a b 3>&-; } 3>&1'
COMMAND PID PGID USER FD TYPE DEVICE SIZE NODE NAME
tr 4506 4506 chazelas 0u FIFO 0,7 10296 pipe
tr 4506 4506 chazelas 1u CHR 136,1 3 /dev/pts/1
tr 4506 4506 chazelas 2u CHR 136,1 3 /dev/pts/1
zsh 4507 4506 chazelas 0u CHR 136,1 3 /dev/pts/1
zsh 4507 4506 chazelas 1w FIFO 0,7 10296 pipe
zsh 4507 4506 chazelas 2u CHR 136,1 3 /dev/pts/1
zsh 4507 4506 chazelas 10u CHR 136,1 3 /dev/pts/1
zsh 4507 4506 chazelas 11r CHR 1,3 2892 /dev/null
lsof 4508 4506 chazelas 0u CHR 136,1 3 /dev/pts/1
lsof 4508 4506 chazelas 1u CHR 136,1 3 /dev/pts/1
lsof 4508 4506 chazelas 2w FIFO 0,7 10296 pipe
But that's still one more process compared to:
~$ zsh -o nomultios -c '{ lsof -ag $$ -d 0-2,10-15 2>&1 >&3 3>&- | tr a b 3>&-; } 3>&1'
COMMAND PID PGID USER FD TYPE DEVICE SIZE NODE NAME
tr 4564 4564 chazelas 0u FIFO 0,7 10603 pipe
tr 4564 4564 chazelas 1u CHR 136,1 3 /dev/pts/1
tr 4564 4564 chazelas 2u CHR 136,1 3 /dev/pts/1
lsof 4565 4564 chazelas 0u CHR 136,1 3 /dev/pts/1
lsof 4565 4564 chazelas 1u CHR 136,1 3 /dev/pts/1
lsof 4565 4564 chazelas 2w FIFO 0,7 10603 pipe
--
Stéphane
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: multios and unnecessary processes
2005-01-10 9:49 ` Stephane Chazelas
@ 2005-01-10 16:53 ` Bart Schaefer
2005-01-10 17:11 ` Stephane Chazelas
0 siblings, 1 reply; 8+ messages in thread
From: Bart Schaefer @ 2005-01-10 16:53 UTC (permalink / raw)
To: Zsh hackers list
On Jan 10, 9:49am, Stephane Chazelas wrote:
} Subject: Re: multios and unnecessary processes
}
} > I don't know offhand why multios would behave differently when
} > the shell is interactive.
} [...]
}
} That's because of the -g option to lsof (process group $$, and
} lsof is run in a different process group in interactive mode),
Ah, I should have thought of that.
} > The right way to write multios-independent code is to wrap things in
} > curly braces, e.g.: { lsof -ag $$ -d0-2,10-15 >&2 } >&2
}
} Thanks for the
}
} { { cmd 2>&1 >&3 3>&-; } | cmd2 3>&-; } 3>&-
}
} ~$ zsh -c '{ { lsof -ag $$ -d 0-2,10-15 2>&1 >&3 3>&-; } | tr a b 3>&-; } 3>&1'
} But that's still one more process compared to:
}
} ~$ zsh -o nomultios -c '{ lsof -ag $$ -d 0-2,10-15 2>&1 >&3 3>&- | tr a b 3>&-; } 3>&1'
If the number of processes spawned is important, you have to know when
to use curly braces and when to force a subshell with parens. Curly
braces imply that the parent zsh sticks around and waits, whereas a
subshell with parens can simply do an exec.
zsh -fc '{ ( lsof -ag $$ -d 0-2,10-15 2>&1 >&3 3>&-; ) | tr a b 3>&-; } 3>&1'
COMMAND PID PGRP USER FD TYPE DEVICE SIZE NODE NAME
tr 26811 26811 schaefer 0r FIFO 0,0 72995 pipe
tr 26811 26811 schaefer 1u CHR 136,7 9 /dev/pts/7
tr 26811 26811 schaefer 2u CHR 136,7 9 /dev/pts/7
lsof 26822 26811 schaefer 0u CHR 136,7 9 /dev/pts/7
lsof 26822 26811 schaefer 1u CHR 136,7 9 /dev/pts/7
lsof 26822 26811 schaefer 2w FIFO 0,0 72995 pipe
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: multios and unnecessary processes
2005-01-10 16:53 ` Bart Schaefer
@ 2005-01-10 17:11 ` Stephane Chazelas
2005-01-10 19:20 ` Bart Schaefer
0 siblings, 1 reply; 8+ messages in thread
From: Stephane Chazelas @ 2005-01-10 17:11 UTC (permalink / raw)
To: Zsh hackers list
On Mon, Jan 10, 2005 at 04:53:25PM +0000, Bart Schaefer wrote:
[...]
> } ~$ zsh -o nomultios -c '{ lsof -ag $$ -d 0-2,10-15 2>&1 >&3 3>&- | tr a b 3>&-; } 3>&1'
>
> If the number of processes spawned is important, you have to know when
> to use curly braces and when to force a subshell with parens. Curly
> braces imply that the parent zsh sticks around and waits, whereas a
> subshell with parens can simply do an exec.
>
> zsh -fc '{ ( lsof -ag $$ -d 0-2,10-15 2>&1 >&3 3>&-; ) | tr a b 3>&-; } 3>&1'
>
> COMMAND PID PGRP USER FD TYPE DEVICE SIZE NODE NAME
> tr 26811 26811 schaefer 0r FIFO 0,0 72995 pipe
> tr 26811 26811 schaefer 1u CHR 136,7 9 /dev/pts/7
> tr 26811 26811 schaefer 2u CHR 136,7 9 /dev/pts/7
> lsof 26822 26811 schaefer 0u CHR 136,7 9 /dev/pts/7
> lsof 26822 26811 schaefer 1u CHR 136,7 9 /dev/pts/7
> lsof 26822 26811 schaefer 2w FIFO 0,0 72995 pipe
That makes sense but is not very intuitive given that (...) is
generally thought as the form spawning additional processes.
However to get back to my initial statement, don't you agree
it's a problem that
cmd >&2 >&- >&2
doesn't redirect stdout to stderr but to a pipe to a background
process that just echos the output to stderr?
That's not too big an issue. I was just trying to give some code
example in comp.unix.shell that would work the same for any shell
(including zsh with multios).
--
Stéphane
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: multios and unnecessary processes
2005-01-10 17:11 ` Stephane Chazelas
@ 2005-01-10 19:20 ` Bart Schaefer
2005-01-10 19:48 ` Peter Stephenson
2005-01-11 9:07 ` Stephane Chazelas
0 siblings, 2 replies; 8+ messages in thread
From: Bart Schaefer @ 2005-01-10 19:20 UTC (permalink / raw)
To: Zsh hackers list
On Jan 10, 5:11pm, Stephane Chazelas wrote:
} Subject: Re: multios and unnecessary processes
}
} However to get back to my initial statement, don't you agree
} it's a problem that
}
} cmd >&2 >&- >&2
}
} doesn't redirect stdout to stderr but to a pipe to a background
} process that just echos the output to stderr?
Yes, that could be considered a bug. Suggested patch below.
But under what circumstances would you write that?
The only case where I can think offhand of that coming up is something
like this:
original_cmd="lsof -ag $$ -d 0-2,10-15 >&2"
# ... time and code passes ...
modified_cmd="$original_cmd >&-"
# ... more time and code passes ...
finished_cmd="$modified_cmd >&2"
eval $finished_cmd
Here's the patch. This relies on the fact that mfds[] elements are heap
allocated; it also means that repeatedly opening and closing a descriptor
with MULTIOS on will repeatedly allocate and discard a multio structure,
whereas before it would re-use it even after closing.
Patch line numbers may be off because I've applied 20632 (PWS, I think
you could commit that, it seems to be fine).
Index: Src/exec.c
===================================================================
RCS file: /extra/cvsroot/zsh/zsh-4.0/Src/exec.c,v
retrieving revision 1.22
diff -c -r1.22 exec.c
--- exec.c 6 Dec 2004 16:51:18 -0000 1.22
+++ exec.c 10 Jan 2005 19:08:51 -0000
@@ -1487,6 +1488,7 @@
}
_exit(0);
}
+ mfds[fd] = NULL;
}
/* close all the mnodes (failure) */
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: multios and unnecessary processes
2005-01-10 19:20 ` Bart Schaefer
@ 2005-01-10 19:48 ` Peter Stephenson
2005-01-11 9:07 ` Stephane Chazelas
1 sibling, 0 replies; 8+ messages in thread
From: Peter Stephenson @ 2005-01-10 19:48 UTC (permalink / raw)
To: Zsh hackers list
Bart Schaefer wrote:
> Patch line numbers may be off because I've applied 20632 (PWS, I think
> you could commit that, it seems to be fine).
That's been in for a few days now.
pws
**********************************************************************
This email and any files transmitted with it are confidential and
intended solely for the use of the individual or entity to whom they
are addressed. If you have received this email in error please notify
the system manager.
This footnote also confirms that this email message has been swept by
MIMEsweeper for the presence of computer viruses.
www.mimesweeper.com
**********************************************************************
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: multios and unnecessary processes
2005-01-10 19:20 ` Bart Schaefer
2005-01-10 19:48 ` Peter Stephenson
@ 2005-01-11 9:07 ` Stephane Chazelas
1 sibling, 0 replies; 8+ messages in thread
From: Stephane Chazelas @ 2005-01-11 9:07 UTC (permalink / raw)
To: Zsh hackers list
On Mon, Jan 10, 2005 at 07:20:41PM +0000, Bart Schaefer wrote:
> On Jan 10, 5:11pm, Stephane Chazelas wrote:
> } Subject: Re: multios and unnecessary processes
> }
> } However to get back to my initial statement, don't you agree
> } it's a problem that
> }
> } cmd >&2 >&- >&2
> }
> } doesn't redirect stdout to stderr but to a pipe to a background
> } process that just echos the output to stderr?
>
> Yes, that could be considered a bug. Suggested patch below.
>
> But under what circumstances would you write that?
[...]
Hi, thanks for the patch (I've not tested it yet).
As I said in a previous mail, I came accross that when trying to
cancel a multios:
{
cmd 2>&1 >&- >&3 | grep -v do-not-want-that-error-message
} 3>&1
Without >&-, cmd's stdout would have gone to the terminal and to
grep, and I just wanted cmd's stderr to go to grep.
At that time, I didn't know of:
(cmd 2>&1 >&3) | grep ...
--
Stéphane
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2005-01-11 9:07 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-01-09 16:47 multios and unnecessary processes Stephane Chazelas
2005-01-09 20:32 ` Bart Schaefer
2005-01-10 9:49 ` Stephane Chazelas
2005-01-10 16:53 ` Bart Schaefer
2005-01-10 17:11 ` Stephane Chazelas
2005-01-10 19:20 ` Bart Schaefer
2005-01-10 19:48 ` Peter Stephenson
2005-01-11 9:07 ` Stephane Chazelas
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).