2015-03-13 41 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)"}