我有一个脚本P
,它接受文件名作为参数:
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'
一个明显的解决方案是将G
和P
粘合在一起,而不是通过命令替换,而是通过某种语言的小程序(Ruby,Perl,Python,Algol68,......),它执行P
的exec并将参数传递给stdin的读取。
写这个是微不足道的,甚至可以重复使用。但是,我想知道,是否 zsh 带着它的好东西不能解决内置的这个问题吗?
答案 0 :(得分:3)
这可以通过以下方式实现:
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
类型的parmeter表达式中使用命令替换(此处为$(G)
),而不是参数(如${...}
),这会导致命令P ${(f)"$(G)"}
。< / p>