
В моей пьесе следующая строка должна возвращать 1
, и если она возвращается >1
, пьеса должна остановиться:
shell: ls -l /opt/tomcat/|grep "[ ]\+{{ newTomcatVer }}$"; echo $?
Моя игра действительно не удалась из-за этой ошибки:
"msg": "There is more than one /opt/tomcat/apache-tomcat-8.x.xx instance on server01, ending play"
После повторного запуска в режиме отладки я вижу, что эта команда оболочки представлена в отладочном выводе следующим образом:
"cmd": "ls -l /opt/tomcat/|grep \"[ ]\\+apache-tomcat-8.5.69$\"; echo $?",
В приведенном выше примере двойные кавычки экранированы \
символом . Вопрос в том, какая команда на самом деле используется — та, что в плейбуке, или та, которую мы видим в отладочном выводе?
Потому что если я выполню команду, которая есть в блокноте, т.е. без экранирующих символов, вывод будет 1
таким, как и ожидалось:
[tomcat@server01 ~]$ ls -l /opt/tomcat/|grep "[ ]\\+apache-tomcat-8.5.69$"; echo $?
1
Но если я введу команду, указанную в отладочном выводе, я получу следующее:
[tomcat@server01 ~]$ ls -l /opt/tomcat/|grep \"[ ]\\+apache-tomcat-8.5.69$\"; echo $?
grep: Invalid regular expression
2
Есть идеи, как решить эту проблему?
решение1
Использоватьодинокийкавычки в grep
команде.
grep "[ ]\+{{ newTomcatVer }}$"
При использовании двойных кавычек оболочка попытается выполнить расширение переменной, то есть попытается осмыслить $"
. Это происходит потому $\"
, что оболочка не распознает $"
параметр, который она может расширить, поэтому она пытается угадать, что вы хотели, и экранирует кавычки.
Нет никакой реальной причины делать здесь расширение параметров оболочки, поэтому вы можете поместить регулярное выражение в одинарные кавычки, чтобы решить проблему. Оболочка не будет пытаться делать расширение параметров и будет воспринимать буквально $
.
grep '[ ]\+{{ newTomcatVer }}$'