เหตุใดการขยายพารามิเตอร์ bash ไม่ทำงานในไฟล์เซอร์วิส systemd


14

ฉันกำลังพยายามที่จะใช้systemd's EnvironmentFileและเพิ่มตัวเลือกในการคำสั่งเมื่อมีการตั้งค่าในแฟ้ม ฉันมีต่อไปนี้ในไฟล์หน่วย:

ExecStart=/usr/bin/bash -c "echo ${PORT:+port is $PORT}"

ซึ่งไม่ได้สะท้อนอะไรเลยเมื่อฉันเริ่มให้บริการ

งานต่อไปนี้เป็นไปตามที่คาดไว้:

ExecStart=/usr/bin/bash -c "echo port is $PORT"

ซึ่งหมายความว่าไฟล์อ่านอย่างถูกต้อง

การทดแทนพารามิเตอร์ยังทำงานบนบรรทัดคำสั่ง:

$ PORT=1234 bash -c 'echo ${PORT:+port is $PORT}'
port is 1234

ฉันกำลังคิดถึงอะไร

คำตอบ:


27

systemd ทำบรรทัดคำสั่งสไตล์เชลล์แบบเรียบง่ายในการแยกวิเคราะห์เนื้อหาExecStart=และพารามิเตอร์อื่น ๆ การแยกวิเคราะห์แบบเรียบง่ายนี้รองรับการแทนที่ตัวแปรสภาพแวดล้อมพื้นฐาน แต่ดูเหมือนจะไม่เหมือน${PORT:+port is $PORT}กัน

คุณจะต้องการป้องกัน systemd จากการทำเช่นนั้นและให้เชลล์ที่เรียกใช้จัดการมัน

จากเอกสารประกอบ:

ในการผ่านเครื่องหมายดอลลาร์ที่แท้จริงให้ใช้ " $$"

ลองทำสิ่งนี้:

ExecStart=/usr/bin/bash -c "echo $${PORT:+port is $$PORT}"

หรือดีกว่ายังลองสิ่งนี้:

ExecStart=/bin/sh -c "echo $${PORT:+port is $$PORT}"

เนื่องจากชนิดของการขยายตัวแปรที่คุณทำอยู่ที่นี่คือมาตรฐาน POSIX และไม่ใช่ bash-ism เมื่อใช้/bin/shแทนbashจะเป็นการลบการพึ่งพาที่ไม่จำเป็นbashออก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.