Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

Shebang (#!) คืออะไร? ทำไม Linux Scripts จึงต้องมีมัน

#! – มักมีชื่อเล่นว่า shebang, shabang, hashbang, poundbang – เราจะใช้ shebang ตลอดบทความนี้

มันพบได้ที่จุดเริ่มต้นของ Linux shell scripts จำนวนมาก – แต่จริงๆ แล้วมันคืออะไร? มาแยกวิเคราะห์กัน

มักจะมีลักษณะประมาณนี้

#!/bin/bash

#! ปรากฏที่จุดเริ่มต้นของไฟล์ ปกติบรรทัดแรก ตามด้วย path ไปยัง executable (ในกรณีนี้คือ shell bash)

มันคือ Comment

มันขึ้นต้นด้วย # จึงไม่ถูก execute เป็นส่วนหนึ่งของสคริปต์เอง – แต่มันส่งผลต่อวิธีการทำงานของสคริปต์ เพราะว่า…

มันนำหน้า Interpreter Directive

shebang บอกระบบว่าให้ใช้ interpreter ไหนในการรันสคริปต์ โดยให้ path ไปยัง interpreter executable

  • มักวางที่จุดเริ่มต้นของไฟล์ บรรทัดแรก เพื่อให้ interpreter ที่ถูกต้องจัดการส่วนที่เหลือของไฟล์
  • Path ที่ให้ต้องเป็น absolute path ไปยัง executable ที่เหมาะสม
  • บรรทัด shebang อาจมีตัวเลือกที่ส่งให้ interpreter ได้ แต่การรองรับแตกต่างไปตามสภาพแวดล้อม – ปลอดภัยที่สุดคือใส่แค่ตัวเลือกเดียว

ตัวอย่าง

ด้านล่างคือตัวอย่าง #! และความหมาย:

bash

#!/bin/bash

การวางบรรทัดนี้ที่จุดเริ่มต้นของสคริปต์จะบอกระบบว่าควร execute ด้วย bash shell executable

zsh

#!/bin/zsh

การวางบรรทัดนี้ที่จุดเริ่มต้นของสคริปต์จะบอกระบบว่าควร execute ด้วย zsh shell executable

อ่านบทความเกี่ยวกับความแตกต่างระหว่าง bash และ zsh ที่นี่!

Python

#!/usr/bin/env python3

Execute สคริปต์ด้วย Python 3 สังเกตว่าที่นี่ไม่ได้ระบุ path ไปยัง executable python3 โดยตรง แต่บรรทัดนี้จะหา python3 executable ที่กำหนดไว้ใน environment ของผู้ใช้

ไม่มีอะไรเลย!

#!/bin/false

คืนค่า failure status code และไม่ execute สคริปต์ ใช้ในสคริปต์ที่ไม่ได้ตั้งใจให้ execute โดยตรง

การข้าม #!

หากคุณรันสคริปต์ที่มี #! แบบนี้:

./myscript.sh

ที่นี่ myscript.sh คือชื่อสคริปต์ของคุณ – shebang ถูกใช้เพื่อตัดสินใจว่าใช้ interpreter ไหน

ข้างต้นทำได้ก็ต่อเมื่อสคริปต์มีสิทธิ์ execute สำหรับผู้ใช้ปัจจุบัน

แต่หากคุณทำดังนี้:

bash myscript.sh

…บรรทัด shebang ไม่ ถูกใช้เพื่อตัดสินใจ interpreter เนื่องจากเราระบุ bash ไว้ในคำสั่งที่เรียกใช้ ต้องการแค่สิทธิ์ read สำหรับสคริปต์ เนื่องจากสคริปต์ไม่ได้ถูก execute bash ถูก execute แทน