Bash 无法在Unix命令中转义某些字符
我正试图用coinfigureBash 无法在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' …但当我尝试使用稍微复杂一点的命令时,
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 && whoami' -e modify ./myapplication/locale/
似乎正在使用某种XML处理命令字符串,在XML中,所有的符号都需要转义。下面是一个讨论:
这起到了作用:
iwatch -r -x '\.git' -t 'django\.po' -c 'echo git pull && 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解析器遇到这些字符时就会失败:|解决了。请看我的答案。