loader

เมื่อใดควรใช้ #! / bin / bash แทนที่จะใช้ #! / bin / sh ใน Shell Script

Anonim

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

เซสชันคำถามและคำตอบของวันนี้มาถึงเราโดยความอนุเคราะห์จาก SuperUser ซึ่งเป็นส่วนย่อยของ Stack Exchange กลุ่มที่ขับเคลื่อนด้วยชุมชนของเว็บไซต์ถาม - ตอบ

คำถาม

ผู้อ่าน SuperUser Hendre ต้องการทราบเมื่อใช้ #! / bin / bash แทนที่จะดีกว่า #! / bin / sh ในเชลล์สคริปต์:

เมื่อใดที่เหมาะสมที่จะใช้ #! / bin / bash แทนที่จะเป็น #! / bin / sh ในเชลล์สคริปต์

เมื่อใดควรใช้ #! / bin / bash แทน #! / bin / sh ในเชลล์สคริปต์

คำตอบ

grawity ผู้สนับสนุน SuperUser มีคำตอบสำหรับเรา:

ในระยะสั้น:

  • มีเชลล์หลายตัวที่ใช้ชุดข้อมูลจำเพาะ POSIX sh ในระบบที่แตกต่างกัน / bin / sh อาจเป็นลิงก์ไปยัง ash, bash, dash, ksh, zsh เป็นต้นมันสามารถใช้งานร่วมกันได้กับ sh ไม่ว่าจะเป็น csh หรือปลา
  • ตราบใดที่คุณยังคงคุณลักษณะ sh เท่านั้นคุณสามารถ (และอาจควร) ใช้ #! / bin / sh และสคริปต์ควรทำงานได้ดีไม่ว่าเชลล์จะอยู่ที่ใด
  • หากคุณเริ่มใช้คุณสมบัติเฉพาะของ bash (เช่นอาร์เรย์) คุณควรร้องขอ bash เป็นพิเศษเนื่องจากแม้ว่า /bin / sh จะเรียกใช้ bash บนระบบของคุณแล้วมันอาจไม่ได้อยู่ในระบบของทุกคนและสคริปต์ของคุณจะไม่ทำงานที่นั่น เช่นเดียวกับ zsh และ ksh แน่นอน
  • แม้ว่าสคริปต์นั้นมีไว้สำหรับการใช้งานส่วนตัวเท่านั้นคุณอาจสังเกตเห็นว่าระบบปฏิบัติการบางระบบเปลี่ยนแปลง / bin / sh ระหว่างการอัพเกรด ตัวอย่างเช่นบน Debian เคยเป็นทุบตี แต่ภายหลังถูกแทนที่ด้วยเส้นประที่น้อยที่สุด สคริปต์ที่ใช้ bashisms แต่มี #! / bin / sh พังทันที

อย่างไรก็ตาม:

  • แม้ #! / bin / bash นั้นไม่ถูกต้อง ในระบบที่แตกต่างกันทุบตีอาจอยู่ใน / usr / bin / usr / pkg / bin หรือ / usr / local / bin
  • ตัวเลือกที่เชื่อถือได้มากขึ้นคือ #! / usr / bin / env bash ซึ่งใช้ $ PATH แม้ว่าเครื่องมือ env นั้นจะไม่ได้รับการรับประกันอย่างเข้มงวด แต่อย่างใด / usr / bin / env ยังคงทำงานได้ในระบบมากกว่าที่ / bin / bash ทำ


มีสิ่งที่จะเพิ่มคำอธิบายหรือไม่ ปิดเสียงในความคิดเห็น ต้องการอ่านคำตอบเพิ่มเติมจากผู้ใช้ Stack Exchange คนอื่นหรือไม่ ลองอ่านหัวข้อสนทนาเต็มได้ที่นี่