代码之家  ›  专栏  ›  技术社区  ›  user1934428

zsh:命令替换和正确引用

zsh
  •  3
  • user1934428  · 技术社区  · 9 年前

    我有剧本 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 并将参数传递给从stdin读取的值。

    这对于编写来说很简单,甚至可以重用。然而,我想知道 zsh公司 有了一大堆好东西,就不会有解决这个问题的办法了吗?

    1 回复  |  直到 9 年前
        1
  •  4
  •   Adaephon Radek    9 年前

    这可以通过以下方式实现:

    P ${(f)"$(G)"}
    

    将调用 P

    P 'one_file' 'a file with spaces'
    

    如果 G

    one_file
    a file with spaces
    

    说明:

    两边的双引号 $(G) 告诉 zsh公司 获取的输出 G 作为一个单词(在单词的外壳意义上)。

    所以只是打电话

    P "$(G)"
    

    将等同于

    P 'one_file
    a file with spaces'
    

    这是 参数扩展标志 f 开始发挥作用。 ${(f)SOMEVAR} 告诉 zsh公司 要拆分 $SOMEVAR 在换行处转换为单词。而不是参数(如 SOMEVAR )还可以使用命令替换(此处 美元(克) )内部 ${...} 键入parmeter表达式,这将导致命令 P ${(f)"$(G)"} .