簡體   English   中英

Escaping perl 中的括號 bash 命令的反引號

[英]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`;

構建shbash 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::Simplecapturex來避免啟動比需要更多的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM