ใน Unix พูดอะไรคือความแตกต่างระหว่าง shell script และ executable?


9

ฉันเคยเห็นคำถามนี้ในเว็บไซต์นี้และทำให้ฉันถามคำถามนี้ ฉันต้องการทราบใน Unix พูดความแตกต่างระหว่างปฏิบัติการและเชลล์สคริปต์อะไร

คำตอบ:


12

ไฟล์เรียกทำงานหมายถึงไฟล์ใด ๆ ที่มีชุดบิตเรียกทำงานที่สามารถเรียกใช้งานได้ (แม้ว่าจะมีข้อผิดพลาดในการทำงานจริงของโปรแกรม)

เชลล์สคริปต์เป็นชนิดของไฟล์เรียกทำงานเฉพาะที่ตั้งใจจะตีความโดยเชลล์โดยใช้#!คำสั่งเพื่อระบุล่าม


12

สคริปต์ไฟล์ที่:

  • เป็นมนุษย์ที่อ่านได้ (อย่างน้อยสำหรับคนที่ได้รับการฝึกอบรมอย่างสมเหตุสมผลเช่นไฟล์นั้นประกอบด้วยอักขระที่พิมพ์ได้); และ
  • ล่ามเป็นที่เข้าใจโดยคำแนะนำที่อธิบายพฤติกรรมของโปรแกรม

เชลล์สคริปต์เป็นสคริปต์ที่มีล่ามเป็นเปลือก ในโลกยูนิกซ์“เปลือก” หมายถึงครอบครัวของเปลือกหอยที่มีลักษณะที่บอร์นเปลือก ; เชลล์ดังกล่าวที่ทันสมัย ​​(ash, bash, ksh, zsh, …) เป็นไปตามมาตรฐานเชลล์POSIX โดยทั่วไปแล้วคำว่า "เชลล์" สามารถรวมล่ามคำสั่งอื่น ๆ เช่น csh, tcsh, ปลา, ...


ปฏิบัติการเป็นไฟล์ใด ๆ ที่สามารถดำเนินการ เพื่อให้สามารถเรียกใช้งานได้อย่างมีประสิทธิภาพไฟล์จะต้องมีคุณสมบัติสองประการ:

  • ผู้ใช้จะต้องมีสิทธิ์ในการดำเนินการ สิ่งนี้สามารถเห็นได้ด้วยคำสั่งls -l: xอักขระต้องอยู่ในคอลัมน์สิทธิ์
  • รูปแบบของไฟล์ต้องเป็นรูปแบบที่ระบบรับรู้ว่าสามารถเรียกใช้งานได้ รูปแบบที่ปฏิบัติการสามารถแบ่งออกเป็นหลายประเภท:

    • Native executables ซึ่งประกอบด้วยรหัสเครื่องที่จัดระเบียบตามรูปแบบไบนารีที่ปฏิบัติการได้ของระบบปฏิบัติการ ระบบยูนิกซ์ที่ทันสมัยส่วนใหญ่ใช้รูปแบบเอลฟ์สำหรับไฟล์ประมวลผลดั้งเดิม
    • สคริป สคริปต์ที่สามารถเรียกทำงานได้คือไฟล์ที่ขึ้นต้นด้วยเส้นshebangประกอบด้วยอักขระสองตัว#!ตามด้วยพา ธ ไปยังไฟล์ ในการเรียกใช้ไฟล์ดังกล่าวเคอร์เนลจะเรียกใช้งานโปรแกรมล่ามและส่งพา ธ ไปยังสคริปต์เพื่อเป็นอาร์กิวเมนต์
    • อาจมีรูปแบบอื่น ๆ ขึ้นอยู่กับระบบ ตัวอย่างเช่น Linux สามารถลงทะเบียนรูปแบบไฟล์โดยพลการผ่านทางbinfmt_miscสิ่งอำนวยความสะดวก สิ่งนี้อนุญาตให้เรียกใช้ไฟล์ Java bytecode ผ่านJVM ที่ลงทะเบียนแล้วไฟล์ปฏิบัติการ Windows จะถูกเรียกใช้ผ่านWineเป็นต้น

โปรดทราบว่าการปฏิบัติการนั้นขึ้นอยู่กับระบบ ตัวอย่างเช่นไบนารี amd64 Linux สามารถทำงานได้บนระบบ amd64 Linux แต่ไม่ใช่ในระบบ 32 บิต ไบนารีสำหรับ Android ไม่สามารถใช้งานได้กับการติดตั้ง Linux ปกติ ไฟล์ปฏิบัติการ Windows นั้นใช้งานได้กับ Linux เท่านั้นหากมี Wine อยู่ สคริปต์ที่เริ่มต้นด้วยการเป็นปฏิบัติการเฉพาะในกรณีที่มีโปรแกรมอยู่ที่#!/usr/local/bin/ruby/usr/local/bin/ruby


เชลล์สคริปต์มักจะสามารถเรียกใช้งานได้ แต่อาจไม่สามารถเรียกใช้งานได้หากคุณไม่ได้รับอนุญาตให้เรียกใช้งาน คุณยังสามารถตีความมันได้โดยส่งต่อไปยังล่าม (เช่นbash /path/to/script) - "ตีความมัน" เป็นวิธีแฟนซีในการพูดว่า "ดำเนินการ"


2

เชลล์สคริปต์:

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

ชื่อสคริปต์สามารถ แต่ไม่จำเป็นต้องลงท้ายด้วย ".sh" หรือ ".bash" หรือ ".csh" เป็นต้น (ให้คำแนะนำเกี่ยวกับเชลล์ที่ควรจะเปิดตัวด้วย)

เพื่อความชัดเจนฉันจะถือว่า: ว่าชื่อสคริปต์และเปลือกมันควรจะมีการเปิดตัวในscriptbash

วิธีการทั่วไปที่จะเปิดตัวในเปลือกแล้วจะเป็น: หรือbash /absolute/path/to/the/script bash ./relative/path/to/the/scriptด้วยวิธีนี้มันไม่จำเป็นต้องมีบิตที่สามารถเรียกใช้งานได้เนื่องจากมันถูกอ่านโดย bash เท่านั้นซึ่งจะประมวลผลเนื้อหา

มันสามารถนอกจากนี้ยังมีการตั้งค่า + x (ปฏิบัติการ) เพื่ออนุญาตให้มีการเปิดใช้งานได้โดยตรงจากเชลล์เซสชั่ปัจจุบันของคุณกับ: / แน่นอนเส้นทาง / / เพื่อการ / / script (หรือ ./relative/path/to/the/script) ระวัง: โดยปกติเมื่อเปิดตัวด้วยวิธีนี้มันจะเปิดตัวผ่านเชลล์ที่คุณพิมพ์หรือผ่านเชลล์ posix (พฤติกรรมนั้นขึ้นอยู่กับระบบปฏิบัติการ) ดังนั้นจึงอาจไม่ได้เป็นเชลล์ที่ควรจะรัน นั่นเป็นเหตุผลที่คุณสามารถ (และควร) ระบุเป็นบรรทัดแรกของสคริปต์: #! / path / to / good / shell ซึ่งระบุถึงระบบปฏิบัติการของคุณว่าสคริปต์นั้นควรเปิดใช้งานโดย / path / to / good / shell แทน

ปฏิบัติการ:

ไฟล์สั่งการเป็นไฟล์ที่มีการตั้งค่า "x" บิตสำหรับผู้ใช้ / กลุ่ม (s) ที่ควรเปิดใช้งาน โดยทั่วไปจะเป็น "ไบนารี" หรือสคริปต์

เคล็ดลับ: file /some/fileสามารถบอกคุณเพิ่มเติมเกี่ยวกับเนื้อหาของไฟล์ ลองfile /usr/bin/bashหรือ file /etc/profileดูตัวอย่าง


คำสั่งของคุณเกี่ยวกับสคริปต์ shebangless ที่ดำเนินการโดยเชลล์ปัจจุบันของคุณไม่ถูกต้อง พฤติกรรมนี้ขึ้นอยู่กับระบบปฏิบัติการ โดยทั่วไปแล้วจะใช้เปลือก POSIX หรือล็อกอินเชลล์ของคุณ
jlliagre

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