How can I use bash syntax in Perl's system()?


Question

How can I use bash syntax in Perl's system() command?

I have a command that is bash-specific, e.g. the following, which uses bash's process substitution:

 diff <(ls -l) <(ls -al)

I would like to call it from Perl, using

 system("diff <(ls -l) <(ls -al)")

but it gives me an error because it's using sh instead of bash to execute the command:

sh: -c: line 0: syntax error near unexpected token `('
sh: -c: line 0: `sort <(ls)'
1
14
2/20/2009 10:16:33 PM

Accepted Answer

Tell Perl to invoke bash directly. Use the list variant of system() to reduce the complexity of your quoting:

my @args = ( "bash", "-c", "diff <(ls -l) <(ls -al)" );
system(@args);

You may even define a subroutine if you plan on doing this often enough:

sub system_bash {
  my @args = ( "bash", "-c", shift );
  system(@args);
}

system_bash('echo $SHELL');
system_bash('diff <(ls -l) <(ls -al)');
46
9/27/2011 1:46:00 PM

 system("bash -c 'diff <(ls -l) <(ls -al)'")

should do it, in theory. Bash's -c option allows you to pass a shell command to execute, according to the man page.


Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow
Icon