[英]Escaping parentheses in perl backticks for bash command
多年來我一直在使用反引號,但這是我第一次嘗試使用帶括號的命令。 我收到一個我無法弄清楚的錯誤。
我試過在多個地方用雙引號和 escaping 加上\
,但似乎沒有任何效果。 任何幫助,將不勝感激。
命令$file5
和$file6
是 perl 變量,而不是 bash。
@array = `/usr/bin/join -j 1 -t, <(cat $file5 | awk -F, '{print \$3","\$1}' | sort) <( cat $file6 | awk -F, '{print \$3","\$1}' | sort) `
錯誤:AH01215:sh:-c:第 0 行:意外標記“(”附近的語法錯誤,引薦來源:
反引號使用/bin/sh
,雖然<(... )
被bash
識別,但 bourne shell 無法識別。如果您使用反引號,則需要使用
my $bash_cmd = ...;
my @lines = `bash -c $bash_cmd`;
構建sh
和bash
shell 命令可以使用String::ShellQuote完成。
use String::ShellQuote qw( shell_quote );
my $file5_quoted = shell_quote($file5);
my $file6_quoted = shell_quote($file6);
my $awk_cmd = shell_quote("awk", "-F,", '{print $3","$1}');
my $bash_cmd = '/usr/bin/join -j 1 -t,'
. " <( $awk_cmd $file5_quoted | sort )"
. " <( $awk_cmd $file6_quoted | sort )";
my $sh_cmd = shell_quote("bash", "-c", $bash_cmd);
my @lines = `$sh_cmd`;
我們可以使用IPC::System::Simple的capturex
來避免啟動比需要更多的 shell,並提供錯誤檢查。 為此,將上面的最后兩行替換為以下內容:
use IPC::System::Simple qw( capturex );
my @lines = capturex("bash", "-c", $bash_cmd);
一種解決方法是創建一個 shell 腳本,它接受來自 perl 的兩個文件名,使用這兩個輸入文件處理連接,並將結果返回到 perl 數組。
#1. Create join.sh that contains these four lines: cat $1 | awk -F, '{print $3","$1}' | sort > 1.out cat $2 | awk -F, '{print $3","$1}' | sort > 2.out /usr/bin/join -j 1 -t, 1.out 2.out rm 1.out 2.out #2. Modify your perl statement to call join.sh as follows: @array=`join.sh $file5 $file6`;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.