ฉันควรใส่นามสกุลไฟล์ * .sh และ * .rb ในสคริปต์ทั้งหมดของฉันหรือไม่


20

ฉันมีสคริปต์ที่เรียกใช้งานได้จำนวนมากในไดเรกทอรี $ HOME / bin บางคนเขียนด้วย bash และบางคนเป็น Ruby พวกเขาทุกคนมีเส้น shebang ที่ด้านบนบอกว่า shell ใช้ล่ามอะไร (bash หรือ Ruby ในกรณีของฉัน)

ฉันสงสัยว่าจะดีกว่าหรือไม่ที่จะใส่นามสกุลไฟล์ลงในสคริปต์เหล่านี้เพื่อระบุภาษาสคริปต์ที่ใช้เขียน ตัวอย่างเช่นสคริปต์ใน Ruby จะมีส่วนต่อท้าย * .rb และสคริปต์ทุบตีจะมีส่วนต่อท้าย * .sh

ปัจจุบันสคริปต์เหล่านี้มีชื่อง่าย ๆ ที่ไม่มีนามสกุลไฟล์

วิธีปฏิบัติที่ดีที่สุดคืออะไร


1
มันง่ายพอที่จะแปลงจาก shebang เป็นส่วนขยายและกลับด้วยสคริปต์ง่าย ๆ ดังนั้นให้ลองและแก้ไขในภายหลังหากคุณต้องการ
Aaron J Lang

คำตอบ:


9

คุณสามารถทำคำสั่งไวด์การ์ดเช่นls *.rbหรือcp *.shหากคุณต้องการจัดระเบียบสคริปต์ของคุณในอนาคต

เริ่มต้นหรือเสียใจในภายหลังในความคิดของฉัน

ผู้แก้ไขเช่นvimนี้จะสามารถใช้การเน้นไวยากรณ์ที่ถูกต้องตามshebangหรือนามสกุลไฟล์

สิ่งนี้สามารถทำได้โดยใช้ modelines ในบรรณาธิการต่าง ๆ เช่นสำหรับกลุ่ม:

# vim: ft=sh

2
IMHO องค์กรทำได้ดีกว่าด้วยฟังก์ชั่นไม่ใช่ตามรายละเอียดของการใช้งาน
grawity

4
@grawity: ยังคงจัดโดยต่อท้ายง่ายกว่า grepping สำหรับ shebang ...
อากิระ

แม้ว่าฉันจะเห็นด้วยกับเหตุผล glob แต่บรรณาธิการส่วนใหญ่ฉลาดพอที่จะอ่าน shebang เพื่อกำหนดประเภทไฟล์
Homolka Rich

10

เป็นสิ่งที่ดีที่สุดในชีวิต: ขึ้นอยู่กับความต้องการของคุณ

คุณระบุว่าสคริปต์เหล่านี้อยู่ในไดเรกทอรี bin และฉันคิดว่าสคริปต์เหล่านี้จะถูกเรียกจากบรรทัดคำสั่ง ในฐานะผู้ใช้ฉันคิดว่ามันน่ารำคาญถ้าฉันต้องพิมพ์ bla.ksh หรือ foo.bash นอกจากนี้หากcoderตัดสินใจย้ายไปที่ล่ามอีกครั้งชื่อคำสั่งก็จะเปลี่ยนแปลงเช่นกันและฉันจะต้องแก้ไขสคริปต์อื่น ๆ ที่ใช้เครื่องมือเหล่านี้ - น่ารำคาญมากแม้ว่าผู้ใช้และcoderเป็นบุคคลเดียวกัน

แต่ในทางกลับกันฉันใช้ส่วนขยายเช่น. sh หรือ. tcl ในโครงการสร้างไดเรกทอรีของฉัน วิธีนี้ฉันสามารถใช้คุณสมบัติmakeเพื่อปรับใช้ไฟล์ลงในไดเรกทอรีปลายทาง - แต่ในขั้นตอนนี้ฉันจะลบคำต่อท้ายไฟล์


6

เห็นได้ชัดว่ามีความแตกต่างบางประการระหว่างไฟล์ปฏิบัติการในbinไดเรกทอรีและไฟล์ "ซอร์ส" ที่แก้ไขได้

  • สำหรับไฟล์ต้นฉบับจะมีประโยชน์ที่จะมีคำต่อท้ายเพื่อให้คุณสามารถเห็นสิ่งที่เป็นและเพื่อช่วยให้เครื่องมือที่ชาญฉลาดน้อยลงที่ไม่สามารถสแกน#!บรรทัด
  • สำหรับโมดูลที่พวกเขากำลังใช้โดยเฉพาะชุดที่เกี่ยวข้องของโปรแกรมทั้งหมดที่ใช้ล่ามเดียวกัน (หรือไม่มีล่าม) และมันก็เป็นธรรมดาที่จะรวม.pm, .shหรือ.soในกรณีดังกล่าว
  • สำหรับโปรแกรมที่ปฏิบัติการได้ชื่อของมันเป็นส่วนหนึ่งของ "สัญญาการเขียนโปรแกรม" ซึ่งผู้ใช้และสคริปต์อื่นเรียกใช้ มันเป็นสิ่งสำคัญที่ชื่อจะไม่เปลี่ยนแปลงแม้ว่าการดำเนินการจะ; ดังนั้นชื่อไฟล์จึงไม่ควรมีคำต่อท้าย

ในกรณีของโปรแกรมที่คอมไพล์ความแตกต่างระหว่าง "source" และ "executable" จะเห็นได้ชัด: หนึ่งประกอบด้วยซอร์สโค้ดส่วนอีกอันประกอบด้วยภาษาของเครื่องหรือ bytecode ตีความ ในกรณีของสคริปต์ไม่มีความแตกต่างที่เห็นได้ชัด แต่makeคำสั่งรักษาการแยกแบบ notional ระหว่าง "ซอร์สโค้ดสำหรับสคริปต์" และ "เวอร์ชันปฏิบัติการของสคริปต์": "คอมไพเลอร์" เริ่มต้นสำหรับ "เชลล์สคริปต์" เป็นเพียงcp.

ฉันขอแนะนำให้เก็บ$HOME/sourceไดเรกทอรีแยกต่างหากและ:

  • การเก็บ symlink เช่นทำโดยln -s ../source/foo.sh $HOME/bin/foo; หรือ
  • คัดลอกด้วยตนเองหลังจากทำการเปลี่ยนแปลง (และทดสอบ) โดยใช้install -m 755 foo.sh ../bin/foo; หรือ
  • ใช้Makefileกฎเพื่อทำการตรวจสอบไวยากรณ์ก่อนที่จะคัดลอกไฟล์ต้นฉบับจาก$HOME/sourceลงใน$HOME/bin

เชิงอรรถ: โมดูลเชลล์สคริปต์สามารถใช้งานได้โดยเชลล์สคริปต์อื่นเท่านั้นและแก้ไขบริบทภายในของสคริปต์นั้นโดยใช้คำสั่ง.หรือsourceบิวด์อิน สิ่งนี้แตกต่างจากสคริปต์ที่เรียกใช้งานได้ซึ่ง (เช่นโปรแกรมใด ๆ ) ทำงานเป็นกระบวนการแยกต่างหากและไม่สามารถแก้ไขกระบวนการหลักได้ ตามแบบแผนคร่าวๆโมดูลจะเข้าไปใน/usr/lib/name_of_program/name_of_module.shขณะที่คำสั่งเข้าไป/usr/bin/name_of_command(โดยไม่มีคำต่อท้าย)


3

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


ในทางกลับกันโมดูลและไลบรารีส่วนใหญ่มักจะมีส่วนขยาย ( .rbสำหรับโมดูล Ruby .soสำหรับ ELF shared library และอื่น ๆ )


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