Обратные кавычки используют /bin/sh
, и хотя <( ... )
является чем-то, что распознается bash
, оно не распознается оболочкой bourne. Если вы используете обратные кавычки, вам нужно будет использовать команды оболочки
my $bash_cmd = ...;
my @lines = `bash -c $bash_cmd`;
Building sh
и bash
, используя String :: ShellQuote .
use String::ShellQuote qw( shell_quote );
my $file5_quoted = shell_quote($file5);
my $file6_quoted = shell_quote($file6);
my $awk_cmd = shell_quote("awk", "-F,", '{print $3","$1}');
my $bash_cmd = '/usr/bin/join -j 1 -t,'
. " <( $awk_cmd $file5_quoted | sort )"
. " <( $awk_cmd $file6_quoted | sort )";
my $sh_cmd = shell_quote("bash", "-c", $bash_cmd);
my @lines = `$sh_cmd`;
Мы можем использовать IP C :: System :: Simple s capturex
, чтобы избежать запуска большего количества оболочек, чем необходимо, а также для обеспечения проверки ошибок. Для этого замените две последние строки вышеприведенного на следующее:
use IPC::System::Simple qw( capturex );
my @lines = capturex("bash", "-c", $bash_cmd);