Score:3

นามสกุลไฟล์สคริปต์ Bash

ธง cn

ฉันมีเซิร์ฟเวอร์ที่ฉันมีสคริปต์หลายประเภท

สคริปต์เหล่านั้นจะต้องเปิดด้วยเชลล์ที่แตกต่างกันเช่น:

sh ./do_one_thing.sh
ทุบตี ./do_another_thing.sh

เดอะ .sh ส่วนขยายเป็นอันตรายต่อฉันโดยเฉพาะอย่างยิ่งหากฉันไม่ได้เชื่อมต่อกับเซิร์ฟเวอร์เป็นเวลานาน หรือถ้าใครไม่คุ้นเคยก็ต้องแสตนอิน
ฉันอาจดำเนินการโดยไม่ตั้งใจ sh ./do_another_thing.sh

มันจะสร้างความแตกต่างหรือไม่ถ้าฉันตั้งชื่อสคริปต์ของฉัน do_another_thing.bash? สิ่งนี้จะสร้างชั้นของการป้องกันความผิดพลาดอีกชั้นหนึ่ง

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

Score:8
ธง ru

shebang ที่ด้านบนสุดของไฟล์กำหนดว่าล่ามใดทำงานเมื่อคุณเรียกใช้ ./name_of_file (สมมติว่าสามารถเรียกใช้งานได้)

#!/bin/แมว
ทดสอบ 123

จะพิมพ์ไฟล์ด้านบนเมื่อคุณเรียกใช้ด้วย ./name_of_fileตามที่มันจะทำงาน ชื่อแมว_of_file.

#!/bin/echo
สวัสดีชาวโลก

ก็จะพิมพ์ ชื่อ_of_fileเพราะมันวิ่ง ก้อง name_of_file.

การตั้งค่าให้เป็น bash หรือ sh จะช่วยให้คุณเลือกได้ว่าจะใช้ล่ามตัวใด ตราบใดที่คุณจำได้ว่าต้องเรียกใช้ด้วย ./name_of_file.

ที่ถูกกล่าวว่าใช้ .sh สำหรับ sh และ .ทุบตี สำหรับการทุบตีทำงานได้ดีแม้ว่าจะไม่ได้มาตรฐานก็ตาม นามสกุลไฟล์ค่อนข้างลื่นไหลบนลินุกซ์

typecasto avatar
ru flag
@user68186 อ๊ะ! แก้ไขแล้ว
paul garrett avatar
cx flag
นามสกุลไฟล์ไม่เพียง "ไหล" เท่านั้นฉันคิดว่าพวกเขาส่วนใหญ่ไม่สนใจใช่ไหม
in flag
@paulgarrett ขึ้นอยู่กับแอปพลิเคชันที่แน่นอนเป็นอย่างมาก แต่ส่วนใหญ่ในเกือบทุกแพลตฟอร์มนอกเหนือจาก Windows, macOS หรือ Android ที่สนใจเกี่ยวกับประเภทไฟล์จะดูที่เนื้อหาไฟล์หรือข้อมูลเมตาและถอยกลับไปใช้นามสกุลไฟล์หากทำไม่ได้ มิฉะนั้นกำหนดประเภทไฟล์
Score:5
ธง ng

บรรทัด shebang กำหนดล่ามในกรณีนี้ /ถัง/ทุบตี. หากคุณมักจะใช้ตัวแปลเดียวกันสำหรับสคริปต์เดียว นี่คือที่ที่คุณกำหนด ซึ่งช่วยให้คุณไม่ต้องกำหนดในคำสั่งของคุณ มันไม่สมเหตุสมผลเลยที่จะใช้ shebang เพื่อกำหนดล่ามที่คุณไม่ต้องการใช้สำหรับสคริปต์นั้น

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

ไม่ว่าในกรณีใด ไม่สำคัญว่าคุณจะตั้งชื่อสคริปต์ว่าอะไร ไม่จำเป็นต้องมีส่วนขยายด้วยซ้ำ

มีคำถามที่ดีเกี่ยวกับ ยูนิกซ์&ลินุกซ์ ที่มีข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนี้

Score:1
ธง cn

หากชื่อไฟล์ที่มีชุดบิตการอนุญาตการเรียกใช้งานถูกพิมพ์บนบรรทัดคำสั่ง หรือหากชื่อของไฟล์ดังกล่าวถูกส่งไปยังการเรียกใช้ตัวแปร exec*() ตัวใดตัวหนึ่งของไลบรารีรันไทม์ C เคอร์เนล Linux จะพยายาม โหลดและดำเนินการ

สิ่งแรกที่เคอร์เนลของ Linux ทำคืออ่านสองสามไบต์แรกของไฟล์ โดยมองหาลำดับ "มายากล" ที่รู้จัก หนึ่งในลำดับมายากลเหล่านั้นสามารถตีความได้ว่าเป็นสตริง ASCII "#!" เรียกอีกอย่างว่า "hash bang" และย่อเป็น "shebang" เมื่อตัวโหลดเห็นเช่นนั้น มันจะแปลส่วนที่เหลือของบรรทัดเป็นชื่อของไฟล์อื่นไปยัง exec โดยส่งไฟล์แรกเป็นอาร์กิวเมนต์ ค่าวิเศษอีกค่าหนึ่งคือ "\x7fELF" ซึ่งเป็นไฟล์เรียกทำงานแบบไบนารีแบบคลาสสิก เช่น /bin/sh เอง โปรดทราบว่าค่าดีฟอลต์สำหรับตัวโหลดเคอร์เนล หากไฟล์ไม่มีเวทย์มนตร์ที่จดจำได้คือ exec /bin/sh และส่งชื่อไฟล์เป็นอาร์กิวเมนต์แรก -- เทียบเท่ากับการมี shebang ของ "#!/bin /sh".

ผลก็คือ การทำเครื่องหมายสคริปต์ว่าปฏิบัติการได้โดยใช้ chmod +x ./do_one_thing.sh ร่วมกับ shebang ของ "#!/bin/sh" เทียบเท่ากับ sh ./do_one_thing.sh. "นามสกุลไฟล์" หรือแนวคิดอื่นๆ ของ DOS นั้นไม่เกี่ยวข้องกันจริงๆ นอกเหนือไปจาก DOS ระบบปฏิบัติการรุ่นก่อนอย่าง CP/M และระบบปฏิบัติการรุ่นหลังอย่าง Microsoft Windows

หากคุณต้องการระดับการป้องกันความผิดพลาดที่ดีที่สุด ให้ทำเครื่องหมายไฟล์ว่าสามารถเรียกใช้งานได้และใช้ shebang ที่เหมาะสม อย่าพึ่งพามนุษย์ในการทำสิ่งที่ถูกต้อง

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา