Вы хотите, чтобы оболочка применила замены переменных, что означает, что текст шаблона должен быть прочитан самой оболочкой как часть команды, но шаблон является также многострочным текстом, таким образом, это немного хитро для вхождения в ориентированную на строку обработку обычно сделанного командами UNIX.
Один подход должен был бы использовать здесь-документы удара (все команды, показанные, как введено при приглашении оболочки):
создайте шаблонный файл:
$ cat template.txt
Hi, $NAME
Welcome to $PLACE
экспортируйте переменные, которыми нужно заменить в тексте шаблона:
$ export NAME=Bob
$ export PLACE='unix&linux'
создайте переменную оболочки, которая содержит единственную "новую строку" \n
символ; в ударе самый легкий путь состоит в том, чтобы просто открыть строку, ввести новую строку и закрыть его:
$ newline='
> '
наконец, назовите удар, чтобы сделать замену:
$ bash -c "cat <<__EOF__${newline}$(cat template.txt)${newline}__EOF__"
Hi, Bob
Welcome to unix&linux
Почему это работает? Давайте вскроем противоречия в нем от нижней части: Вы просите колотить для выполнения команды ( -c
опция), но подстановка переменных ${newline}
и расширение команды $(cat ...)
произойдите в родительской оболочке прежде bash -c ...
на самом деле выполняется. Таким образом, результат - это bash -c
видит командную строку, которая встраивает новые строки и целый текст шаблона. Это - как будто Вы ввели следующее при подсказке удара:
cat <<__EOF__
...contents of template.txt...
__EOF__
Также обратите внимание, что подставляемые переменные должны быть экспортированы, так как переменные присвоены в родительской оболочке, но это - "дочерний" удар, который делает замену.
Обратите внимание, однако, что этот подход может легко привести к заключению в кавычки проблем: так как текст шаблона интерпретируется оболочкой удара, обратные галочки расширены, который мог бы привести к командам, выполняемым в Вашей системе.
То, что Вы обеспечили, кажется, корректно; можно проверить это java
вызывается правильно путем вставки echo
в команду:
find $DIR -type f -name '*.html' -exec echo java -jar $BASEDIR/Upload/htmlcompressor-1.5.3.jar --remove-intertag-spaces {} \;
(принятие правильно POSIX совместимая система, которая имеет невстроенные версии оболочки builtins по стандарту PATH
).
Кроме того, Вы могли бы хотеть выполнить одну из получающихся команд вручную, чтобы проверить, что она работает правильно.
-o
, для определения выходного файла иначе это просто работает, не сохраняя изменения. Так... мое плохое при не наблюдении этого в documenation. Однако, как я добираюсьfind
управлять для присоединения правильного входного файла к параметру? Сама команда должна бытьjava -jar htmlcompressor.jar -o output.html input.html
. Я хочу, чтобы ввод и вывод был тем же, таким образом:java -jar htmlcompressor.jar -o same.html same.html
. Как я добираюсьfind
команда, чтобы сделать это? – Questioner 08.04.2012, 10:38