Score:1

Ansible 2.9.21: มีการเพิ่ม escape char â\â ที่ไม่ต้องการในคำสั่งเชลล์

ธง cn

ใน playbook ของฉัน บรรทัดต่อไปนี้ควรกลับมา 1และถ้ามันกลับมา >1การเล่นควรหยุด:

เปลือก: ls -l /opt/tomcat/|grep "[ ]\+{{ newTomcatVer }}$"; ก้อง $?

การเล่นของฉันล้มเหลวด้วยข้อผิดพลาดนี้:

"msg": "มี /opt/tomcat/apache-tomcat-8.x.xx มากกว่าหนึ่งอินสแตนซ์บน server01 สิ้นสุดการเล่น"

หลังจากรันอีกครั้งในโหมดดีบั๊ก ฉันเห็นว่าคำสั่งเชลล์นี้ถูกแสดงในลักษณะนี้ในเอาต์พุตดีบั๊ก:

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

ในข้างต้น เครื่องหมายอัญประกาศคู่จะถูกหลีกด้วย \ อักขระ. คำถามคือ คำสั่งใดที่ใช้จริง - คำสั่งที่อยู่ใน playbook หรือคำสั่งที่เราเห็นในเอาต์พุตดีบั๊ก

เพราะถ้าฉันเรียกใช้คำสั่งที่อยู่ในโน้ตบุ๊ก เช่น โดยไม่มีอักขระหลีก ผลลัพธ์ที่ได้คือ 1 อย่างที่คาดไว้:

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

แต่ถ้าฉันออกคำสั่งที่อยู่ในเอาต์พุตการดีบัก ฉันจะได้รับสิ่งนี้:

[tomcat@server01 ~]$ ls -l /opt/tomcat/|grep \"[ ]\+apache-tomcat-8.5.69$\"; ก้อง $?
grep: นิพจน์ทั่วไปไม่ถูกต้อง
2

ความคิดใดที่จะแก้ปัญหานี้?

Score:2
ธง cz

ใช้ เดี่ยว คำพูดใน เกรป สั่งการ.

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

เมื่อคุณใช้อัญประกาศคู่ เชลล์จะพยายามขยายตัวแปร ซึ่งหมายความว่าจะพยายามทำความเข้าใจ $". ซึ่งจะออกมาเป็น $\" เพราะเชลล์ไม่รู้จัก $" เนื่องจากพารามิเตอร์สามารถขยายได้ ดังนั้นจึงพยายามคาดเดาสิ่งที่คุณต้องการและหลีกเครื่องหมายคำพูด

ไม่มีเหตุผลที่แท้จริงในการขยายพารามิเตอร์ของเชลล์ที่นี่ ดังนั้นคุณสามารถวาง regex ในเครื่องหมายคำพูดเดี่ยวเพื่อแก้ปัญหาได้ เชลล์จะไม่พยายามขยายพารามิเตอร์และจะปฏิบัติต่อ $ อย่างแท้จริง.

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

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา