我有一个脚本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
and P
不是通过命令替换,而是通过某种语言(Ruby、Perl、Python、Algol68,....)的小程序一起执行,该程序执行P
并将参数传递给从标准输入读取。
这编写起来很简单,甚至可以重用。不过,我想知道,是否zsh有了它的好东西,就没有内置的解决方案来解决这个问题吗?
这可以通过以下方式实现:
P ${(f)"$(G)"}
这会调用P
as
P 'one_file' 'a file with spaces'
如果输出G
is
one_file
a file with spaces
解释:
周围的双引号$(G)
tell zsh获取输出G
作为一个单词(在单词 word 的 shell 意义上)。
所以只是打电话
P "$(G)"
将相当于
P 'one_file
a file with spaces'
这就是参数扩展标志 f
开始发挥作用。${(f)SOMEVAR}
tells zsh分开$SOMEVAR
换行处的单词。而不是参数(例如SOMEVAR
)还可以使用命令替换(此处$(G)
) 里面${...}
输入参数表达式,这会导致命令P ${(f)"$(G)"}
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)