आज, आप आमतौर पर एक सिस्टम पर एक POSIX शेल पा सकते हैं, और इसलिए आमतौर पर इसका मतलब है कि आप POSIX भाषा में स्क्रिप्ट कर सकते हैं (modulo अनुपालन बग में चल रहा है)।
एकमात्र समस्या यह है कि /bin/sh
कभी-कभी पोसिक्स शेल नहीं होता है। और आपको उन #!
लिपियों में लाइन को हार्ड-कोड करना होगा जो अच्छे निष्पादन के रूप में व्यवहार करने के लिए हैं; आप उपयोगकर्ता को समस्या पर शोध करने के लिए नहीं कह सकते हैं और फिर अपनी स्क्रिप्ट के रूप में इनवाइट कर सकते हैं /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 से बॉर्न शेल पर चलें। यह केवल तभी आवश्यक है जब आपको एक ऐसे सिस्टम के लिए लिखना होगा जिसमें वास्तव में कोई अन्य शेल न हो ।