Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature: three-argument open() for reading stderr, not stdout #9092

Closed
p5pRT opened this issue Oct 30, 2007 · 5 comments
Closed

Feature: three-argument open() for reading stderr, not stdout #9092

p5pRT opened this issue Oct 30, 2007 · 5 comments

Comments

@p5pRT
Copy link

p5pRT commented Oct 30, 2007

Migrated from rt.perl.org#47031 (status was 'rejected')

Searchable as RT47031$

@p5pRT
Copy link
Author

p5pRT commented Oct 30, 2007

From @epa

Created by @epa

To read stdout from a command you can say

  open FH, '-|', 'echo', 'hello';

But this gives no straightforward way to read stderr. You can go back
to two-argument open() and use the shell to handle 2>&1, if on a
platform that supports it. But that no longer has the cleanliness of
passing arguments directly in a perl list.

There is IPC​::Open3, but that is heavyweight for the case when all you
want to do is read stderr, not set up a command with input piped both
in and out.

I hope it would be straightforward to add a feature like

  open FH, '-2|', 'echo', 'hello'

which gives you a filehandle reading the command's standard error, and
leaves its standard output alone.

Perl Info

Flags:
    category=core
    severity=wishlist

This perlbug was built using Perl v5.8.8 in the Red Hat build system.
It is being executed now by Perl v5.8.8 - Thu Oct 25 13:18:05 BST 2007.

Site configuration information for perl v5.8.8:

Configured by Red Hat, Inc. at Thu Oct 25 13:18:05 BST 2007.

Summary of my perl5 (revision 5 version 8 subversion 8) configuration:
  Platform:
    osname=linux, osvers=2.6.20-1.2952.fc6, archname=i386-linux-thread-multi
    uname='linux localhost.localdomain 2.6.20-1.2952.fc6 #1 smp wed may 16 17:59:13 edt 2007 i686 gnulinux '
    config_args='-des -Doptimize=-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables -Dversion=5.8.8 -Dmyhostname=localhost -Dperladmin=root@localhost -Dcc=gcc -Dcf_by=Red Hat, Inc. -Dinstallprefix=/usr -Dprefix=/usr -Darchname=i386-linux -Dvendorprefix=/usr -Dsiteprefix=/usr -Duseshrplib -Dusethreads -Duseithreads -Duselargefiles -Dd_dosuid -Dd_semctl_semun -Di_db -Ui_ndbm -Di_gdbm -Di_shadow -Di_syslog -Dman3ext=3pm -Duseperlio -Dinstallusrbinperl=n -Ubincompat5005 -Uversiononly -Dpager=/usr/bin/less -isr -Dd_gethostent_r_proto -Ud_endhostent_r_proto -Ud_sethostent_r_proto -Ud_endprotoent_r_proto -Ud_setprotoent_r_proto -Ud_endservent_r_proto -Ud_setservent_r_proto -Dinc_version_list=5.8.7 5.8.6 5.8.5 -Dscriptdir=/usr/bin'
    hint=recommended, useposix=true, d_sigaction=define
    usethreads=define use5005threads=undef useithreads=define usemultiplicity=define
    useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
    use64bitint=undef use64bitall=undef uselongdouble=undef
    usemymalloc=n, bincompat5005=undef
  Compiler:
    cc='gcc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm',
    optimize='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables',
    cppflags='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -pipe -Wdeclaration-after-statement -I/usr/local/include -I/usr/include/gdbm'
    ccversion='', gccversion='4.1.1 20070105 (Red Hat 4.1.1-51)', gccosandvers=''
    intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
    d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=12
    ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
    alignbytes=4, prototype=define
  Linker and Libraries:
    ld='gcc', ldflags =' -L/usr/local/lib'
    libpth=/usr/local/lib /lib /usr/lib
    libs=-lresolv -lnsl -lgdbm -ldb -ldl -lm -lcrypt -lutil -lpthread -lc
    perllibs=-lresolv -lnsl -ldl -lm -lcrypt -lutil -lpthread -lc
    libc=/lib/libc-2.5.so, so=so, useshrplib=true, libperl=libperl.so
    gnulibc_version='2.5'
  Dynamic Linking:
    dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E -Wl,-rpath,/usr/lib/perl5/5.8.8/i386-linux-thread-multi/CORE'
    cccdlflags='-fPIC', lddlflags='-shared -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables -L/usr/local/lib'

Locally applied patches:
    


@INC for perl v5.8.8:
    /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi
    /usr/lib/perl5/site_perl/5.8.7/i386-linux-thread-multi
    /usr/lib/perl5/site_perl/5.8.6/i386-linux-thread-multi
    /usr/lib/perl5/site_perl/5.8.5/i386-linux-thread-multi
    /usr/lib/perl5/site_perl/5.8.8
    /usr/lib/perl5/site_perl/5.8.7
    /usr/lib/perl5/site_perl/5.8.6
    /usr/lib/perl5/site_perl/5.8.5
    /usr/lib/perl5/site_perl
    /usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi
    /usr/lib/perl5/vendor_perl/5.8.7/i386-linux-thread-multi
    /usr/lib/perl5/vendor_perl/5.8.6/i386-linux-thread-multi
    /usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi
    /usr/lib/perl5/vendor_perl/5.8.8
    /usr/lib/perl5/vendor_perl/5.8.7
    /usr/lib/perl5/vendor_perl/5.8.6
    /usr/lib/perl5/vendor_perl/5.8.5
    /usr/lib/perl5/vendor_perl
    /usr/lib/perl5/5.8.8/i386-linux-thread-multi
    /usr/lib/perl5/5.8.8
    .


Environment for perl v5.8.8:
    HOME=/home/eda
    LANG=en_US.UTF-8
    LANGUAGE (unset)
    LC_ALL=en_GB.UTF-8
    LD_LIBRARY_PATH (unset)
    LOGDIR (unset)
    PATH=/home/eda/bin:/home/eda/bin:/usr/lib/qt-3.3/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/eda/bin
    PERL_BADLANG (unset)
    SHELL=/bin/bash

-- 
Ed Avis <eda@waniasset.com>

______________________________________________________________________
This email has been scanned by the MessageLabs Email Security System.
For more information please visit http://www.messagelabs.com/email 
______________________________________________________________________

@p5pRT
Copy link
Author

p5pRT commented Oct 31, 2007

From @davidnicol

On 10/30/07, via RT Ed Avis <perlbug-followup@​perl.org> wrote​:

To read stdout from a command you can say

open FH\, '\-|'\, 'echo'\, 'hello';

But this gives no straightforward way to read stderr. You can go back
to two-argument open() and use the shell to handle 2>&1, if on a
platform that supports it. But that no longer has the cleanliness of
passing arguments directly in a perl list.

There is IPC​::Open3, but that is heavyweight for the case when all you
want to do is read stderr, not set up a command with input piped both
in and out.

I hope it would be straightforward to add a feature like

open FH\, '\-2|'\, 'echo'\, 'hello'

which gives you a filehandle reading the command's standard error, and
leaves its standard output alone.

this gives you a stderr-capturing backtick variant kind of thing; but
the approach
can be adjusted to keep our end of the stderr pipe.

  sub GimmeStdErr(@​){ # ... bangles, tangles and spaghetti!
  local *R, *W;
  pipe R,W;
  if(fork){
  close W;
  <R>
  }else{
  close R;
  open STDERR, ">&W";
  exec @​_
  }
  };

Here's the tested version​:
$ ls nonexistent
ls​: cannot access nonexistent​: No such file or directory

$ ls nonexistent > /dev/null
ls​: cannot access nonexistent​: No such file or directory

$ perl -le 'exec qw/ls nonexistent/'
ls​: cannot access nonexistent​: No such file or directory

$ perl -le 'pipe R,W; if(fork){close W; print "got​: ".<R>}else{close R; open ST
DERR, ">&W"; exec qw/ls nonexistent/}'
got​: ls​: cannot access nonexistent​: No such file or directory

@p5pRT
Copy link
Author

p5pRT commented Oct 31, 2007

The RT System itself - Status changed from 'new' to 'open'

@p5pRT
Copy link
Author

p5pRT commented Dec 6, 2017

From zefram@fysh.org

The proposed feature is too esoteric to be worth adding to the core.
This area is already well served by the mechanisms mentioned​: shell
redirection is cheap but platform-specific; IPC​::Open3 is portable.
This ticket should be closed.

-zefram

@p5pRT
Copy link
Author

p5pRT commented Dec 6, 2017

@cpansprout - Status changed from 'open' to 'rejected'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant