代码之家  ›  专栏  ›  技术社区  ›  Rob Goodwin

将shell命令的输出分配给变量时不需要的shell扩展

  •  0
  • Rob Goodwin  · 技术社区  · 15 年前

    我正在导出本地原型SVN存储库的一部分以导入到其他repo中。我们在整个repo中设置了许多SVN属性,所以我想编写一个脚本来列出文件元素及其相应的属性。这是多么困难啊。

    所以我开始编写一个bash脚本,将svn proplist-v的输出分配给一个变量,这样我就可以检查指定的文件是否有任何属性。

    #!/bin/bash
    o=$(svn proplist -v "$1")
    echo $o
    

    现在,这可以很好地工作,并回送svn proplist命令的输出。但是如果proplist命令返回

    svn:ignore : * build
    

    它在*上执行shell扩展,并在build属性值之前插入整个目录列表。因此,如果目录中有a.txt、b.txt和build files/dirs,那么输出将是这样的。

    svn:ignore : a.txt b.txt build
    

    我想我需要某种程度上逃避输出或者一些东西来阻止扩展的发生,但是还没有找到一些有用的东西。还有其他的方法可以做到这一点,但我讨厌自己找不到什么。我必须管理,我想这一个打败了我(考虑到我可以花在这上面的时间)

    2 回复  |  直到 15 年前
        1
  •  2
  •   Adam Crume    15 年前
    echo "$o"
    

    将阻止扩展值。

        2
  •  1
  •   Kaleb Pederson    15 年前

    虽然它确实执行shell扩展,但它是在echo执行的。要查看此内容,请发布A set -x 在您的bash脚本中。下面是一个例子:

    #!/bin/sh
    set -x
    o=$(echo 'one two *')
    echo $o
    

    下面是您应该看到的输出:

    ++ echo 'one two *'
    + o='one two *'
    + echo one two others from expansion
    

    如果你引用 $o ,一切正常:

    ++ echo 'one two *'
    + o='one two *'
    + echo 'one two *'
    one two *
    

    你也可以试试 set -v .