Невозможно экранировать некоторые символы в команде Unix - PullRequest
0 голосов
/ 17 ноября 2011

Я пытаюсь настроить 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 ]

1 голос
/ 17 ноября 2011

Кажется, что командная строка обрабатывается с использованием какого-то 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 голос
/ 17 ноября 2011

В оболочке внутри одинарных кавычек нет специальных символов, и первая одинарная кавычка (после начальной) завершает одинарные кавычки. Это означает, что ваш вызов, показанный первым, не делает то, что вы думаете:

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

, который выводит значение с одним пробелом. Если вы действительно хотите получить одинарные кавычки от «Hello» до 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; для передачи амперсандов в оболочку - то, что я сказал, в основном имеет академическое значение.

1 голос
/ 17 ноября 2011

git pull && whoami не является «допустимой командой UNIX», как вы говорите.&& - это операция оболочки, которая почти наверняка не поддерживается флагом -c iwatch.Обходным путем может быть написание сценария, выполняющего составную операцию, а затем передача этого сценария в качестве аргумента для флага -c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...