วันนี้คุณสามารถหาเชลล์ POSIX ได้จากระบบและโดยทั่วไปนั่นหมายความว่าคุณสามารถสคริปต์ในภาษา POSIX (โมดูโลทำงานในบั๊กการปฏิบัติตามกฎระเบียบ)
ปัญหาเดียว/bin/sh
คือในบางครั้งไม่ใช่ POSIX เชลล์ และคุณจะต้องเขียนโค้ด#!
ลงในสคริปต์ที่ใช้งานได้ดี /path/to/posix/shell myscript
คุณก็ไม่สามารถขอให้ผู้ใช้ในการวิจัยปัญหาและเรียกใช้สคริปต์ของคุณเป็น
ดังนั้นเคล็ดลับคือการใช้คุณสมบัติ POSIX ในสคริปต์ของคุณ แต่ทำให้สคริปต์ค้นหาเชลล์ POSIX โดยอัตโนมัติ วิธีหนึ่งในการทำเช่นนี้:
#!/bin/sh
# At this point, we may be running under some old shell
# we have to tread carefully.
# note how we use test rather than [ ] syntax and avoid
# depending on test with no argument producing a failure;
# i.e. "test $posix_shell".
if ! test x$posix_shell = x ; then
# the three possible shell paths are just an example;
# please extend as necessary.
for shell in /usr/xpg4/bin/sh /bin/bash /usr/bin/bash ; do
if test -x $shell ; then
posix_shell=$shell
fi
done
if test x$posix_shell = x ; then
echo "no POSIX shell found"
exit 1
# or we could avoid bailing here and just fall back on /bin/sh:
# echo "falling back on /bin/sh: cross your fingers that it works"
# posix_shell=/bin/sh
fi
export posix_shell
# plain "$@" is broken in ancient shells!
# I seem to recall ${@+"$@"}: not sure if that's the right trick.
exec $posix_shell $0 ${@+"$@"} # can we count on exec in legacy shells?
fi
# phew, at this point in the script we have been re-executed and are
# being interpreted by some reasonably modern shell. We can use $(...)
# command substitution, and other features.
มีวิธีการอื่นเช่นการสร้างรหัส เพิ่มสคริปต์ของคุณด้วยสคริปต์ขนาดเล็กที่ใช้เนื้อความของไฟล์สคริปต์โดยไม่มี #! บรรทัดและเพิ่มหนึ่งรายการ
สิ่งที่แย่ที่สุดที่คุณสามารถทำได้คือเริ่มเขียนสคริปต์ทั้งหมดในลักษณะที่พวกเขาเรียกใช้บนเชลล์เป้าหมายจากปี 1981 นี่เป็นสิ่งจำเป็นเฉพาะถ้าคุณต้องเขียนสำหรับระบบที่ไม่มีเชลล์อื่น ๆ .