오늘날에는 일반적으로 시스템에서 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 년부터 Bourne 쉘에서 실행되는 방식으로 전체 스크립트 작성을 시작하는 것입니다. 실제로 다른 쉘이없는 시스템에 대해 작성해야하는 경우에만 필요합니다. .