【问题标题】:Unable to escape some characters in a Unix command无法转义 Unix 命令中的某些字符
【发布时间】:2011-11-17 06:50:37
【问题描述】:

我正在尝试创建 iwatch 来监视目录中某些文件的更改。这似乎很简单,但我在转义命令字符串时遇到了问题。这是一个例子:

 iwatch -r -x '\.git' -t 'django\.po' -c 'echo ''Hello''' -e modify ./myapplication/locale/

这会监视除.git 目录之外的所有*.po 文件的/myapplication/locale/,当文件被修改时,它会运行命令echo 'Hello'

...但是当我尝试使用稍微复杂一点的命令时,我得到了错误:

 iwatch -r -x '\.git' -t 'django\.po' -c 'echo git pull && whoami' -e modify ./myapplication/locale/

git pull && whoami 命令是一个有效的 Unix 命令,但我认为我需要以某种方式对其进行转义才能使其工作。我在&&的部分出现错误

关于我做错了什么的任何想法。

谢谢。


编辑#1:尝试迈克尔的建议:

iwatch -r -x '\.git' -t 'django\.po' -c "bash -c 'git pull && whoami'" -e modify ./giosg-chat/locale/

...这是错误。

:5: parser error : xmlParseEntityRef: no name
    <path type="recursive" events="modify" exec="bash -c 'git pull && whoami'" a
                                                                    ^
:5: parser error : xmlParseEntityRef: no name
    <path type="recursive" events="modify" exec="bash -c 'git pull && whoami'" a

【问题讨论】:

    标签: bash shell unix ubuntu


    【解决方案1】:

    git pull &amp;&amp; whoami 不是您所说的“有效的 UNIX 命令”。 &amp;&amp; 是一个shell 操作,几乎可以肯定iwatch-c 标志不支持它。一种解决方法可能是编写一个执行复合操作的脚本,然后将该脚本作为参数传递给-c 标志。

    【讨论】:

    • 或者你可以使用iwatch -c "bash -c 'git pull &amp;&amp; whoami'"
    • +1 @Michael,这是一个很好的解决方案,不涉及外部脚本。
    • 那也行不通。请看看我的编辑。似乎后台有某种 XML 解析器在遇到这些字符时会失败。 :|
    • 解决了。请看我的回答。
    【解决方案2】:

    似乎正在使用某种 XML 处理命令字符串,并且在 XML 中,所有与号都需要转义。这是一个讨论:

    http://lists.xml.org/archives/xml-dev/200106/msg00223.html

    这行得通:

    iwatch -r -x '\.git' -t 'django\.po' -c 'echo git pull &amp;&amp; whoami' -e modify ./myapplication/locale/
    

    【讨论】:

      【解决方案3】:

      在shell中,单引号内没有特殊字符,第一个单引号(在起始单引号之后)结束单引号。这意味着您首先显示的调用并没有完全按照您的想法:

      iwatch -r -x '\.git' -t 'django\.po' -c 'echo ''Hello''' \
          -e modify ./myapplication/locale/
      

      iwatch 命令实际上与您输入的结果相同:

      iwatch -r -x '\.git' -t 'django\.po' -c 'echo Hello' \
          -e modify ./myapplication/locale/
      

      所以,shell 实际运行的是:

      echo Hello
      

      而不是

      echo 'Hello'
      

      输出没有区别;输入有差异。要发现差异,您需要在输入中添加空格,包括双空格,例如:

      -c 'echo ''Hello  Double  Spaced  World'''
      

      将输出带有单个空格的值。如果你真的想在 'Hello' 周围加上 iwatch 的单引号,你必须写:

      iwatch -r -x '\.git' -t 'django\.po' -c 'echo '\''Hello'\''' \
         -e modify ./myapplication/locale/
      

      或:

      iwatch -r -x '\.git' -t 'django\.po' -c 'echo '\''Hello'\' \
         -e modify ./myapplication/locale/
      

      魔法咒语'\''的意思是:

      • 关闭当前的单引号字符串
      • 包括一个单引号(即反斜杠和下一个单引号)
      • 重启单引号字符串

      在第一个例子中,下一个字符再次是单引号字符串的结尾;第二个去掉了两个相邻的单引号。

      您可以证明这适用于:

      -c 'echo '\''Hello  Double  Spaced  World'\'
      

      这将输出带有双空格的值(除非iwatch 中的某些东西破坏了系统)。


      既然您现在发现了问题 - 该命令被视为 XML 并且您必须使用 &amp;amp; 将 & 符号传递给 shell - 我所说的主要是学术意义。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-08
        • 1970-01-01
        • 1970-01-01
        • 2014-03-25
        • 2019-12-08
        相关资源
        最近更新 更多