นามสกุลไฟล์สำหรับสคริปต์เชลล์ยูนิกซ์ [ปิด]


45

บนวิกิพีเดียบทความสำหรับ. shพูดว่า:

สำหรับชนิดของไฟล์นามสกุล .sh ดูเปลือกบอร์น

หอยยูนิกซ์อื่น ๆ ล่ะ?

ฉันรู้ว่าshebang ถูกนำมาใช้ภายในไฟล์เพื่อระบุล่ามสำหรับการดำเนินการ แต่ผมสงสัยว่า:

  • ข้อดีและข้อเสียของไฟล์นามสกุลคืออะไรและไม่มีนามสกุลไฟล์?

4
บางครั้งเชลล์สคริปต์ที่ไม่มี shebang (หรือไม่มีสิทธิ์ exec) สามารถพบได้ ในกรณีดังกล่าวชื่อที่ลงท้ายด้วย. sh อาจเป็นคำแนะนำให้ผู้ใช้เรียกใช้ด้วยbash script.sh(หรือshแน่นอน)
Ansgar Esztermann

3
หากเชลล์สคริปต์มีส่วนขยายปกติจะเป็น. sh ฉันไม่เคยเห็นสคริปต์. ksh หรือ. bash เชลล์สคริปต์ส่วนใหญ่ไม่มีส่วนขยายเหมือนสคริปต์ทั้งหมดใน /etc/init.d/* เป็นตัวอย่าง
Richard Holloway

ในขณะที่บทสรุปแบบง่าย ๆ (ใช่หรือไม่ใช่) คือความเห็นสิ่งที่ต้องพิจารณาไม่ใช่
ctrl-alt-delor

คำตอบ:


35

ฉันจะเรียกเฉพาะ.shสิ่งที่ตั้งใจพกพาเท่านั้น (และหวังว่าจะพกพาได้)

มิฉะนั้นฉันคิดว่ามันเป็นการดีกว่าที่จะซ่อนภาษา ผู้อ่านระวังจะพบมันในบรรทัด shebang ต่อไป (ในทางปฏิบัติ.bashหรือ.zshอื่น ๆ …ไม่ได้ใช้คำต่อท้าย)


1
จากหน้านี้เพียงอย่างเดียวเราสามารถเห็นผู้คนจำนวนเล็กน้อยที่ใช้มันอยู่แล้ว ทำไมคุณถึงพูดว่าพวกเขา "ไม่ค่อยได้ใช้"? การอ้างอิงใด ๆ หรือสิ่งนี้ขึ้นอยู่กับประสบการณ์ของคุณเท่านั้น?
Pacerier

23

ฉันจะบอกว่าไม่มี "แนวทางปฏิบัติที่ดี" สำหรับส่วนขยายไฟล์ที่มีอยู่อย่างเคร่งครัดในด้านเทคนิค: ระบบไฟล์ Unix / Linux / * BSD ไม่สนับสนุนส่วนขยายต่อ se สิ่งที่คุณกำลังเรียกใช้ส่วนขยายเป็นเพียงคำต่อท้ายของชื่อไฟล์เดียว ซึ่งแตกต่างจากระบบไฟล์ VM / CMS, VMS, MS-DOS และ Windows และระบบปฏิบัติการที่มีจุดพิเศษใน inode-Moral-Equal เทียบเท่ากับส่วนขยาย

ตอนนี้ฉันคิดว่ามันโง่ไปหน่อยที่จะใส่คำต่อท้าย ".sh" หรือ ".ksh" หรือ ".bash" ลงในชื่อไฟล์สคริปต์เชลล์ โปรแกรมคือโปรแกรม: ไม่มีประโยชน์ในการแยกแยะสิ่งที่ถูกดำเนินการ ไม่มียูนิกซ์หรือลินุกซ์หรือเคอร์เนลอะไรก็ได้ที่ตัดสินใจเรียกล่ามในไฟล์บางไฟล์เพียงเพราะคำต่อท้ายชื่อไฟล์ มันทำโดย#!สายหรือลำดับ "หมายเลขเวทมนตร์" อื่น ๆ ของไบต์ที่จุดเริ่มต้นของไฟล์ ในความเป็นจริงการตัดสินใจว่าจะดำเนินการตามชื่อไฟล์ "นามสกุล" เป็นหนึ่งในปัจจัยที่ทำให้ Windows เป็นแม่เหล็กมัลแวร์ ดูจำนวนการหลอกลวงของมัลแวร์ Windows ที่เกี่ยวข้องกับไฟล์ชื่อ "something.jpg.exe" - โดยค่าเริ่มต้นที่ใหม่กว่า Windows จะไม่แสดงนามสกุล ".exe" และสนับสนุนให้ผู้ใช้คลิกสองครั้งที่ "

สิ่งที่คุณอาจคิดว่าเป็นคำสั่งตรงไปตรงมามักจะเป็นเชลล์สคริปต์ บางครั้งccได้รับ sh-script firefoxเป็น sh-script startxเป็น sh-script ฉันไม่เชื่อว่ามีประโยชน์ทางความคิดหรือองค์กรในการทำเครื่องหมายสคริปต์ด้วยคำต่อท้าย ".sh"


24
ฉันไม่เห็นด้วย! งานของฉันประกอบด้วยการบรรจุแอปพลิเคชันที่เกี่ยวข้องกับไฟล์หลายพันไฟล์ตั้งแต่ไบนารีที่ปฏิบัติการไปจนถึงเชลล์สคริปต์ (ksh, bash และ csh ดั้งเดิม) ให้ฉันเชื่อว่าฉันมันไม่สร้างความแตกต่างเพื่อให้สามารถที่จะรู้ได้อย่างรวดเร็ว (หรือใน regex ก) สิ่งที่ชนิดของไฟล์ที่เราจะคุยและเรากำลังมองหา ประเด็นของฉันคือว่าอาจมีประโยชน์ในการแยกความแตกต่างสิ่งที่ได้รับ excuted และแนวปฏิบัติที่ดีที่สุดควรสนับสนุนให้ระบุชนิดของไฟล์อย่างชัดเจน
rahmu

4
@rahmu: เขียนขึ้นเป็นคำตอบ ให้รายละเอียดบางอย่างเกี่ยวกับวิธีที่ชื่อที่แยกได้ของ regex ช่วยคุณจัดทำแพ็คเกจ โปรดสังเกตการโต้ตอบระหว่างสิ่งที่ตีความไฟล์และคำต่อท้ายของชื่อไฟล์และวิธีที่ช่วยคุณในการทำงาน ฉันสนใจในการโต้แย้งอย่างรุนแรงต่อมุมมองของฉันและฉันยินดีที่จะเปลี่ยนแปลงหากฉันมั่นใจ ฉันยกระดับความคิดเห็นของคุณเพื่อพิสูจน์
Bruce Ediger

3
ฉันชอบที่จะโชคร้ายที่ฉันสามารถพูดถึงประสบการณ์ในปัจจุบันของฉันในงานปัจจุบัน ผมไม่ทราบว่ามากเกี่ยวกับการปฏิบัติที่ดีและมาตรฐานทั่วไป ; ฉันรู้สึกว่าฉันควรทำวิจัยก่อนโพสต์คำตอบที่นี่ ฉันจะดูเป็นมันคืนนี้หลังจากที่ทำงาน :)
rahmu

2
@rahmu คำสั่ง "file" มีอยู่สำหรับการพิจารณาประเภทไฟล์ มันมีความสามารถในการจำแนกสคริปต์ที่เขียนขึ้นสำหรับเชลล์ที่แตกต่างกัน
Matt

3
หากคุณให้.shส่วนขยายของเชลล์สคริปต์คุณจะต้องพิมพ์.shส่วนนั้นเป็นส่วนหนึ่งของชื่อคำสั่งเมื่อเริ่มต้น นั่นเป็นเหตุผลหลักว่าทำไมฉันไม่ชอบที่จะใส่ส่วนขยายนั้น (เหมือนกับสิ่งที่มีเส้น Shebang) BTW ปัญหาใน Windows ไม่ใช่.exeคำนำหน้าต่อ se (มันเป็นเรื่องเล็กน้อยที่จะทำให้ปฏิบัติการที่มีชื่อimage.jpgใน Linux หลังจากทั้งหมด) แต่ความจริงที่ว่า Windows มักจะซ่อนส่วนขยายนั้นรวมกับความจริงที่ว่าการกระทำที่จำเป็นในการเริ่มปฏิบัติการและ เพื่อเปิดเอกสารเหมือนกันทุกประการ
celtschk

12

ในฐานะที่เป็นคนที่ทำงานในสภาพแวดล้อมที่หลากหลายฉันต้องเขียนในเปลือกหอยที่หลากหลาย เชื่อหรือไม่ว่าในทุกแพลตฟอร์มเชลล์จะไม่เหมือนกัน ดังนั้นหากคุณบำรุงรักษาห้องสมุดส่วนตัวของคุณในหลาย ๆ เชลล์ (เมื่อจำเป็น) มันมีประโยชน์มากในการใช้ส่วนขยายเพื่อระบุ ID ของเชลล์ ด้วยวิธีนี้เมื่อคุณย้ายไปยังแพลตฟอร์มอื่นและเชลล์แตกต่างกันเล็กน้อยคุณรู้ว่าสคริปต์ใดที่จะกำหนดเป้าหมายสำหรับการแก้ไข .sh .ksh .bsh .csh ...


ดูเหมือนว่าจะเห็นด้วยกับunix.stackexchange.com/questions/31760/…
Pacerier

คุณไม่มี#!สคริปต์ตอนเริ่มต้น (เช่น#!/bin/bash) หรือไม่?
ctrl-alt-delor

Gnu / Linux, BSD และ UNIX เป็น Unix ทั้งหมด ไม่จำเป็นต้องมี? ระวัง Linux เป็นเคอร์เนล, Android ใช้ Linux แต่ไม่ใช่ Unix (เว้นแต่คุณจะเพิ่มซอฟต์แวร์เพิ่มเติมซึ่งในกรณีนี้คุณมีแอป Unix)
ctrl-alt-delor

@ Ctrl-Alt-Delor: "ยูนิกซ์" เป็นเครื่องหมายการค้า ผู้คนมักใช้ "? ระวัง" เพื่อหลีกเลี่ยงปัญหาเครื่องหมายการค้า (และคนเดินเท้า)
JS

@JS `UNIX 'เป็นเครื่องหมายการค้าของ The Open Group Unix และ unix ไม่ใช่greens.org/about/unix.html
ctrl-alt-delor

5

อย่างที่คุณพูดไว้ส่วนขยายไฟล์ Unix นั้นเป็นข้อมูลล้วนๆ คุณเพียงแค่ต้องการให้สคริปต์ของคุณมี shebang ที่ถูกต้องและสามารถเรียกใช้งานได้

.shคุณสามารถมีนามสกุลหรือไม่ใช้

ฉันใช้แบบแผนต่อไปนี้โดยไม่คำนึงถึงเชลล์ที่ใช้ (csh, tcsh, bash, sh, ... ):

  • ไม่มีส่วนขยายสำหรับระบบหรือสคริปต์ระดับสูง (หายากมาก)
  • .shสคริปต์คลาสสิกระดับต่ำถึงระดับสูง

คุณหมายถึงอะไรโดย "สคริปต์คลาสสิกเกรดต่ำถึงสูง"
Pacerier

ฉันคิดว่าฉันหมายถึงนามธรรมหรือระดับองค์กรโดยที่ นั่นคือคุณไม่สนใจเครื่องมือภาษา / สคริปต์ที่ใช้หลังคำสั่ง: ดังนั้นคุณจึงไม่ต้องใช้ส่วนขยายใด ๆ สำหรับคนอื่น ๆ เป็นเรื่องดีที่รู้ว่ามันเป็น bash หรือสคริปต์ ksh shell ที่แปลกใหม่ (มีนามสกุลที่เหมาะสม) ... แต่นั่นเมื่อ 2 ปีก่อน))
Ouki

5

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

สิ่งที่ทั้งนามสกุลไฟล์ชื่อใน Mircosoft ของ Windows เป็นระเบียบ: ยกตัวอย่างเช่นสิ่งที่จะได้รับa.audio, b.audio, c.audioเป็นa.mp3, b.wav, c.oggและเป็นd.picture, e.picture, f.picture d.jpeg, e.png, f.gifเวลาส่วนใหญ่เราไม่สนใจรูปแบบเสียงหรือรูปภาพเรายังต้องใช้เวลาในการสอนนามสกุลไฟล์ทั้งหมดให้กับผู้ใช้ใหม่เป็นเวลานาน


อีกเหตุผลหนึ่งที่จะไม่ใช้*.shฉันเพียงแค่วิ่งเข้าไปคือ Debian ของrun-partsจะไม่เรียกใช้สคริปต์ที่มีส่วนขยายเช่นใน/etc/cron.*/: archive.oreilly.com/pub/post/runparts_scripts_a_note_about.html
รอสส์แพตเตอร์สัน

3

ส่วนขยายของเชลล์สคริปต์มีประโยชน์มาก ตัวอย่างเช่นฉันมักจะเขียนสคริปต์ที่มีหลายไฟล์ในหลายภาษา (เช่น. bash, awk และ lua) ในไดเรกทอรีเดียวกัน ถ้าฉันต้องการค้นหาสตริงในไฟล์ทุบตีเท่านั้นส่วนขยายทำให้มันมีประโยชน์มากเพื่อลดผลบวกผิด ๆ หรือถ้าฉันต้องการนับจำนวนบรรทัดของรหัส bash ของฉันทั้งหมดสำหรับโครงการนั้น

เป็นความเจ็บปวดที่ต้องพิมพ์ส่วนขยายเมื่อเรียกใช้โปรแกรมดังนั้นฉันจึงสร้าง symlink โดยไม่ต้องมีส่วนขยายไปยังโปรแกรมหลักเพื่อแก้ไข / เรียกใช้โดยไม่จำเป็นต้องพิมพ์ส่วนขยายในแต่ละครั้ง Symlinks มีราคาถูกและใช้งานง่าย


ดูเหมือนว่าจะเห็นด้วยกับunix.stackexchange.com/questions/31760/ …
Pacerier

2

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

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