zsh-workers
 help / color / mirror / code / Atom feed
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


  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).