无法在Unix命令中转义某些字符

时间:2011-11-17 06:50:37

标签: bash shell unix ubuntu

我正在尝试使用iwatch来监视目录以查找某些文件的更改。它似乎引用简单,但我有问题逃避命令字符串。这是一个例子:

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

这将监视除/myapplication/locale/目录之外的所有*.po文件的.git,并且在修改文件时,它会运行命令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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

似乎正在使用某种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/

答案 2 :(得分:1)

在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'''

将使用单个空格输出值。如果你真的想得到单引号,你好&#39;到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;来获取shell的&符号 - 我所说的主要是学术上的重要性。