2017-08-03 113 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 

我試過了pipepipe,還用\ < \ <逃脫了< <,但是不起作用。

以下命令不起作用==>

`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期望傳遞給sh(或cmd在Windows)的命令。 您似乎有一個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'` 

如果你有瓦爾內插,它看起來像

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脫身,但它確實降低其IT以下幾點:

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

感謝ikegami..it爲我工作 – ran1n

3

我不會這裏甚至不打擾使用過程替換。只需使用普通的管道:

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

進程替換是最有用的命令(如datamash)需要在當前shell中運行,或當你想一個命令的輸出輸送到另一個命令只讀取來自命名文件,而不是其標準輸入。這兩種情況都不適用於此。