В оболочке внутри одинарных кавычек нет специальных символов, и первая одинарная кавычка (после начальной) завершает одинарные кавычки. Это означает, что ваш вызов, показанный первым, не делает то, что вы думаете:
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, и вам нужно использовать &
для передачи амперсандов в оболочку - то, что я сказал, в основном имеет академическое значение.