Ansible 2.9.21: se agrega el carácter de escape no deseado “\” en el comando de shell

Ansible 2.9.21: se agrega el carácter de escape no deseado “\” en el comando de shell

En mi libro de jugadas debería aparecer la siguiente línea 1y, si vuelve >1, la jugada debería detenerse:

shell: ls -l /opt/tomcat/|grep "[ ]\+{{ newTomcatVer }}$"; echo $?

De hecho, mi juego falló con este error:

"msg": "There is more than one /opt/tomcat/apache-tomcat-8.x.xx instance on server01, ending play"

Después de ejecutar nuevamente en modo de depuración, veo que este comando de shell se representa así en la salida de depuración:

"cmd": "ls -l /opt/tomcat/|grep \"[ ]\\+apache-tomcat-8.5.69$\"; echo $?",

En lo anterior, las comillas dobles tienen \caracteres de escape. La pregunta es, ¿qué comando se está utilizando realmente: el que está en el libro de jugadas o el que vemos en el resultado de depuración?

Porque si ejecuto el comando que está en el cuaderno, es decir, sin caracteres de escape, el resultado es 1el esperado:

[tomcat@server01 ~]$ ls -l /opt/tomcat/|grep "[ ]\\+apache-tomcat-8.5.69$"; echo $?
1

Pero si ejecuto el comando que está en el resultado de depuración, obtengo esto:

[tomcat@server01 ~]$ ls -l /opt/tomcat/|grep \"[ ]\\+apache-tomcat-8.5.69$\"; echo $?
grep: Invalid regular expression
2

¿Alguna idea de como resolver esto?

Respuesta1

Usarsolterocomillas en el grepcomando.

grep "[ ]\+{{ newTomcatVer }}$"

Cuando usa comillas dobles, el shell intentará hacer una expansión variable, lo que significa que intentará darle sentido $". Esto se debe a $\"que el shell no reconoce $"un parámetro que pueda expandir, por lo que intenta adivinar lo que quería y escapa de las comillas.

No hay ninguna razón real para expandir los parámetros del shell aquí, por lo que puede colocar la expresión regular entre comillas simples para resolver el problema. El shell no intentará realizar una expansión de parámetros y lo tratará $literalmente.

grep '[ ]\+{{ newTomcatVer }}$'

información relacionada