เหตุใดจึงใช้ `bash -c` ในหัวหน้างานแทนที่จะเรียกใช้สคริปต์โดยตรง


11

ฉันเริ่มใช้supervisordเพื่อควบคุมบริการต่างๆในเซิร์ฟเวอร์ของฉัน ฉันไม่ใช่ผู้ใช้ระดับมืออาชีพของ linux แต่สามารถใช้งานได้ดีและใช้งานได้

เพิ่งจากความอยากรู้ฉันพบว่าคำสั่งใน supervisord ส่วนใหญ่ดูเหมือนจะเรียกว่า:

[program:install]
command=bash -c "/src/etc/install.sh"

ฉันอ่านคนทุบตีและรู้ว่า-cควรใช้เพื่อแทรกตัวแปรที่ส่งผ่านหลังจากสตริง

ดังนั้นอะไรคือจุดที่ใช้bash -cในหัวหน้างาน (หรือที่อื่น ๆ ) แทนที่จะเรียกสคริปต์โดยตรง (เช่นตัวอย่างด้านล่าง) โดยพิจารณาว่าไม่มีตัวแปรที่ผ่าน / ใช้งานหรือไม่

[program:install]
command=/src/etc/install.sh

ขอบคุณ!

คำตอบ:


11

เชลล์มีการขยายตัวเช่นชื่อพา ธ ( *, ?) รายการคำสั่ง ( ;, &&, ||) การเปลี่ยนเส้นทาง ( <, >, |,) จะไม่ได้ดำเนินการโดย supervisord ว่ามีเพียงแยกคำสั่งลงในอาร์เรย์ของสตริงอาร์กิวเมนต์

bash -cอาจเป็นเพียงความช่วยเหลือสำหรับผู้ใช้มือใหม่ที่อาจถูกล่อลวงไปใช้คุณสมบัติดังกล่าวในคำสั่ง เช่นหลีกเลี่ยงความประหลาดใจที่

command=echo foo > /tmp/bar

ผลfoo > /tmp/barแทนการเขียนเพื่อfoo/tmp/bar

-cมีน้อยจะทำอย่างไรกับตัวแปร ข้อโต้แย้งใด ๆ เพิ่มเติมเพื่อทุบตีเท่านั้นที่จะสามารถใช้งานได้เป็นข้อโต้แย้งสคริปต์$0, $1ฯลฯ ในคำสั่ง แต่คุณลักษณะที่มีไม่ค่อยใช้งานใด ๆ ยกตัวอย่างเช่นเอาท์พุทbash -c 'echo $0 $0' foofoo foo


1
ขอบคุณนั่นเป็นคำตอบที่จริงจังมากและอาจช่วยฉันได้มาก ฉันในฐานะผู้ใช้มือใหม่จะทำผิดพลาด (และไม่เคยคิดว่าจะbash -cเป็นทางออก!)
Daniel Costa

6

มันอธิบายไว้ในเอกสารประกอบ :

เชลล์จะไม่ถูกดำเนินการโดย supervisord เมื่อมันเรียกใช้กระบวนการย่อยดังนั้นตัวแปรสภาพแวดล้อมเช่น USER, PATH, HOME, SHELL, LOGNAME และอื่น ๆ จะไม่ถูกเปลี่ยนจากค่าเริ่มต้นหรือกำหนดไว้เป็นอย่างอื่น สิ่งนี้เป็นสิ่งสำคัญโดยเฉพาะอย่างยิ่งที่จะต้องทราบเมื่อคุณใช้งานโปรแกรมจาก supervisord ที่ทำงานเป็นรูทด้วย user = stanza ในการกำหนดค่า

เพื่อหลีกเลี่ยงปัญหานี้bash -cอาจถูกนำมาใช้


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