我正在尝试使用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
答案 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 && 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,您必须使用&
来获取shell的&符号 - 我所说的主要是学术上的重要性。