* Re: piping question [not found] ` <141003082330.ZM15100__40912.263657856$1412349949$gmane$org@torch.brasslantern.com> @ 2014-10-04 15:50 ` Christian Neukirchen 2014-10-04 18:17 ` Bart Schaefer 2014-10-05 12:17 ` Mikael Magnusson 0 siblings, 2 replies; 10+ messages in thread From: Christian Neukirchen @ 2014-10-04 15:50 UTC (permalink / raw) To: zsh-workers Bart Schaefer <schaefer@brasslantern.com> writes: > On Oct 3, 4:42pm, Mikael Magnusson wrote: > } > } echo hi there | { xterm -e 'most <& 7' 7< <(cat) } > > I avoided that because I was concerned that some terminal emulators > would close all the descriptors above 2 when launching the command. Unfortunately, all these hacks don't work with urxvt. If anyone has an idea how to do it, I'd like to see. -- Christian Neukirchen <chneukirchen@gmail.com> http://chneukirchen.org ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: piping question 2014-10-04 15:50 ` piping question Christian Neukirchen @ 2014-10-04 18:17 ` Bart Schaefer 2014-10-04 19:29 ` Christian Neukirchen 2014-10-05 12:17 ` Mikael Magnusson 1 sibling, 1 reply; 10+ messages in thread From: Bart Schaefer @ 2014-10-04 18:17 UTC (permalink / raw) To: zsh-workers On Oct 4, 5:50pm, Christian Neukirchen wrote: } Subject: Re: piping question } } Bart Schaefer <schaefer@brasslantern.com> writes: } } > On Oct 3, 4:42pm, Mikael Magnusson wrote: } > } } > } echo hi there | { xterm -e 'most <& 7' 7< <(cat) } } > } > I avoided that because I was concerned that some terminal emulators } > would close all the descriptors above 2 when launching the command. } } Unfortunately, all these hacks don't work with urxvt. If anyone has an } idea how to do it, I'd like to see. This appears to be a combination of two problems: (1) The name used by <(cat) is platform-specific. E.g., on Debian- based systems, it matches /proc/self/fd/<-> which means it is interpreted relative to the current process, and "most" is two levels removed from zsh. On some other systems it's a named pipe, which works independent of /proc/self/ and is why it was the first thing I suggested. (2) As I feared, rxvt closes all the descriptors except 0,1,2 which it opened, making /proc/self/fd/<3-> all return EOF. To avoid this, you have to hand-code /proc/$$/fd/ instead of allowing zsh to create the /self/ name. The exact path may vary by platform. Also because rxvt executes the -e argument list directly rather than going through a shell, you don't need/want to re-quote arguments, but you also can't redirect input. So this should do it (options to set geometry etc. may be added): xmost() { if [[ -t 0 ]] then rxvt -e most "$@" else local procself=/proc/self procself=${procself:A} # Resolve symlink to actual PID local stdin exec {stdin}<&0 rxvt -e most "$@" $procself/fd/$stdin exec {stdin}<&- fi } I don't know about "most" so I didn't attempt to get the options right, but for "less" you need to add the -f option to be able to read the fifo. Also note that if rxvt is put in the background, you need to avoid closing $stdin until after it finishes, so the best way to make this asynchronous is to add "&" after the "fi". -- Barton E. Schaefer ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: piping question 2014-10-04 18:17 ` Bart Schaefer @ 2014-10-04 19:29 ` Christian Neukirchen 2014-10-04 21:01 ` Bart Schaefer 0 siblings, 1 reply; 10+ messages in thread From: Christian Neukirchen @ 2014-10-04 19:29 UTC (permalink / raw) To: Bart Schaefer; +Cc: zsh-workers Bart Schaefer <schaefer@brasslantern.com> writes: > xmost() { > if [[ -t 0 ]] > then > rxvt -e most "$@" > else > local procself=/proc/self > procself=${procself:A} # Resolve symlink to actual PID > local stdin > exec {stdin}<&0 > rxvt -e most "$@" $procself/fd/$stdin > exec {stdin}<&- > fi > } > > I don't know about "most" so I didn't attempt to get the options > right, but for "less" you need to add the -f option to be able to > read the fifo. Also note that if rxvt is put in the background, > you need to avoid closing $stdin until after it finishes, so the > best way to make this asynchronous is to add "&" after the "fi". This works great with less -f, thanks! -- Christian Neukirchen <chneukirchen@gmail.com> http://chneukirchen.org ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: piping question 2014-10-04 19:29 ` Christian Neukirchen @ 2014-10-04 21:01 ` Bart Schaefer 2014-10-05 4:03 ` PATCH " Bart Schaefer 0 siblings, 1 reply; 10+ messages in thread From: Bart Schaefer @ 2014-10-04 21:01 UTC (permalink / raw) To: zsh-workers On Oct 4, 9:29pm, Christian Neukirchen wrote: } Subject: Re: piping question } } Bart Schaefer <schaefer@brasslantern.com> writes: } } > local procself=/proc/self } > procself=${procself:A} # Resolve symlink to actual PID } > local stdin } > exec {stdin}<&0 } > rxvt -e most "$@" $procself/fd/$stdin } > exec {stdin}<&- } } This works great with less -f, thanks! Beware that whatever is on the left side of the pipe may not see EOF when "less" exits, so you may need to arrange to interrupt it some other way. For who may be interested, the parent zsh is holding open the file descriptor that serves as the read end of the pipe. This happens only if you backgroud the entire pipeline, e.g. cat /dev/zero | xmost & The pipe here stays open in the parent shell until the whole job is done, and trying to close it with <&- gives e.g. file descriptor 11 used by shell, not closed So I think we still have a few bugs along the lines of workers/32171 and 32176 and perhaps 31919. ^ permalink raw reply [flat|nested] 10+ messages in thread
* PATCH Re: piping question 2014-10-04 21:01 ` Bart Schaefer @ 2014-10-05 4:03 ` Bart Schaefer 2014-10-05 17:20 ` Peter Stephenson 0 siblings, 1 reply; 10+ messages in thread From: Bart Schaefer @ 2014-10-05 4:03 UTC (permalink / raw) To: zsh-workers On Oct 4, 2:01pm, Bart Schaefer wrote: } } For who may be interested, the parent zsh is holding open the file } descriptor that serves as the read end of the pipe. This happens only } if you backgrou[n]d the entire pipeline, e.g. } } cat /dev/zero | xmost & } } So I think we still have a few bugs along the lines of workers/32171 and } 32176 and perhaps 31919. This seems to take care of it. PWS, should I push before 5.0.7? diff --git a/Src/jobs.c b/Src/jobs.c index 83a4d96..bd95afb 100644 --- a/Src/jobs.c +++ b/Src/jobs.c @@ -1627,8 +1627,10 @@ spawnjob(void) } if (!hasprocs(thisjob)) deletejob(jobtab + thisjob, 0); - else + else { jobtab[thisjob].stat |= STAT_LOCKED; + pipecleanfilelist(jobtab[thisjob].filelist); + } thisjob = -1; } diff --git a/Test/A05execution.ztst b/Test/A05execution.ztst index 8d256ff..ca97f4f 100644 --- a/Test/A05execution.ztst +++ b/Test/A05execution.ztst @@ -217,6 +217,21 @@ F:This similar test was triggering a reproducible failure with pipestatus. F:This test checks for a file descriptor leak that could cause the left F:side of a pipe to block on write after the right side has exited + { setopt MONITOR } 2>/dev/null + if [[ -o MONITOR ]] + then + ( while :; do print "This is a line"; done ) | () : & + sleep 1 + jobs -l + else + print -u $ZTST_fd "Skipping pipe leak test, requires MONITOR option" + print "[0] 0 0" + fi +0:Bug regression: piping to anonymous function; piping to backround function +*>\[<->\] <-> <-> +F:This test checks for two different bugs, a parser segfault piping to an +F:anonymous function, and a descriptor leak when backgrounding a pipeline + print "autoload_redir() { print Autoloaded ksh style; } >autoload.log" >autoload_redir autoload -Uk autoload_redir autoload_redir ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: PATCH Re: piping question 2014-10-05 4:03 ` PATCH " Bart Schaefer @ 2014-10-05 17:20 ` Peter Stephenson 0 siblings, 0 replies; 10+ messages in thread From: Peter Stephenson @ 2014-10-05 17:20 UTC (permalink / raw) To: zsh-workers On Sat, 04 Oct 2014 21:03:20 -0700 Bart Schaefer <schaefer@brasslantern.com> wrote: > This seems to take care of it. PWS, should I push before 5.0.7? That looks worth having. pws ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: piping question 2014-10-04 15:50 ` piping question Christian Neukirchen 2014-10-04 18:17 ` Bart Schaefer @ 2014-10-05 12:17 ` Mikael Magnusson 2014-10-05 15:10 ` Christian Neukirchen 2014-10-05 17:04 ` Bart Schaefer 1 sibling, 2 replies; 10+ messages in thread From: Mikael Magnusson @ 2014-10-05 12:17 UTC (permalink / raw) To: Christian Neukirchen; +Cc: zsh workers On 4 October 2014 17:50, Christian Neukirchen <chneukirchen@gmail.com> wrote: > Bart Schaefer <schaefer@brasslantern.com> writes: > >> On Oct 3, 4:42pm, Mikael Magnusson wrote: >> } >> } echo hi there | { xterm -e 'most <& 7' 7< <(cat) } >> >> I avoided that because I was concerned that some terminal emulators >> would close all the descriptors above 2 when launching the command. > > Unfortunately, all these hacks don't work with urxvt. If anyone has an > idea how to do it, I'd like to see. It works fine for me, the only difference is that it doesn't automatically invoke the shell for you if you pass something that isn't an array to pass to execv; echo hi there | { urxvt -e sh -c 'most <& 7' 7< <(cat) } -- Mikael Magnusson ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: piping question 2014-10-05 12:17 ` Mikael Magnusson @ 2014-10-05 15:10 ` Christian Neukirchen 2014-10-05 17:04 ` Bart Schaefer 1 sibling, 0 replies; 10+ messages in thread From: Christian Neukirchen @ 2014-10-05 15:10 UTC (permalink / raw) To: zsh-workers Mikael Magnusson <mikachu@gmail.com> writes: > On 4 October 2014 17:50, Christian Neukirchen <chneukirchen@gmail.com> wrote: >> Bart Schaefer <schaefer@brasslantern.com> writes: >> >>> On Oct 3, 4:42pm, Mikael Magnusson wrote: >>> } >>> } echo hi there | { xterm -e 'most <& 7' 7< <(cat) } >>> >>> I avoided that because I was concerned that some terminal emulators >>> would close all the descriptors above 2 when launching the command. >> >> Unfortunately, all these hacks don't work with urxvt. If anyone has an >> idea how to do it, I'd like to see. > > It works fine for me, the only difference is that it doesn't > automatically invoke the shell for you if you pass something that > isn't an array to pass to execv; > echo hi there | { urxvt -e sh -c 'most <& 7' 7< <(cat) } You are right! I'm down to xless() { { exec {stdin}<&0 exec urxvt -e sh -c "less ${(qq)@} <&$stdin" } &! } -- Christian Neukirchen <chneukirchen@gmail.com> http://chneukirchen.org ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: piping question 2014-10-05 12:17 ` Mikael Magnusson 2014-10-05 15:10 ` Christian Neukirchen @ 2014-10-05 17:04 ` Bart Schaefer 2014-10-05 20:40 ` Mikael Magnusson 1 sibling, 1 reply; 10+ messages in thread From: Bart Schaefer @ 2014-10-05 17:04 UTC (permalink / raw) To: zsh workers On Oct 5, 2:17pm, Mikael Magnusson wrote: } Subject: Re: piping question } } On 4 October 2014 17:50, Christian Neukirchen <chneukirchen@gmail.com> wrote: } > Bart Schaefer <schaefer@brasslantern.com> writes: } > } >> On Oct 3, 4:42pm, Mikael Magnusson wrote: } >> } } >> } echo hi there | { xterm -e 'most <& 7' 7< <(cat) } } >> } >> I avoided that because I was concerned that some terminal emulators } >> would close all the descriptors above 2 when launching the command. } > } > Unfortunately, all these hacks don't work with urxvt. If anyone has an } > idea how to do it, I'd like to see. } } It works fine for me Curious. It does NOT work for me -- rxvt v2.6.4 on ubuntu 12.04.5 -- and "strace -ff" shows rxvt closing file descriptors from 3 through something over 300 (I got tired of watching the output scroll by). ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: piping question 2014-10-05 17:04 ` Bart Schaefer @ 2014-10-05 20:40 ` Mikael Magnusson 0 siblings, 0 replies; 10+ messages in thread From: Mikael Magnusson @ 2014-10-05 20:40 UTC (permalink / raw) To: Bart Schaefer; +Cc: zsh workers On 5 October 2014 19:04, Bart Schaefer <schaefer@brasslantern.com> wrote: > On Oct 5, 2:17pm, Mikael Magnusson wrote: > } Subject: Re: piping question > } > } On 4 October 2014 17:50, Christian Neukirchen <chneukirchen@gmail.com> wrote: > } > Bart Schaefer <schaefer@brasslantern.com> writes: > } > > } >> On Oct 3, 4:42pm, Mikael Magnusson wrote: > } >> } > } >> } echo hi there | { xterm -e 'most <& 7' 7< <(cat) } > } >> > } >> I avoided that because I was concerned that some terminal emulators > } >> would close all the descriptors above 2 when launching the command. > } > > } > Unfortunately, all these hacks don't work with urxvt. If anyone has an > } > idea how to do it, I'd like to see. > } > } It works fine for me > > > Curious. It does NOT work for me -- rxvt v2.6.4 on ubuntu 12.04.5 -- > and "strace -ff" shows rxvt closing file descriptors from 3 through > something over 300 (I got tired of watching the output scroll by). These days urxvt hardly shares any code with rxvt, the fork happened over ten years ago. -- Mikael Magnusson ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2014-10-05 20:40 UTC | newest] Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- [not found] <1412259225.3798.0@numa-i> [not found] ` <CAHYJk3Rx9iBLgeeKcnnu4N-56CqsgNyNhJof5+_M8H0Y0BBi9Q@mail.gmail.com> [not found] ` <141003082330.ZM15100__40912.263657856$1412349949$gmane$org@torch.brasslantern.com> 2014-10-04 15:50 ` piping question Christian Neukirchen 2014-10-04 18:17 ` Bart Schaefer 2014-10-04 19:29 ` Christian Neukirchen 2014-10-04 21:01 ` Bart Schaefer 2014-10-05 4:03 ` PATCH " Bart Schaefer 2014-10-05 17:20 ` Peter Stephenson 2014-10-05 12:17 ` Mikael Magnusson 2014-10-05 15:10 ` Christian Neukirchen 2014-10-05 17:04 ` Bart Schaefer 2014-10-05 20:40 ` Mikael Magnusson
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).