
내 플레이북에서 다음 줄은 을 반환해야 하며 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 }}$'