Perl脚本中的bash命令-将输出〈(传递给命令

kpbwa7wx  于 2022-11-15  发布在  Perl
关注(0)|答案(1)|浏览(173)

如果我在bash(debian 10)中执行以下命令:

comm -1 -3  <(sort $file1) <(sort $file2) > $output_file

我得到了预期的结果。
但如果我在perl脚本中尝试这样做:

`comm -1 -3  <(sort $file1) <(sort $file2) > $output_file`;

我得到了以下:

sh: 1: Syntax error: "(" unexpected

我怎样才能让它在perl中工作呢?

ocebsuys

ocebsuys1#

回勾使用/bin/sh(或cmd),而不是bash,因此需要构造一个POSIX shell命令,当然,该命令可以调用bash
以下代码实现了这一点,同时还修复了code injection错误:

use String::ShellQuote qw( shell_quote );

my $sort_cmd1 = shell_quote( "sort", "--", $file1 ) . ' 2>&1';
my $sort_cmd2 = shell_quote( "sort", "--", $file2 ) . ' 2>&1';
my $bash_cmd  = shell_quote( "comm", "-1", "-3" ) . " <( $sort_cmd1 ) <( $sort_cmd2 )";
my $sh_cmd    = shell_quote( "bash", "-c", $bash_cmd );

my $output = `$sh_cmd`;

use String::ShellQuote qw( shell_quote );

my $bash_cmd = 'comm -1 -3 <( sort -- "$1" 2>&1 ) <( sort -- "$2" 2>&1 )';
my $sh_cmd = shell_quote( "bash", "-c", $bash_cmd, "dummy", $file1, $file2 );

my $output = `$sh_cmd`;

相关问题