Ansible 2.9.21: в команду оболочки добавлен нежелательный экранирующий символ «\»

Ansible 2.9.21: в команду оболочки добавлен нежелательный экранирующий символ «\»

В моей пьесе следующая строка должна возвращать 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 }}$'

Связанный контент