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

Bash 无法在Unix命令中转义某些字符,bash,shell,unix,ubuntu,Bash,Shell,Unix,Ubuntu,我正试图用coinfigureiwatch来监视目录中某些文件的更改。这似乎很简单,但我在转义命令字符串时遇到了问题。下面是一个例子: iwatch -r -x '\.git' -t 'django\.po' -c 'echo ''Hello''' -e modify ./myapplication/locale/ 这将监视所有*.po文件(不包括.git目录)的/myapplication/locale/,并在修改文件时运行命令echo'Hello' …但当我尝试使用稍微复杂一点的命令时,

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

 iwatch -r -x '\.git' -t 'django\.po' -c 'echo ''Hello''' -e modify ./myapplication/locale/
这将监视所有
*.po
文件(不包括
.git
目录)的
/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
:5:解析器错误:xmlParseEntityRef:没有名称

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

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

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

这起到了作用:

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

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

这起到了作用:

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

在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'''
它将使用单个空格输出值。如果你真的想在iwatch的“Hello”周围加上单引号,你必须写:

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

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

  • 关闭当前单引号字符串
  • 包括一个单引号(即反斜杠和下一个单引号)
  • 重新启动单引号字符串
在第一个示例中,下一个字符再次是单引号字符串的结尾;第二个删除了两个相邻的单引号

您可以通过以下方式证明这一点:

-c 'echo '\''Hello  Double  Spaced  World'\'
它将输出带有双空格的值(除非
iwatch
中的内容破坏了系统)



既然您现在发现了这个问题—命令被视为XML,您必须使用
&将符号与shell连接-我所说的主要是学术上的重要性。

在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'''
它将使用单个空格输出值。如果你真的想在iwatch的“Hello”周围加上单引号,你必须写:

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

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

  • 关闭当前单引号字符串
  • 包括一个单引号(即反斜杠和下一个单引号)
  • 重新启动单引号字符串
在第一个示例中,下一个字符再次是单引号字符串的结尾;第二个删除了两个相邻的单引号

您可以通过以下方式证明这一点:

-c 'echo '\''Hello  Double  Spaced  World'\'
它将输出带有双空格的值(除非
iwatch
中的内容破坏了系统)



既然您现在发现了这个问题—命令被视为XML,您必须使用
&
将ampersands放到shell中-我所说的主要是学术上的重要性。

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