Shebang หรือ #! (sharp-bang) คือลำดับตัวอักษร 2 ตัวแรกของไฟล์สคริปต์ บอก kernel ให้ใช้ interpreter ใดรันสคริปต์นี้ (bash, zsh, python, perl, ฯลฯ)
ทำไมต้องมี Shebang?
- รันสคริปต์โดยตรง:
./script.shแทนbash script.sh - ระบุ interpreter ชัดเจน ไม่ต้องจำ/พิมพ์ทุกครั้ง
- ทำงานกับ cron, systemd, เบราว์เซอร์ (CGI), หรือสคริปต์เรียกสคริปต์อื่นได้ถูกต้อง
- Portable: ย้ายไปเครื่องอื่นที่มี interpreter เดียวกันรันได้เลย
รูปแบบมาตรฐาน
#!/path/to/interpreter [optional-arg]
ตัวอย่างทั่วไป:
#!/bin/bash # Bash (พบได้ทุก distro) #!/bin/sh # POSIX sh (portable กว่า) #!/usr/bin/env bash # ใช้ env หา bash ใน PATH (แนะนำ - portable กว่า) #!/usr/bin/env python3 #!/usr/bin/perl #!/usr/bin/node
วิธีใช้งาน
- สร้างไฟล์ ใส่ shebang บรรทัดแรก
- เขียนโค้ดต่อจากเฉพาะบรรทัดที่ 2
- ทำให้ executable:
chmod +x script.shหรือchmod 755 script.sh - รัน:
./script.sh
ตัวอย่างสคริปต์ Bash:
#!/usr/bin/env bash # backup.sh - Simple backup script src="/home/user/Documents" dst="/mnt/backup/$(date +%F)" mkdir -p "$dst" rsync -av --delete "$src/" "$dst/" echo "Backup completed to $dst"
ตัวอย่าง Python:
#!/usr/bin/env python3
import json, sys
with open(sys.argv[1]) as f:
data = json.load(f)
print(json.dumps(data, indent=2, sort_keys=True))
Shebang กับ /usr/bin/env
#!/usr/bin/env bash ดีกว่า #!/bin/bash เพราะ:
- หา interpreter จาก
PATH(ทำงานแม้ bash อยู่ /usr/local/bin, /opt/homebrew/bin, ฯลฯ) - ทำงานบน macOS, BSD, Linux ได้เหมือนกัน
- รองรับ virtual environment (python, node, ruby)
ข้อจำกัด
- Shebang ต้องอยู่บรรทัดที่ 1 ตัวอักษรที่ 1-2 เท่านั้น
- บาง kernel จำกัดความยาว shebang (ประมาณ 128 chars)
- ไม่ทำงานบน Windows (ยกเว้น WSL/Git Bash) - Windows ใช้ file association แทน
สรุป
Shebang เป็น "ประทับตรา" ของสคริปต์ บอกระบบว่าตัวมันคืออะไร ควรใส่ทุกสคริปต์ที่ต้องการรันโดยตรง ใช้ #!/usr/bin/env interpreter สำหรับ portability สูงสุด