ทำไม“ she-bang” เริ่มต้นด้วย“ #!”


10

ทำไม "เธอปัง" เริ่มต้นด้วย#!เช่น#!/bin/bash? ฉันยอมรับเสมอว่านี่เป็นวิธีที่ทำได้ แต่มีเหตุผลอยู่เบื้องหลังหรือไม่

ทำไมเริ่มต้นด้วย#; นั่นไม่ใช่ความคิดเห็นใช่ไหม หรือเป็นประเด็นที่ควรแสดงความคิดเห็น?


4
วิกิพีเดียมีประวัติโดยละเอียดของ#!(เท่าที่จำได้ว่าเป็น DMR …) รวมถึงคำอธิบายว่าทำไม#(ใช่แล้วบรรทัดต้องถูกละเว้นโดยเชลล์ที่มีอยู่)
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

พลาดตรวจสอบวิกิพีเดีย :)
Johan

1
ฉันแค่หวังว่าเปลือกหอยนั้นฉลาดพอที่จะกำจัด CR / LF ที่ไม่เกี่ยวข้องหากมี ... ;)
Aaron D. Marasco

คำตอบ:


16

โดยทั่วไปshebangหมายถึงเพียงแค่#!( !เรียกว่า "ปัง" และดูเหมือนว่า "เธอ" คือความเสียหายของทั้ง "SHArp" หรือ "haSH" สำหรับ#) - ทั้งสายเรียกว่าเส้น Shebang

มันตั้งใจเริ่มต้นด้วยตัวอักษรความคิดเห็นสำหรับความเข้ากันได้ย้อนหลังกับสิ่งที่ไม่รู้วิธีจัดการมัน !สันนิษฐานว่าเป็นเพียงความแตกต่างจากความคิดเห็นสุ่มเริ่มต้นไฟล์ดังนั้นไฟล์ที่เริ่มต้นด้วยการ# this is my script!ไม่พยายามที่จะเรียกใช้this is my script!ล่าม


2
บาง!ครั้งมักใช้ในบริบทอื่นเพื่อระบุคำสั่งที่จะดำเนินการ ตัวอย่างเช่นในvimหรือโปรแกรมอื่น ๆ ที่มีบรรทัดคำสั่งของตัวเองปังมักจะเป็นตัวหนีที่ทำให้พวกเขาเรียกใช้คำสั่งในเปลือกระบบแทนส่วนต่อประสานภายในของพวกเขา
Caleb

4

เพื่อให้เข้าใจสิ่งนี้คุณต้องตระหนักว่าบรรทัดแรกของสคริปต์นั้นถูกอ่านสองครั้งโดย 2 โปรแกรมที่แตกต่างกัน ในครั้งแรกเคอร์เนลจะเปิดไฟล์และค้นหาลำดับอักขระ ( #!) ที่บรรทัดแรก หากพบมันจะรันโปรแกรมเชลล์ที่ระบุไว้ที่นั่นส่งชื่อไฟล์เป็นพารามิเตอร์ (เช่นหากไฟล์/home/me/fooเริ่มต้น#!/bin/shเคอร์เนลจะทำงาน/bin/sh /home/me/foo)

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


มันเป็นเคอร์เนลที่ทำอย่างนั้นหรือไม่ดูเหมือนว่ามันเป็นเชลล์ปัจจุบันที่คุณทำงานซึ่งจะแยกวิเคราะห์ Shebang แล้วกดสคริปต์
Johan

ไม่ ... มันเป็นเคอร์เนลของตัวเองมีชีวิตและด้วยตัวเอง มันจะทำงานแม้ว่าคุณจะไม่ได้ใช้เชลล์ในการรันสคริปต์ ... มีวิธีอื่นในการรันไฟล์นอกเหนือจากเชลล์ ... ตัวอย่างจากโปรแกรม C โดยใช้การเรียกระบบ "exec"
JoelFan

en.wikipedia.org/wiki/Shebang_(Unix)#Magic_number "#!" ใน ascii เป็นไบต์ 0x23 0x21 - เมื่อ exec () เห็นไบต์เหล่านี้พฤติกรรมคือการปฏิบัติต่อส่วนที่เหลือของบรรทัดเป็นเส้นทางไปยังล่าม
Aaron McMillin

1

มันจะต้องมีความคิดเห็นเพราะวิธีนี้มันจะทำงานเพื่อเรียกใช้สคริปต์เช่น "interpretername scriptname" ฉันไม่รู้เกี่ยวกับต้นกำเนิดของ "!"


1
แม้ว่าคุณเพิ่งจะรัน. / ชื่อสคริปต์, ล่ามยังคงเห็นบรรทัด she-bang, ดังนั้นจึงยังจำเป็นต้องแสดงความคิดเห็น
psusi

1
หรือเพื่อให้มีรายละเอียดเพิ่มเติม: shebang: '#!' ถูกออกแบบมาไม่ให้เห็นโดยล่าม - ดังนั้นจะต้องเริ่มต้นด้วยความคิดเห็นถ่าน '#' แต่เป็น 'เห็น' (และตีความ) โดยเคอร์เนล 'exec [lv] *' ชุดการเรียกระบบ
arielf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.