รูปแบบทั้งหมดของภาษาของเชลล์เป้าหมายนั้นแย่มากเมื่อเปรียบเทียบกับภาษาสคริปต์สมัยใหม่เช่น Perl, Python, Ruby, node.js และแม้แต่ Tcl (เนื้อหา) หากคุณต้องทำอะไรที่ซับซ้อนไปหน่อยคุณจะมีความสุขมากขึ้นในระยะยาวหากคุณใช้วิธีการด้านบนแทนที่จะเป็นเชลล์สคริปต์
ข้อได้เปรียบเพียงข้อเดียวที่เชลล์ภาษายังคงมีเหนือภาษาที่ใหม่กว่าคือสิ่งที่เรียกตัวเองว่า/bin/sh
รับประกันว่าจะมีอยู่ในทุกสิ่งที่อ้างว่าเป็นยูนิกซ์ อย่างไรก็ตามสิ่งที่อาจไม่เป็นไปตาม POSIX; หลายมรดกที่เป็นกรรมสิทธิ์ของ Unixes ทำให้เกิดความสับสนในภาษาที่นำมาใช้/bin/sh
และสาธารณูปโภคในเส้นทางเริ่มต้นก่อนที่จะมีการเปลี่ยนแปลงความต้องการโดย Unix95 (ใช่, Unix95, ยี่สิบปีที่ผ่านมาและนับ อาจมีชุด Unix95 หรือแม้แต่ POSIX.1-2001 หากคุณโชคดีเครื่องมือในไดเรกทอรีที่ไม่ได้อยู่ในเส้นทางเริ่มต้น (เช่น/usr/xpg4/bin
) แต่ไม่มีการรับประกันว่าจะมีอยู่จริง
อย่างไรก็ตามพื้นฐานของ Perl มีแนวโน้มที่จะมีอยู่ในการติดตั้ง Unix ที่เลือกโดยพลมากกว่า Bash คือ (โดย "พื้นฐานของ Perl ว่า" ผมหมายถึง/usr/bin/perl
มีอยู่และเป็นบางส่วนอาจจะค่อนข้างเก่ารุ่นของ Perl 5 และถ้าคุณโชคดีชุดของโมดูลที่มาพร้อมกับรุ่นของล่ามว่านอกจากนี้ยังมี.)
ดังนั้น:
หากคุณกำลังเขียนสิ่งที่ต้องทำงานทุกที่ที่อ้างว่าเป็น Unix (เช่นสคริปต์ "กำหนดค่า") คุณต้องใช้#! /bin/sh
และคุณไม่จำเป็นต้องใช้ส่วนขยายใด ๆ ทุกวันนี้ฉันจะเขียนเปลือกที่สอดคล้องกับ POSIX.1-2001 ในกรณีนี้ แต่ฉันจะเตรียมที่จะแก้ไข POSIXisms ถ้ามีคนถามหาการสนับสนุนเหล็กที่เป็นสนิม
แต่ถ้าคุณไม่ได้เขียนสิ่งที่ต้องทำงานทุกที่ในขณะนั้นเมื่อคุณถูกล่อลวงให้ใช้ Bashism ใด ๆ คุณควรหยุดและเขียนใหม่ทั้งหมดในภาษาสคริปต์ที่ดีกว่าแทน ตัวคุณในอนาคตจะขอบคุณ
(ดังนั้นเมื่อใดจึงเหมาะสมที่จะใช้ส่วนขยาย Bash เมื่อต้องการอันดับแรก: ไม่เคยลำดับที่สอง: เพียงเพื่อขยายสภาพแวดล้อมแบบโต้ตอบของ Bash - เช่นเพื่อจัดเตรียมการกรอกข้อมูลในแท็บสมาร์ทและการแจ้งแฟนซี
#!/bin/sh
และอย่าใช้อย่างอื่นนอกจากที่เปลือกดั้งเดิมให้ไว้