2015-03-13 42 views
3

我有一個腳本P它接受文件名作爲參數:的zsh:命令替換和正確引用

P file1 file2 file3 .... 

我也有一個腳本G產生一個(通常短名單)文件名,一個文件名每行。在我想寫在zsh中的主腳本中,我想使用G生成要由P處理的文件名。天真的嘗試是這樣的:

P $(G) 

這工作了近很好,只是我生活在一個世界裏,惡意攻擊者享受與嵌入空格創建文件。如果G將生成的文件是這樣的名單:

one_file 
a file with spaces 

P將被稱爲

P one_file a file with spaces 

,而不是

P 'one_file' 'a file with spaces' 

一個顯而易見的解決辦法是膠水GP在一起不是通過命令替換,而是通過某種語言的小程序(Ruby,Perl,Python,Algol68,... ),它執行P的exec並將參數傳遞給stdin的讀取。

這將是微不足道的寫作,甚至可以重複使用。但是,我不知道,是否與它的抓鬥的好東西不會有解決這個問題的內置?

回答

3

這可以通過以下步驟實現:

P ${(f)"$(G)"} 

它將調用P作爲

P 'one_file' 'a file with spaces' 

如果G輸出是

one_file 
a file with spaces 

說明:

$(G)左右的雙引號告訴zshG的輸出作爲一個單詞(在單詞的詞義上)。

所以只是打電話

P "$(G)" 

將equivaent的

P 'one_file 
a file with spaces' 

這就是參數擴展標誌f進場。 ${(f)SOMEVAR}告訴zsh在換行符處將$SOMEVAR拆分爲單詞。除了參數(如SOMEVAR)之外,還可以使用${...}類型參數表達式中的命令替換(此處爲$(G)),這會導致命令P ${(f)"$(G)"}