如何逃避< <()在perl中的成语

时间:2017-08-03 20:15:48

标签: bash perl backticks

我有一个系统命令,我试图执行,但它给我错误“语法错误:重定向意外”

尝试命令:

datamash -ft, -g 1 mean 3 mean 4 < <(tail -n +2 yourfile | sort -t, -k1,2) | cut -d, -f1,2,5,6 

我尝试了readpipe并且还逃脱了&lt; &LT;用\&lt; \&lt;,但不起作用。

以下命令不起作用==&gt;

`datamash -ft, -g 1 mean 3 mean 4 \< \<(tail -n +2 yourfile | sort -t, -k1,2) | cut -d, -f1,2,5,6`

2 个答案:

答案 0 :(得分:3)

我甚至不打算在这里使用进程替换。只需使用普通的管道:

`tail -n +2 yourfile | sort -t, -k1,2 | datamash -ft, -g 1 mean 3 mean | cut -d, -f1,2,5,6`

当命令(如datamash)需要在当前shell中运行时,或者当您想要将一个命令的输出提供给仅从命名文件读取的另一个命令时,进程替换最有用,而不是它的标准输入。这两种情况都不适用。

答案 1 :(得分:2)

Backticks aka readpipe期望一个命令传递给sh(或Windows中的cmd)。 您似乎有bash命令而不是sh命令。修正:

`bash -c 'datamash -ft, -g 1 mean 3 mean 4 < <(tail -n +2 yourfile | sort -t, -k1,2) | cut -d, -f1,2,5,6'`

如果你有插入的vars,它看起来像

use String::ShellQuote ( shell_quote );

my $qfn = '...';
my $tail_cmd = shell_quote('tail', '-n', '+2', $qfn);
my $bash_cmd = "datamash -ft, -g 1 mean 3 mean 4 < <( $tail_cmd | sort -t, -k1,2 ) | cut -d, -f1,2,5,6";
my $sh_cmd = shell_quote('bash', '-c', $bash_cmd);
`$sh_cmd`

正如@chepner注意到的,bash命令可以转换为与sh兼容的更简单的命令。这会将第一个代码段减少到以下内容:

`tail -n +2 yourfile | sort -t, -k1,2 | datamash -ft, -g 1 mean 3 mean 4 | cut -d, -f1,2,5,6'`

这无法帮助我们避免在第二个代码段中使用shell_quote,但它确实减少了以下内容:

use String::ShellQuote ( shell_quote );

my $qfn = '...';
my $tail_cmd = shell_quote('tail', '-n', '+2', $qfn);
my $sh_cmd = "$tail_cmd | sort -t, -k1,2 | datamash -ft, -g 1 mean 3 mean 4 | cut -d, -f1,2,5,6";
`$sh_cmd`