2017-08-26 67 views
2

我有兩個文件。在Perl腳本中使用Linux通配符

〜/ directory1中/ 7120599_S1.txt

hello world! 

〜/ directory2/7120599_S7.txt

bye world! 

我在尋找的Perl代碼,將中7120599_S1.txt內容附加到年底7120599_S7.txt。在Linux下面的命令作品:

$貓〜/ directory1中/ 7120599_S1.txt >>〜/ directory2/7120599_S * .TXT

新的〜/ directory2/7120599_S7.txt

hello world! 
bye world! 

但出於某種原因,這並不在Perl工作

system "cat ~/directory1/7120599_S1.txt >> ~/directory2/7120599_S*.txt" 

相反,它會創建一個新的FIL e在directory2中稱爲7120599_S*.txt。我如何讓Perl識別Linux通配符?

+2

你在用什麼外殼? 'echo $ SHELL'你確定*'〜/ directory2/7120599_S7.txt'已經存在嗎? – Schwern

+0

@Schwern當我輸入'echo $ SHELL'時,我得到了'/ bin/bash'。我想我正在使用BASH shell。存在'〜/ directory2/7120599_S7.txt' – cooldood3490

回答

6

如果我們看一下POSIX shell

對於其他重定向操作符,後面的重定向操作應進行波浪線擴展,參數擴展,命令替換,算術擴展和引用刪除字。非交互式shell不應該對單詞進行路徑名擴展;一個交互式shell可能會執行它,但只有當擴展會導致一個單詞時纔會這樣做。

路徑名稱擴展是指像*.txt這樣的球體。

Bash shell並不精確地遵循POSIX,並且試圖更加方便和明智,包括即使在非交互模式下也將路徑名擴展應用於重定向目標。通常,您的交互式shell將是Bash。

但是,當您運行system命令時,它通常會運行一個更簡單的符合POSIX標準的shell(儘管這完全取決於您的操作系統)。通常這個外殼安裝爲/bin/sh

如果您想使用Bash,您必須明確運行Bash,例如

system "bash", "-c", "cat ~/directory1/7120599_S1.txt >> ~/directory2/7120599_S*.txt" 

順便說一句,你可以強制bash遵循POSIX如果你設置了POSIXLY_CORRECT環境變量。