バッククォートは、別名readpipe
は(Windowsの場合またはcmd
)sh
に渡されたコマンドを期待する==>は動作しません。 コマンドではなく、bash
コマンドが表示されます。修正:@chepnerが気づいたよう
`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`
ようになり、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`
二重引用符で囲まれた文字列リテラル(バッククォートを含む)の特殊文字は、 '\'、 '$'、 '@'と区切り文字です。 – ikegami