我有一个脚本P,它接受文件名作为参数:
P file1 file2 file3 ....我还有一个脚本G,它生成一个文件名(通常是短列表),每行一个文件名。在我想用zsh编写的主脚本中,我想使用G生成由P处理的文件名。天真的尝试是这样的:
P $(G)这几乎很好,只是我生活在一个恶意的人喜欢用嵌入式空间创建文件的世界。如果G生成这样的文件列表:
one_file
a file with spacesP将被称为
P one_file a file with spaces而不是
P 'one_file' 'a file with spaces'一个明显的解决方案是将G和P粘合在一起,不是通过命令替换,而是用某种语言(Ruby、Python、Algol68、.)中的一个小程序,它执行P并将参数从stdin传递给读。
这将是微不足道的编写,甚至可以使可重用。然而,我想知道,zsh是否有一个解决这个问题的方法呢?
发布于 2015-03-13 11:58:02
这可以通过以下方式实现:
P ${(f)"$(G)"}它将调用P为
P 'one_file' 'a file with spaces'如果G的输出是
one_file
a file with spaces解释:
$(G)周围的双引号告诉zsh将G的输出作为一个单词(在单词的shell意义上)。
所以我只是打电话
P "$(G)"将是等价物
P 'one_file
a file with spaces'这就是参数展开标志f发挥作用的地方。${(f)SOMEVAR}告诉zsh在换行符处将$SOMEVAR拆分成单词。与参数(如SOMEVAR)不同,还可以在$(G)类型的${...}表达式中使用命令替换(此处为$(G)),这将导致命令P ${(f)"$(G)"}。
https://stackoverflow.com/questions/29028828
复制相似问题