2011-11-17 78 views
0

我試圖設置iwatch來監視某個目錄以更改某些文件。這似乎是引用簡單,但我有問題逃避命令字符串。這裏有一個例子:無法在Unix命令中轉義某些字符

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 

回答

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/ 
1

git pull && whoami不像您說的那樣是「有效的UNIX命令」。 &&是一個shell操作,幾乎可以肯定不會由-c標誌iwatch支持。解決方法可能是編寫一個執行復合操作的腳本,然後將該腳本作爲參數傳遞給-c標誌。

+2

或者你可以使用'iwatch -c「bash -c'git pull && whoami''' –

+0

+1 @Michael,這是一個不涉及外部腳本的好方法。 –

+0

這也行不通。請看看我的編輯。似乎在後臺遇到這些字符時會出現某種XML解析器失敗。 :| –

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/ 

那麼,是什麼殼運行居然是:

echo Hello 

,而不是

echo 'Hello' 

輸出沒有區別;輸入有差異。要發現差異,您需要在輸入中包含雙倍空格,例如:

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

它將輸出值爲單個空格。如果你真的想避開 '你好' 單引號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;獲得&符號的殼 - 我說的是主要的學術意義。