簡體   English   中英

Glob 模式適用於 shell 命令,但不適用於 Perl 反引號

[英]Glob pattern works in shell command but not in Perl backticks

我在 3 個不同的目錄中有 3 個文件,我只需要打印來自 DIR 1 和 2 的文件

1 /tmp/CDE/fileA.log
2 /tmp/CFGH/fileB.log
3 /tmp/CILM_NO/fileC.log 

如果我從 bash /bin/ls /tmp/C{[AZ][AZ],[AZ][AZ][AZ]}/*.log它,我得到:

/tmp/CDE/fileA.log  /tmp/CFGH/fileB.log

如果我從腳本 perl 運行 ls bash 命令:

$cmd=`/bin/ls /tmp/C{[A-Z][A-Z],[A-Z][A-Z][A-Z]}/*.log`;
chomp($cmd);
print "$cmd\n";

我收到:

/bin/ls: cannot access /tmp/C{[A-Z][A-Z],[A-Z][A-Z][A-Z]}/*.log: No such file or directory

看起來我需要轉義\{ or \, or \}但得到相同的 output 並且它不起作用我也嘗試使用引號而不是 escaping 但仍然得到同樣的錯誤 Z78E6221F6393D13566871DB398F14CE6 不是權限問題

搞不定啊

(不是答案,是解釋)

在您的 shell

ls /tmp/C{[A-Z][A-Z],[A-Z][A-Z][A-Z]}/*.log

那使用 bash Brace Expansion Bash 將其擴展為

ls /tmp/C[A-Z][A-Z]/*.log /tmp/C[A-Z][A-Z][A-Z]/*.log

然后文件名擴展

在 perl

$cmd=`/bin/ls /tmp/C{[A-Z][A-Z],[A-Z][A-Z][A-Z]}/*.log`;

反引號將調用/bin/sh而不是bash ,因此不會發生大括號擴展

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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