zsh:命令替换和正确引用

时间:2015-03-13 09:31:36

标签: zsh

我有一个脚本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'

一个明显的解决方案是将GP粘合在一起,而不是通过命令替换,而是通过某种语言的小程序(Ruby,Perl,Python,Algol68,......),它执行P的exec并将参数传递给stdin的读取。

写这个是微不足道的,甚至可以重复使用。但是,我想知道,是否 zsh 带着它的好东西不能解决内置的这个问题吗?

1 个答案:

答案 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>