ฉันคิดว่าเป็นหลักเพราะ:
พฤติกรรมที่แตกต่างกันอย่างมากระหว่างการใช้งาน ดูhttps://www.in-ulm.de/~mascheck/various/shebang/สำหรับรายละเอียดทั้งหมด
อย่างไรก็ตามในตอนนี้มันสามารถระบุเซตย่อยขั้นต่ำของการใช้งาน Unix ที่คล้ายกันมากที่สุดเช่น: #! *[^ ]+( +[^ ]+)?\n
(มีเพียงตัวละครจากตัวละครชื่อไฟล์แบบพกพาที่ตั้งอยู่ในหนึ่งหรือสองคำ) ซึ่งคำแรกเป็นเส้นทางที่แน่นอนไปยังปฏิบัติการแบบดั้งเดิม ยาวเกินไปและพฤติกรรมไม่ได้ระบุหากปฏิบัติการได้ setuid / setgid และการใช้งานที่กำหนดว่าเส้นทางล่ามหรือเส้นทางสคริปต์จะถูกส่งผ่านargv[0]
ไปยังล่าม
POSIX ไม่ได้ระบุเส้นทางของไฟล์ที่เรียกทำงานได้ หลายระบบมียูทิลิตี POSIX ล่วงหน้าใน/bin
/ /usr/bin
และมียูทิลิตี้ POSIX ที่อื่น (เช่นใน Solaris 10 โดยที่/bin/sh
Bourne shell และ POSIX หนึ่งอยู่ใน/usr/xpg4/bin
นั้น Solaris 11 แทนที่ด้วย ksh93 ซึ่งเป็น POSIX ที่ตรงตามมาตรฐานมากกว่า เครื่องมือใน/bin
ยังคงไม่ใช่ POSIX ที่เก่าแก่) บางระบบไม่ใช่ POSIX แต่มีโหมด / การจำลอง POSIX POSIX ทั้งหมดต้องการคือมีสภาพแวดล้อมที่เป็นเอกสารซึ่งระบบจะทำงานกับ POSIXly
ดูตัวอย่าง Windows + Cygwin ที่จริงแล้วด้วย Windows + Cygwin She-bang นั้นได้รับเกียรติเมื่อสคริปต์ถูกเรียกใช้โดยแอปพลิเคชั่น cygwin แต่ไม่ใช่โดยแอปพลิเคชัน Windows ดั้งเดิม
ดังนั้นแม้ว่า POSIX จะระบุกลไก shebang ก็ไม่สามารถใช้ในการเขียนสคริปต์POSIX sh
/ sed
/ awk
... (โปรดทราบว่ากลไก shebang ไม่สามารถใช้ในการเขียนสคริปต์ที่เชื่อถือได้sed
/ awk
เนื่องจากไม่อนุญาตให้ส่งตัวเลือกปลายทาง เครื่องหมาย)
ตอนนี้ความจริงที่ว่ามันไม่ได้ระบุไม่ได้หมายความว่าคุณไม่สามารถใช้งานได้ (ดีมันบอกว่าคุณไม่ควรเริ่มต้นบรรทัดแรกด้วย#!
ถ้าคุณคาดหวังว่ามันจะเป็นเพียงความคิดเห็นปกติและไม่ใช่เธอ - ปัง) แต่ POSIX นั้นไม่รับประกันว่าคุณจะทำอย่างไร
จากประสบการณ์ของฉันการใช้ shebangs ช่วยให้คุณมั่นใจในการพกพาได้มากกว่าการใช้วิธีการเขียนสคริปต์เชลล์ของ POSIX: ออกจาก she-bang เขียนสคริปต์ในsh
ไวยากรณ์POSIX และหวังว่าสิ่งที่เรียกใช้สคริปต์จะเรียกใช้ POSIX sh
ซึ่งเป็น ดีถ้าคุณรู้ว่าสคริปต์จะถูกเรียกใช้ในสภาพแวดล้อมที่เหมาะสมโดยเครื่องมือที่เหมาะสม แต่ไม่เป็นอย่างอื่น
คุณอาจต้องทำสิ่งต่าง ๆ เช่น:
#! /bin/sh -
if : ^ false; then : fine, POSIX system by default
else
# cover Solaris 10 or older. ": ^ false" returns false
# in the Bourne shell as ^ is an alias for | there for
# compatibility with the Thomson shell.
PATH=`getconf PATH`:$PATH; export PATH
exec /usr/xpg4/bin/sh - "$0" ${1+"$@"}
fi
# rest of script
หากคุณต้องการที่จะพกพาไปยัง Windows + Cygwin คุณอาจจะต้องตั้งชื่อไฟล์ของคุณด้วย.bat
หรือ.ps1
ส่วนขยายและใช้เคล็ดลับที่คล้ายกันบางอย่างสำหรับการcmd.exe
หรือpowershell.exe
การเรียก Cygwin sh
ในไฟล์เดียวกัน