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

system() command not handling bash redirects #12270

Closed
p5pRT opened this issue Jul 13, 2012 · 8 comments
Closed

system() command not handling bash redirects #12270

p5pRT opened this issue Jul 13, 2012 · 8 comments

Comments

@p5pRT
Copy link

p5pRT commented Jul 13, 2012

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

Searchable as RT114120$

@p5pRT
Copy link
Author

p5pRT commented Jul 13, 2012

From pae9@leicester.ac.uk

Created by pae9@leicester.ac.uk

Shell redirects in commands passed through "system()" are not
working properly. Specifically the bash "&>" operator is being
interpreted as a "&" (i.e. run in background).

e.g.​:

system ("ls &> some_file");

Should give no standard output, but create "some_file". This is what
happens if the ls is called from a bash shell (and what happened in perl
15.4.1). But in my Perl install instead "ls &" is executed, i.e. ls gets
called in the background, and some_file is not created.

This is particularly problematic as I have (many, many) bits of code such as

system ("command1 &> command1.log");
system ("command2");

Where command1 produces files which are then used by command2. At present,
as command1 is executed in the background, command2 is called before
command1
has completed, with disasterous results.

I have checked that the alternative syntax

system ("command1 > command1.log 2>&1");

does work, but obviously I'd rather recover the old Perl behaviour than
edit all of my scripts.

Perl Info

Flags:
     category=core
     severity=medium

Site configuration information for perl 5.14.2:

Configured by Debian Project at Fri Mar 23 17:14:02 UTC 2012.

Summary of my perl5 (revision 5 version 14 subversion 2) configuration:

   Platform:
     osname=linux, osvers=2.6.24-31-server, 
archname=x86_64-linux-gnu-thread-multi
     uname='linux allspice 2.6.24-31-server #1 smp tue feb 14 13:12:22 
utc 2012 x86_64 x86_64 x86_64 gnulinux '
     config_args='-Dusethreads -Duselargefiles -Dccflags=-DDEBIAN 
-Dcccdlflags=-fPIC -Darchname=x86_64-linux-gnu -Dprefix=/usr 
-Dprivlib=/usr/share/perl/5.14 -Darchlib=/usr/lib/perl/5.14 
-Dvendorprefix=/usr -Dvendorlib=/usr/share/perl5 
-Dvendorarch=/usr/lib/perl5 -Dsiteprefix=/usr/local 
-Dsitelib=/usr/local/share/perl/5.14.2 
-Dsitearch=/usr/local/lib/perl/5.14.2 -Dman1dir=/usr/share/man/man1 
-Dman3dir=/usr/share/man/man3 -Dsiteman1dir=/usr/local/man/man1 
-Dsiteman3dir=/usr/local/man/man3 -Duse64bitint -Dman1ext=1 
-Dman3ext=3perl -Dpager=/usr/bin/sensible-pager -Uafs -Ud_csh -Ud_ualarm 
-Uusesfio -Uusenm -Ui_libutil -DDEBUGGING=-g -Doptimize=-O2 -Duseshrplib 
-Dlibperl=libperl.so.5.14.2 -des'
     hint=recommended, useposix=true, d_sigaction=define
     useithreads=define, usemultiplicity=define
     useperlio=define, d_sfio=undef, uselargefiles=define, usesocks=undef
     use64bitint=define, use64bitall=define, uselongdouble=undef
     usemymalloc=n, bincompat5005=undef
   Compiler:
     cc='cc', ccflags ='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN 
-fno-strict-aliasing -pipe -fstack-protector -I/usr/local/include 
-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64',
     optimize='-O2 -g',
     cppflags='-D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing 
-pipe -fstack-protector -I/usr/local/include'
     ccversion='', gccversion='4.6.3', gccosandvers=''
     intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
     d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
     ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', 
lseeksize=8
     alignbytes=8, prototype=define
   Linker and Libraries:
     ld='cc', ldflags =' -fstack-protector -L/usr/local/lib'
     libpth=/usr/local/lib /lib/x86_64-linux-gnu /lib/../lib 
/usr/lib/x86_64-linux-gnu /usr/lib/../lib /lib /usr/lib
     libs=-lgdbm -lgdbm_compat -ldb -ldl -lm -lpthread -lc -lcrypt
     perllibs=-ldl -lm -lpthread -lc -lcrypt
     libc=, so=so, useshrplib=true, libperl=libperl.so.5.14.2
     gnulibc_version='2.15'
   Dynamic Linking:
     dlsrc=dl_dlopen.xs, dlext=so, d_dlsymun=undef, ccdlflags='-Wl,-E'
     cccdlflags='-fPIC', lddlflags='-shared -O2 -g -L/usr/local/lib 
-fstack-protector'

Locally applied patches:



@INC for perl 5.14.2:
     /usr/local/swift/build39/x86_64-unknown-linux-gnu-libc2.15-0/lib/perl
     /usr/local/star/Perl/lib/perl5/site_perl/5.10.0
     /home/pae9/soft/myperl/lib/perl5/site_perl/5.12.3
     /home/pae9/soft/myperl
     /etc/perl
     /usr/local/lib/perl/5.14.2
     /usr/local/share/perl/5.14.2
     /usr/lib/perl5
     /usr/share/perl5
     /usr/lib/perl/5.14
     /usr/share/perl/5.14
     /usr/local/lib/site_perl
     .


Environment for perl 5.14.2:
     HOME=/home/pae9
     LANG=en_GB.UTF-8
     LANGUAGE=en_GB:en
 
LD_LIBRARY_PATH=/usr/local/swift/build39/x86_64-unknown-linux-gnu-libc2.15-0/lib:/home/pae9/soft/lib:/home/pae9/soft/cuda/lib64:/home/pae9/soft/cuda/lib
     LOGDIR (unset)
 
PATH=/usr/local/swift/build39/x86_64-unknown-linux-gnu-libc2.15-0/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/pae9/bin:/home/pae9/soft/bin:/home/pae9/soft/cuda/bin:/home/pae9/bin:/home/pae9/soft/bin:/home/pae9/soft/cuda/bin
 
PERL5LIB=/usr/local/swift/build39/x86_64-unknown-linux-gnu-libc2.15-0/lib/perl:/usr/local/star/Perl/lib/perl5/site_perl/5.10.0:/home/pae9/soft/myperl/lib/perl5/site_perl/5.12.3:/home/pae9/soft/myperl
 
PERLLIB=/usr/local/swift/build39/x86_64-unknown-linux-gnu-libc2.15-0/lib/perl
     PERL_BADLANG (unset)
     SHELL=/bin/bash

@p5pRT
Copy link
Author

p5pRT commented Jul 13, 2012

From @jkeenan

On Fri Jul 13 01​:45​:21 2012, PhilEvans wrote​:

This is a bug report for perl from pae9@​leicester.ac.uk,
generated with the help of perlbug 1.39 running under perl 5.14.2.

Shell redirects in commands passed through "system()" are not
working properly. Specifically the bash "&>" operator is being
interpreted as a "&" (i.e. run in background).

e.g.​:

system ("ls &> some_file");

Should give no standard output, but create "some_file". This is what
happens if the ls is called from a bash shell (and what happened in
perl
15.4.1). But in my Perl install instead "ls &" is executed, i.e. ls
gets
called in the background, and some_file is not created.

Assuming I understand your post correctly, I cannot reproduce the errant
behavior.

On Darwin/PPC​:
#####
$ cd tmp/114120/
[114120] 515 $ touch alpha beta gamma
[114120] 516 $ perl -e 'system(qq{ls &> some_file}) and die "Unable to ls"'
[114120] 517 $ cat some_file
alpha
beta
gamma
some_file
[114120] 518 $ perl -v |head -2 | tail -1
This is perl 5, version 16, subversion 0 (v5.16.0) built for darwin-2level
[114120] 519 $ /usr/local/bin/perl5.14.2 -e 'system(qq{ls &>
some_other_file}) and die "Unable to ls"'
[114120] 520 $ cat some_other_file
alpha
beta
gamma
some_file
some_other_file
#####

Similar results using Perl 5.16.0 and 5.14.0 on Linux/386.

Thank you very much.
Jim Keenan

@p5pRT
Copy link
Author

p5pRT commented Jul 13, 2012

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

@p5pRT
Copy link
Author

p5pRT commented Jul 13, 2012

From @jandubois

On Fri Jul 13 01​:45​:21 2012, PhilEvans wrote​:

Shell redirects in commands passed through "system()" are not
working properly. Specifically the bash "&>" operator is being
interpreted as a "&" (i.e. run in background).

e.g.​:

system ("ls &> some_file");

I suspect that your /bin/sh is no longer a symlink to /bin/bash but to
/bin/dash instead. Ubuntu made this change in the 06.10 release and
Debian followed it in Debian Squeeze. Did you upgrade your OS recently?

This change is unrelated to your choice of interactive shell. If you
want to use bash syntax in system(), you must invoke `bash -c` explicitly.

@p5pRT
Copy link
Author

p5pRT commented Jul 13, 2012

From @ikegami

On Fri, Jul 13, 2012 at 5​:45 PM, James E Keenan via RT <
perlbug-followup@​perl.org> wrote​:

On Fri Jul 13 01​:45​:21 2012, PhilEvans wrote​:

This is a bug report for perl from pae9@​leicester.ac.uk,
generated with the help of perlbug 1.39 running under perl 5.14.2.

Shell redirects in commands passed through "system()" are not
working properly. Specifically the bash "&>" operator is being
interpreted as a "&" (i.e. run in background).

Perl doesn't use bash. It uses sh. If you want to use bash, use

system ("bash", "-c", "ls &> some_file");

@p5pRT
Copy link
Author

p5pRT commented Jul 13, 2012

@ikegami - Status changed from 'open' to 'resolved'

@p5pRT
Copy link
Author

p5pRT commented Jul 13, 2012

@ikegami - Status changed from 'resolved' to 'rejected'

@p5pRT p5pRT closed this as completed Jul 13, 2012
@p5pRT
Copy link
Author

p5pRT commented Jul 13, 2012

From tchrist@perl.com

Shell redirects in commands passed through "system()" are not
working properly. Specifically the bash "&>" operator is being
interpreted as a "&" (i.e. run in background).

e.g.​:

system ("ls &> some_file");

Should give no standard output, but create "some_file". This is what
happens if the ls is called from a bash shell (and what happened in
perl
15.4.1). But in my Perl install instead "ls &" is executed, i.e. ls
gets
called in the background, and some_file is not created.

That's the correct behavior. system uses Bourne shell syntax,
not bash.

--tom

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