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 }}$'

관련 정보