อ่าน 8 นาที
เชบัง (ยูนิก)
ใน ทางคอมพิวเตอร์ ชี แบง (shebang) คือลำดับอักขระ #! ซึ่งประกอบด้วย อักขระเครื่องหมาย ตัวเลข (หรือที่เรียกว่า sharp หรือ hash) และ เครื่องหมายอัศเจรีย์ (หรือที่เรียกว่า bang)...
เชบัง (ยูนิก)
| #! | |
|---|---|
เชบัง |
ในทางคอมพิวเตอร์ชีแบง (shebang)คือลำดับอักขระ#!ซึ่งประกอบด้วยอักขระเครื่องหมาย ตัวเลข (หรือที่เรียกว่า sharp หรือ hash) และเครื่องหมายอัศเจรีย์ (หรือที่เรียกว่า bang) ที่อยู่ตอนต้นของสคริปต์นอกจากนี้ยังเรียกว่าsharp-exclamation , sha-bang , [ 1 ] [ 2 ] hashbang , [ 3 ] [ 4 ] pound-bang , [ 5 ] [ 6 ]หรือhash- pling [ 7 ]
เมื่อไฟล์ข้อความที่มี shebang ถูกใช้งานราวกับว่าเป็นไฟล์ปฏิบัติการในระบบปฏิบัติการแบบ Unix กลไก การโหลดโปรแกรมจะแยกวิเคราะห์ส่วนที่เหลือของบรรทัดแรกของไฟล์เป็นคำสั่งตัวแปล ตัวโหลดจะเรียกใช้ โปรแกรม ตัวแปล ที่ ระบุ โดยส่งพาธที่ใช้ในตอนแรกเมื่อพยายามเรียกใช้สคริปต์เป็นอาร์กิวเมนต์ เพื่อให้โปรแกรมสามารถใช้ไฟล์เป็นข้อมูลอินพุตได้[ 8 ]ตัวอย่างเช่น หากสคริปต์มีชื่อเป็นพาธ path /to/scriptและเริ่มต้นด้วยบรรทัด `/bin/sh` #!/bin/shตัวโหลดโปรแกรมจะได้รับคำสั่งให้เรียกใช้โปรแกรม`/bin/sh`โดยส่งpath/to/scriptเป็นอาร์กิวเมนต์แรก
โดยปกติแล้วตัวแปลภาษาจะไม่สนใจบรรทัด shebang เนื่องจากอักขระ "#" เป็น เครื่องหมาย แสดงความคิดเห็นในภาษาสคริปต์หลายภาษา ตัวแปลภาษาบางตัวที่ไม่ได้ใช้เครื่องหมายแฮชเพื่อเริ่มต้นความคิดเห็นอาจยังคงไม่สนใจบรรทัด shebang เพื่อรับรู้ถึงวัตถุประสงค์ของมัน[ 9 ]
ไวยากรณ์
รูปแบบของคำสั่งล่าม shebang มีดังนี้: [ 8 ]
#! ตัวแปลภาษา [ ตัวเลือกเสริม มีอาร์กิวเมนต์เพียงตัวเดียว ]
โดยที่interpreterคือเส้นทางไปยังโปรแกรมที่สามารถเรียกใช้งานได้ การเว้นวรรคระหว่าง#!และinterpreter นั้นเป็นทางเลือก อาจมีช่องว่างหรือแท็บจำนวนเท่าใดก็ได้ก่อนหรือหลังinterpreterอาร์กิวเมนต์เสริมจะรวมช่องว่างเพิ่มเติมใดๆ จนถึงท้ายบรรทัด
ในระบบลินุกซ์ไฟล์ที่ระบุโดยตัวแปลภาษาจะสามารถเรียกใช้งานได้หากไฟล์นั้นมีสิทธิ์ในการเรียกใช้งานและเป็นไฟล์ประเภทใดประเภทหนึ่งต่อไปนี้:
- ไฟล์ปฏิบัติการดั้งเดิม เช่นไบนารีELF
- ไฟล์ทุกประเภทที่ลงทะเบียนตัวแปลภาษาผ่าน กลไก binfmt_misc (เช่น สำหรับการเรียกใช้ ไฟล์ไบนารี .exe ของ Microsoft โดยใช้Wine )
- สคริปต์อีกตัวที่ขึ้นต้นด้วย shebang
บนระบบ Linux และMinixตัวแปลภาษาอาจเป็นสคริปต์ก็ได้ ลำดับของ shebang และ wrapper จะสร้างไฟล์ที่สามารถเรียกใช้งานได้โดยตรง ซึ่งรับสคริปต์ที่พบเป็นพารามิเตอร์ในลำดับย้อนกลับ ตัวอย่างเช่น ถ้าไฟล์/bin/Aเป็นไฟล์ที่สามารถเรียกใช้งานได้ใน รูปแบบ ELFไฟล์/bin/Bมี shebang #!/bin/A optparamและไฟล์/bin/Cมี shebang #!/bin/Bการเรียกใช้ไฟล์/bin/Cจะได้ผลลัพธ์เป็น/bin/B /bin/Cซึ่งสุดท้ายจะได้ผลลัพธ์/bin/A optparam /bin/B /bin/Cเป็น
ใน ระบบปฏิบัติการที่พัฒนามาจาก SolarisและDarwin (เช่นmacOS ) ไฟล์ที่ระบุโดยตัวแปลจะต้องเป็นไฟล์ไบนารีที่สามารถเรียกใช้งานได้ และตัวไฟล์เองจะต้องไม่ใช่สคริปต์[ 10 ]
หากเรียกใช้สคริปต์โดยการเรียกตัวแปลภาษาโดยตรง ระบบ#!จะไม่ตรวจสอบบรรทัดนั้นเลย ตัวอย่างเช่น หากscript.shบรรทัดแรกของสคริปต์คือ#!/usr/games/nibblesการเรียกใช้สคริปต์sh script.shจะไม่พยายามเปิดสคริปต์ในnibblesแต่./script.shจะ เปิดใน แทน
ตัวอย่าง
ตัวอย่างประโยคเด็ด ๆ ที่ใช้กันทั่วไป:
#!/bin/sh– เรียกใช้ไฟล์โดยใช้Bourne shellหรือ shell ที่เข้ากันได้ ซึ่งโดยปกติจะอยู่ในไดเร็กทอรี /bin#!/bin/bash– เรียกใช้ไฟล์โดยใช้เชลล์ Bash#!/usr/bin/pwsh– เรียกใช้ไฟล์โดยใช้PowerShell#!/usr/bin/env python3– เรียกใช้งานด้วย ตัวแปล ภาษา Pythonโดยใช้ เส้นทางการค้นหาโปรแกรม envเพื่อค้นหาไฟล์นั้น#!/bin/false– ไม่ทำอะไรเลย แต่ส่ง ค่าสถานะการออกที่ไม่ใช่ศูนย์กลับมาซึ่งบ่งชี้ถึงความล้มเหลว ใช้เพื่อป้องกันการเรียกใช้ไฟล์สคริปต์แบบเดี่ยวๆ ที่มีไว้สำหรับเรียกใช้ในบริบทเฉพาะ เช่น โดย.คำสั่งจาก sh/bash,sourceจาก csh/tcsh หรือเป็นไฟล์ .profile, .cshrc หรือ .login
บรรทัด Shebang อาจมีตัวเลือกเฉพาะที่ส่งผ่านไปยังตัวแปล อย่างไรก็ตาม การใช้งานจะแตกต่างกันในพฤติกรรมการแยกวิเคราะห์ตัวเลือก เพื่อความพกพาได้ ควรระบุเพียงตัวเลือกเดียวโดยไม่มีช่องว่างแทรก[ 11 ]แนวทางปฏิบัติเพิ่มเติมเกี่ยวกับความพกพาได้มีดังต่อไปนี้
วัตถุประสงค์
คำสั่งตัวแปลภาษาช่วยให้สามารถใช้สคริปต์และไฟล์ข้อมูลเป็นคำสั่งได้ โดยซ่อนรายละเอียดการใช้งานจากผู้ใช้และโปรแกรมอื่นๆ ด้วยการขจัดความจำเป็นในการใส่คำนำหน้าตัวแปลภาษาไว้หน้าสคริปต์ในบรรทัดคำสั่ง
ตัวอย่างเช่น พิจารณาสคริปต์ที่มีบรรทัดเริ่มต้น สคริปต์#!/bin/sh -xนี้สามารถเรียกใช้งานได้ง่ายๆ โดยระบุเส้นทางไฟล์ เช่นsome/path/to/foo[ 12 ] และพารามิเตอร์บางอย่าง เช่นbarและbaz:
เส้นทางบางส่วนไปยังบาร์อาหาร บาซ
ในกรณีนี้/bin/shจะมีการเรียกใช้แทนที่ โดยมีพารามิเตอร์-x, some/path/to/foo, bar, และbazราวกับว่าคำสั่งเดิมคือ
/bin/sh -x some/path/to/foo bar baz
โปรแกรมแปลภาษาส่วนใหญ่จะทำให้พารามิเตอร์เพิ่มเติมใดๆ พร้อมใช้งานสำหรับสคริปต์ หาก/bin/shเป็นเชลล์ที่เข้ากันได้กับ POSIXและbarจะbazถูกส่งไปยังสคริปต์ในรูปแบบของอาร์เรย์พารามิเตอร์ตามตำแหน่ง"$@"และแยกกันเป็นพารามิเตอร์"$1"และ"$2"ตามลำดับ
เนื่องจากเครื่องหมาย# ตัวแรก เป็นอักขระที่ใช้ในการแนะนำความคิดเห็นใน ภาษา เชลล์ POSIX (และในภาษาที่ตัวแปลภาษาอื่นๆ เข้าใจได้) ตัวแปลภาษาจึงละเลยบรรทัด shebang ทั้งหมด อย่างไรก็ตาม การละเลยบรรทัด shebang นั้นขึ้นอยู่กับตัวแปลภาษาเอง และไม่ใช่ทุกตัวที่จะทำเช่นนั้น ดังนั้น สคริปต์ที่ประกอบด้วยสองบรรทัดต่อไปนี้จึงแสดงผลทั้งสองบรรทัดเมื่อรัน:
#!/bin/cat สวัสดีชาวโลก!
จุดแข็ง
เมื่อเปรียบเทียบกับการใช้รายการการเชื่อมโยงทั่วโลกระหว่างนามสกุลไฟล์และแอปพลิเคชันตัวแปลภาษา วิธีการใช้คำสั่งตัวแปลภาษาช่วยให้ผู้ใช้สามารถใช้ตัวแปลภาษาที่ไม่เป็นที่รู้จักในระดับระบบทั่วโลกได้โดยไม่ต้องใช้สิทธิ์ผู้ดูแลระบบ นอกจากนี้ยังช่วยให้สามารถเลือกตัวแปลภาษาได้อย่างเฉพาะเจาะจงโดยไม่ทำให้เนมสเปซของนามสกุลไฟล์โอเวอร์ โหลด (ซึ่งนามสกุลไฟล์หนึ่งๆ อาจหมายถึงประเภทไฟล์มากกว่าหนึ่งประเภท) และช่วยให้สามารถเปลี่ยนภาษาที่ใช้ในการเขียนโปรแกรมสคริปต์ได้โดยไม่ต้องเปลี่ยนไวยากรณ์การเรียกใช้งานของโปรแกรมอื่นๆ ผู้เรียกใช้สคริปต์ไม่จำเป็นต้องรู้ว่าภาษาที่ใช้ในการเขียนโปรแกรมคืออะไร เนื่องจากสคริปต์เองเป็นผู้รับผิดชอบในการระบุตัวแปลภาษาที่จะใช้
พกพาสะดวก
สถานที่ตั้งโครงการ
คำ สั่ง Shebang ต้องระบุพาธแบบสัมบูรณ์ (หรือพาธที่สัมพันธ์กับไดเร็กทอรีการทำงาน ปัจจุบัน ) ไปยังไฟล์ปฏิบัติการของระบบ ซึ่งอาจทำให้เกิดปัญหาในระบบที่มี โครงสร้าง ไฟล์ ที่ไม่เป็นมาตรฐาน แม้ว่าระบบจะมีพาธที่เป็นมาตรฐานอยู่แล้ว ก็เป็นไปได้ที่ระบบปฏิบัติการเดียวกันจะมีตำแหน่งที่แตกต่างกันสำหรับตัวแปลภาษาที่ต้องการตัวอย่างเช่นPython อาจอยู่ใน /usr/bin/python3 , /usr/local/bin/python3หรือแม้แต่/home/username/bin/python3หากติดตั้งโดยผู้ใช้ทั่วไป
ปัญหาที่คล้ายกันนี้เกิดขึ้นกับเชลล์ POSIXเนื่องจาก POSIX กำหนดให้ชื่อเชลล์ต้องเป็นsh เท่านั้น แต่ไม่ได้กำหนดเส้นทาง ค่าทั่วไปคือ/bin/shแต่บางระบบ เช่น Solaris มีเชลล์ที่เข้ากันได้กับ POSIX ที่/usr/xpg4/bin/sh [ 13 ] ในระบบ Linux หลายระบบ/ bin/shเป็นลิงก์แบบฮาร์ดหรือแบบสัญลักษณ์ไปยัง/bin/bashซึ่ง เป็น เชลล์ Bourne Again (BASH) การใช้ไวยากรณ์เฉพาะของ bash ในขณะที่ยังคงใช้ shebang ชี้ไปยังshก็ไม่สามารถพกพาได้เช่นกัน[ 14 ]
ด้วยเหตุนี้ บางครั้งจึงจำเป็นต้องแก้ไขบรรทัด shebang หลังจากคัดลอกสคริปต์จากคอมพิวเตอร์เครื่องหนึ่งไปยังอีกเครื่องหนึ่ง เนื่องจากเส้นทางที่เขียนไว้ในสคริปต์อาจใช้ไม่ได้กับเครื่องใหม่ ขึ้นอยู่กับความสอดคล้องในธรรมเนียมปฏิบัติในอดีตเกี่ยวกับการวางตำแหน่งของตัวแปลภาษา ด้วยเหตุนี้และเนื่องจากPOSIXไม่ได้กำหนดมาตรฐานชื่อเส้นทาง POSIX จึงไม่ได้กำหนดมาตรฐานคุณลักษณะนี้[ 15 ]เครื่องมือGNU Autoconfสามารถทดสอบการสนับสนุนระบบด้วยมาโคร AC_SYS_INTERPRETER [ 16 ]
บ่อยครั้งที่ สามารถใช้โปรแกรม/usr/bin/env เพื่อหลีกเลี่ยงข้อจำกัดนี้ได้โดยการใช้การ อ้างอิงทางอ้อมโดยตามด้วย/usr/bin/envและตามด้วยคำสั่งที่ต้องการโดยไม่ต้องระบุพาธแบบเต็ม ดังตัวอย่างนี้: #!
#!/usr/bin/env sh
วิธีนี้ได้ผลส่วนใหญ่เนื่องจากพาธ/usr/bin/envมักถูกใช้สำหรับ ยู ทิลิตี้ envและมันจะเรียกใช้sh ตัวแรกที่พบใน $PATHของผู้ใช้ซึ่งโดยทั่วไปคือ/bin/ sh
ตัวอย่างเฉพาะนี้ (ที่ใช้sh ) มีประโยชน์จำกัด: ทั้ง/bin/shและ/usr/bin/envไม่ได้ใช้งานได้กับทุกอุปกรณ์ โดยมีจำนวนอุปกรณ์ที่ขาดทั้งสองอย่างนี้ใกล้เคียงกัน โดยทั่วไปแล้ว การใช้#!/usr/bin/envสำหรับสคริปต์ใดๆ ก็ยังคงมีปัญหาเรื่องความเข้ากันได้กับOpenServer 5.0.6 และUnicos 9.0.2 ซึ่งมีเพียง/bin/envและไม่มี/usr/bin/ env
การใช้#!/usr/bin/envส่งผลให้เกิด การอ้างอิง ทางอ้อมขณะรันไทม์ซึ่งอาจทำให้ความปลอดภัยของระบบลดลง ด้วยเหตุนี้ ผู้วิจารณ์บางรายจึงแนะนำไม่ให้ใช้[ 17 ]ในซอฟต์แวร์ที่บรรจุไว้ โดยสงวนไว้สำหรับ "ตัวอย่างเพื่อการศึกษา" เท่านั้น
การแบ่งแยกข้อโต้แย้ง
การแบ่งอาร์กิวเมนต์ของคำสั่งนั้นแตกต่างกันไปตามแต่ละแพลตฟอร์ม บางระบบไม่แบ่งอาร์กิวเมนต์ ตัวอย่างเช่น เมื่อรันสคริปต์ด้วยบรรทัดแรก
#!/usr/bin/env python3 -c
ข้อความทั้งหมดหลังช่องว่างแรกจะถูกถือว่าเป็นอาร์กิวเมนต์เดียว นั่นคือpython3 -cจะถูกส่งผ่านเป็นอาร์กิวเมนต์เดียวไปยัง /usr / bin/envแทนที่จะเป็นสองอาร์กิวเมนต์ ระบบดังกล่าวได้แก่ Linux [ 18 ] [ 19 ]และCygwin
แนวทางอื่นคือการใช้wrapper FreeBSD 6.0 (2005) ได้แนะนำ ตัวเลือก -Sให้กับenvเนื่องจากมีการเปลี่ยนแปลงพฤติกรรมการอ่าน shebang ให้เป็นแบบไม่แยกสตริง ตัวเลือกนี้บอกให้env แยกสตริงเอง[ 20 ] ยูทิลิตี้ GNU envตั้งแต่coreutils 8.30 (2018) ก็มีคุณสมบัตินี้เช่นกัน[ 21 ]แม้ว่าการใช้ตัวเลือกนี้จะช่วยลดปัญหาการพกพาในฝั่งเคอร์เนลด้วยการแยกสตริง แต่ก็เพิ่มข้อกำหนดที่ว่าenvต้องรองรับส่วนขยายเฉพาะนี้ด้วย
การตีความตัวละคร
ปัญหาอีกประการหนึ่งคือสคริปต์ที่มีอักขระขึ้นบรรทัดใหม่ทันทีหลังจากบรรทัด shebang ซึ่งอาจเป็นผลมาจากการแก้ไขบนระบบที่ใช้การขึ้นบรรทัดใหม่ ของ DOS เช่นMicrosoft Windowsบางระบบตีความอักขระขึ้นบรรทัดใหม่ว่าเป็นส่วนหนึ่งของ คำสั่ง ตัวแปลทำให้เกิดข้อความแสดงข้อผิดพลาด[ 22 ]
เลขมหัศจรรย์
จริงๆ แล้ว shebang คือตัวอย่างที่มนุษย์อ่านได้ของหมายเลขวิเศษในไฟล์ปฏิบัติการ โดยสตริงไบต์วิเศษคือ0x23 0x21ซึ่งเป็นการเข้ารหัสสองตัวอักษรในASCIIของ#!หมายเลขวิเศษนี้จะถูกตรวจจับโดยตระกูลฟังก์ชัน " exec " ซึ่งจะตรวจสอบว่าไฟล์นั้นเป็นสคริปต์หรือไบนารีที่เรียกใช้งานได้ การมีอยู่ของ shebang จะส่งผลให้มีการเรียกใช้ไฟล์ปฏิบัติการที่ระบุ ซึ่งโดยปกติจะเป็นตัวแปลภาษาสำหรับสคริปต์ มีการกล่าวอ้าง[ 23 ]ว่า Unix เวอร์ชันเก่าบางเวอร์ชันคาดหวังว่า shebang ปกติจะตามด้วยช่องว่างและเครื่องหมายทับ ( ) แต่ดูเหมือนจะไม่เป็นความจริง[ 11 ]ในทางกลับกัน ช่องว่างหลัง shebang ได้รับอนุญาตตามประเพณี และบางครั้งก็มีการบันทึกไว้พร้อมกับช่องว่าง ดังที่อธิบายไว้ในอีเมลประวัติศาสตร์ปี 1980ด้านล่าง #! /
อักขระ shebang จะถูกแทนด้วยไบต์สองไบต์เดียวกันในการเข้ารหัสASCII แบบขยาย รวมถึง UTF-8ซึ่งมักใช้สำหรับสคริปต์และไฟล์ข้อความอื่นๆ บนระบบที่คล้าย Unix ในปัจจุบัน อย่างไรก็ตาม ไฟล์ UTF-8 อาจเริ่มต้นด้วยเครื่องหมายลำดับไบต์ (BOM) ที่เป็นตัวเลือก หากฟังก์ชัน "exec" ตรวจพบไบต์0x23และ0x21 โดยเฉพาะ การมีอยู่ของ BOM ( 0xEF 0xBB 0xBF ) ก่อน shebang จะป้องกันไม่ให้ตัวแปลสคริปต์ถูกเรียกใช้งาน ผู้เชี่ยวชาญบางคนแนะนำไม่ให้ใช้เครื่องหมายลำดับไบต์ใน สคริปต์ POSIX (ที่คล้าย Unix) [ 24 ]ด้วยเหตุผลนี้และเพื่อความสามารถในการทำงานร่วมกันที่กว้างขึ้นและข้อกังวลเชิงปรัชญา นอกจากนี้ เครื่องหมายลำดับไบต์ไม่จำเป็นใน UTF-8 เนื่องจากการเข้ารหัสนี้ไม่มี ปัญหา เรื่อง endiannessมันทำหน้าที่เพียงเพื่อระบุว่าการเข้ารหัสเป็น UTF-8 [ 24 ]
นิรุกติศาสตร์
ไฟล์ปฏิบัติการที่ขึ้นต้นด้วยคำสั่งตัวแปลภาษาเรียกว่าสคริปต์ โดยมักจะมีชื่อหรือการจัดประเภททั่วไปของตัวแปลภาษาที่ต้องการนำหน้า ชื่อshebangสำหรับอักขระสองตัวที่โดดเด่นอาจมาจากการย่อคำ ที่ไม่แม่นยำ ของSHArp bangหรือhaSH bangซึ่งหมายถึงชื่อ Unix ทั่วไปสองชื่อสำหรับอักขระเหล่านั้น อีกทฤษฎีหนึ่งเกี่ยวกับshในshebangคือมาจากเชลล์เริ่มต้นshซึ่งมักจะเรียกใช้ด้วย shebang [ 25 ]การใช้งานนี้แพร่หลายในเดือนธันวาคม พ.ศ. 2532 [ 26 ]และอาจจะก่อนหน้า นั้นด้วย
ประวัติศาสตร์
ฟีเจอร์ shebang ได้รับการแนะนำโดยDennis Ritchieระหว่างEdition 7และ8ที่ Bell Laboratories นอกจากนี้ยังถูกเพิ่มเข้าไปในBSDเวอร์ชันต่างๆ จากการวิจัยวิทยาศาสตร์คอมพิวเตอร์ของ Berkeley (มีอยู่ใน 2.8BSD [ 27 ]และเปิดใช้งานโดยค่าเริ่มต้นใน 4.2BSD) เนื่องจาก AT&T Bell Laboratories Edition 8 Unix และเวอร์ชันต่อๆ มาไม่ได้เผยแพร่สู่สาธารณะ การปรากฏตัวครั้งแรกที่เป็นที่รู้จักอย่างกว้างขวางของฟีเจอร์นี้จึงเกิดขึ้นบน BSD
การขาดคำสั่งตัวแปล แต่การสนับสนุนสคริปต์เชลล์ ปรากฏชัดในเอกสารจากUnix เวอร์ชัน 7ในปี 1979 [ 28 ]ซึ่งอธิบายถึงฟังก์ชันของ Bourne shell ที่ไฟล์ที่มีสิทธิ์ในการเรียกใช้งานจะได้รับการจัดการเป็นพิเศษโดยเชลล์ ซึ่ง (บางครั้งขึ้นอยู่กับอักขระเริ่มต้นในสคริปต์ เช่น ":" หรือ "#") จะสร้างซับเชลล์ขึ้นมาเพื่อตีความและเรียกใช้คำสั่งที่อยู่ในไฟล์ ในแบบจำลองนี้ สคริปต์จะทำงานเหมือนคำสั่งอื่นๆ ก็ต่อเมื่อถูกเรียกจากภายใน Bourne shell เท่านั้น การพยายามเรียกใช้ไฟล์ดังกล่าวโดยตรงผ่านการเรียกใช้ระบบexec() ของระบบปฏิบัติการเอง จะล้มเหลว ทำให้สคริปต์ไม่สามารถทำงานได้อย่างสม่ำเสมอเหมือนคำสั่งระบบปกติ
สคริปต์เชลล์เวอร์ชัน 8 ที่ได้รับการปรับปรุง
ในระบบที่คล้าย Unix เวอร์ชันต่อมา ความไม่สอดคล้องกันนี้ถูกลบออกไปDennis Ritchieได้แนะนำการสนับสนุนเคอร์เนลสำหรับคำสั่งตัวแปลในเดือนมกราคม พ.ศ. 2523 สำหรับUnix เวอร์ชัน 8พร้อมคำอธิบายดังต่อไปนี้: [ 29 ]
จาก uucp พฤหัสบดีที่ 10 มกราคม 01:37:58 1980 จาก dmr วันพฤหัสบดีที่ 10 มกราคม 1980 เวลา 04:25:49 จากระยะไกลจากการวิจัย ระบบได้รับการเปลี่ยนแปลงแล้ว เพื่อให้หากมีการเรียกใช้ไฟล์ เริ่มต้นด้วยอักขระวิเศษ #! ส่วนที่เหลือของบรรทัดนั้นเข้าใจได้เอง เพื่อเป็นชื่อของตัวแปลภาษาสำหรับไฟล์ที่ถูกเรียกใช้งาน ก่อนหน้านี้ (และในความเป็นจริงก็ยังคงเป็นเช่นนั้น) เปลือกหอยทำหน้าที่นี้เป็นส่วนใหญ่ โปรแกรมจะเรียกใช้งานไฟล์ข้อความโดยอัตโนมัติในโหมดที่สามารถเรียกใช้งานได้ เมื่อพิมพ์ชื่อไฟล์ข้อความเป็นคำสั่ง การนำสิ่งอำนวยความสะดวกเข้าสู่ระบบจะให้ผลลัพธ์ดังต่อไปนี้ ประโยชน์. 1) ทำให้สคริปต์เชลล์มีลักษณะคล้ายไฟล์ปฏิบัติการจริงมากขึ้น เพราะพวกเขาสามารถเป็นหัวข้อของ 'ผู้บริหาร' ได้ 2) ถ้าคุณใช้คำสั่ง 'ps' ในขณะที่คำสั่งนั้นกำลังทำงานอยู่ มันจะเป็นของจริง ชื่อจะปรากฏแทน 'sh' ในทำนองเดียวกัน การบัญชีก็ทำบนพื้นฐานของชื่อจริงเช่นกัน 3) สคริปต์เชลล์สามารถตั้งค่า user-ID ได้[ a ] 4) การมีเชลล์ทางเลือกอื่นๆ ให้เลือกใช้จะทำให้เข้าใจง่ายขึ้น เช่น ถ้าคุณชอบ Berkeley csh ก็ไม่มีข้อสงสัยใดๆ เกี่ยวกับเรื่องนี้ ซึ่งเชลล์จะใช้ในการตีความไฟล์ 5) จะช่วยให้ล่ามคนอื่นๆ สามารถเข้ามาร่วมงานได้อย่างราบรื่นยิ่งขึ้น เพื่อใช้ประโยชน์จากโอกาสอันดีเยี่ยมนี้ ใส่ #! /bin/sh วางไว้ที่ขอบด้านซ้ายของบรรทัดแรกของสคริปต์เชลล์ของคุณ สามารถเว้นวรรคหลังเครื่องหมาย ! ได้ โปรดใช้เส้นทางไฟล์แบบเต็ม (จะไม่มีการค้นหา) ขณะนี้บรรทัดทั้งหมดถูกจำกัดไว้ที่ 16 ตัวอักษร แต่ ขีดจำกัดนี้จะถูกเพิ่มขึ้น
คุณลักษณะสคริปต์เชลล์ที่ไม่มีชื่อ
อย่างไรก็ตาม ผู้สร้างฟีเจอร์ไม่ได้ตั้งชื่อให้มัน: [ 31 ]
จาก: "Ritchie, Dennis M (Dennis)** CTR **" <dmr@[redacted]> ถึง: <[redacted]@ talisman.org > วันที่: พฤหัสบดีที่ 19 พฤศจิกายน 2552 18:37:37 -0600 หัวเรื่อง: RE: คุณเรียก#!<something> line ของคุณว่าอะไร? ฉันจำไม่ได้ว่าเราเคยตั้งชื่อให้มันอย่างเป็นทางการหรือเปล่า มันเข้าไปค่อนข้างดึกแล้ว—ฉันคิดว่าฉัน ได้ไอเดียมาจากคนคนหนึ่งในงานประชุม UCB ครั้งหนึ่ง บนระบบ Berkeley Unix ผมอาจจะเป็นหนึ่งในคนกลุ่มแรกๆ ที่ใช้ระบบนี้ จริงๆ แล้วผมติดตั้งมัน แต่มันเป็นแค่ไอเดียที่ผมได้มา จากที่อื่น ส่วนชื่อนั้น: น่าจะเป็นชื่อที่สื่อความหมายได้ชัดเจน เช่น "แฮชแบง" แม้ว่าคำนี้จะมีกลิ่นอายแบบอังกฤษโดยเฉพาะ แต่ อย่างไรก็ตาม ฉันจำไม่ได้ว่าเคยใช้ชื่อเล่นอะไรเป็นพิเศษหรือเปล่า เพื่อการก่อสร้าง การสนับสนุนเคอร์เนลสำหรับคำสั่งตัวแปลแพร่กระจายไปยัง Unix เวอร์ชันอื่น ๆ และการใช้งานที่ทันสมัยหนึ่งรายการสามารถพบได้ในซอร์สโค้ดเคอร์เนล Linux ในfs/ binfmt_script.c [ 32 ]
กลไกนี้ช่วยให้สามารถใช้สคริปต์ได้ในบริบทแทบทุกบริบทที่โปรแกรมที่คอมไพล์แล้วสามารถใช้งานได้ รวมถึงการใช้งานเป็นโปรแกรมระบบเต็มรูปแบบ และแม้กระทั่งเป็นตัวแปลสคริปต์อื่นๆ อย่างไรก็ตาม มีข้อจำกัดอยู่บ้าง เช่น เวอร์ชันแรกๆ ของการสนับสนุนเคอร์เนลจำกัดความยาวของคำสั่งตัวแปลไว้ที่ประมาณ 32 ตัวอักษร (เพียง 16 ตัวอักษรในการใช้งานครั้งแรก) บางเวอร์ชันไม่สามารถแยกชื่อตัวแปลออกจากพารามิเตอร์ใดๆ ในคำสั่งได้ หรือมีข้อบกพร่องอื่นๆ นอกจากนี้ ระบบสมัยใหม่บางระบบอนุญาตให้จำกัดหรือปิดใช้งานกลไกทั้งหมดเพื่อวัตถุประสงค์ด้านความปลอดภัย (ตัวอย่างเช่น การสนับสนุน set-user-id ถูกปิดใช้งานสำหรับสคริปต์ในหลายระบบ)
โปรดทราบว่า แม้ในระบบที่มีการรองรับหมายเลขวิเศษ#! อย่างเต็มรูปแบบ ในเคอร์เนล สคริปต์บางตัวที่ไม่มีคำสั่งสำหรับตัวแปลภาษา (ถึงแม้โดยปกติแล้วยังคงต้องการสิทธิ์ในการเรียกใช้งาน) ก็ยังสามารถเรียกใช้งานได้ด้วยกลไกการจัดการสคริปต์แบบดั้งเดิมของเชลล์ Bourne ซึ่งยังคงมีอยู่ในเชลล์รุ่นใหม่ๆ หลายตัว สคริปต์เหล่านั้นจะถูกตีความโดยเชลล์เริ่มต้นของผู้ใช้
ดูเพิ่มเติม
หมายเหตุ
- ^คุณสมบัติ setuidถูกปิดใช้งานในระบบปฏิบัติการสมัยใหม่ส่วนใหญ่หลังจากตระหนักว่าเงื่อนไขการแข่งขันสามารถถูกใช้ประโยชน์เพื่อเปลี่ยนแปลงสคริปต์ในขณะที่กำลังประมวลผล [ 30 ]
ลิงก์ภายนอก
- รายละเอียดเกี่ยวกับกลไก shebang ในระบบปฏิบัติการ Unix เวอร์ชันต่างๆ
- #! - ความจริงเกี่ยวกับ Unix เท่าที่ผมรู้ (แนวทางที่ครอบคลุมกว่า)
- บทความ FOLDOC shebang
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ เชบัง (ยูนิก)
ใน ทางคอมพิวเตอร์ ชี แบง (shebang) คือลำดับอักขระ #! ซึ่งประกอบด้วย อักขระเครื่องหมาย ตัวเลข (หรือที่เรียกว่า sharp หรือ hash) และ เครื่องหมายอัศเจรีย์ (หรือที่เรียกว่า bang)...
ไวยากรณ์
รูปแบบของคำสั่งล่าม shebang มีดังนี้: [ 8 ]
วัตถุประสงค์
คำสั่งตัวแปลภาษาช่วยให้สามารถใช้สคริปต์และไฟล์ข้อมูลเป็นคำสั่งได้ โดยซ่อนรายละเอียดการใช้งานจากผู้ใช้และโปรแกรมอื่นๆ ด้วยการขจัดความจำเป็นในการใส่คำนำหน้าตัวแปลภาษาไว้หน้าสคริปต์ในบรรทัดคำสั่ง
จุดแข็ง
เมื่อเปรียบเทียบกับการใช้รายการการเชื่อมโยงทั่วโลกระหว่างนามสกุลไฟล์และแอปพลิเคชันตัวแปลภาษา วิธีการใช้คำสั่งตัวแปลภาษาช่วยให้ผู้ใช้สามารถใช้ตัวแปลภาษาที่ไม่เป็นที่รู้จักในระดับระบบทั่วโลกได้โดยไม่ต้องใช้สิทธิ์ผู้ดูแลระบบ...