From: Bart Schaefer <schaefer@brasslantern.com>
To: zsh-workers@zsh.org
Subject: Re: piping question
Date: Sat, 04 Oct 2014 11:17:55 -0700 [thread overview]
Message-ID: <141004111755.ZM7181@torch.brasslantern.com> (raw)
In-Reply-To: <87mw9bu94f.fsf@gmail.com>
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
next prev parent reply other threads:[~2014-10-04 18:18 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
[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 ` Christian Neukirchen
2014-10-04 18:17 ` Bart Schaefer [this message]
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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=141004111755.ZM7181@torch.brasslantern.com \
--to=schaefer@brasslantern.com \
--cc=zsh-workers@zsh.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).