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


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)'
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)" );

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

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

system_bash('echo $SHELL');
system_bash('diff <(ls -l) <(ls -al)');
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