2017-08-03 14 views
1

Perlで<<()イディオムを逃れたが、それは私にエラーを与える方法「構文エラー:予期しないリダイレクト」私が実行しようとしているシステムのコマンドを持って

しようとすると、コマンド:

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

Readpipeを試しましたが、\ < \ <で< <をエスケープしましたが、動作しません。コマンド以下

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

二重引用符で囲まれた文字列リテラル(バッククォートを含む)の特殊文字は、 '\'、 '$'、 '@'と区切り文字です。 – ikegami

答えて

2

バッククォートは、別名readpipeは(Windowsの場合またはcmdshに渡されたコマンドを期待する==>は動作しません。 コマンドではなく、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` 
+0

おかげで池上は私のために働いた – ran1n

3

私はwouldnここでプロセス置換を使うのも面倒です。ただ、通常のパイプラインを使用します(datamashのような)コマンドは、現在のシェルで実行する必要があるとき

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

プロセス置換が最も有用である、またはあなただけの読み込み別のコマンドを1つのコマンドの出力を供給したいとき指定されたファイルから、その標準入力ではなくどちらの場合もここには適用されません。

関連する問題