이식 가능한 쉘 프로그래밍에 사용할 수 있는 리소스는 무엇입니까? 최종 대답은 모든 대상 플랫폼에서 테스트하는 것이지만 이는 거의 실용적이지 않습니다.
이것POSIX/단일 UNIX 사양시작이지만 각 구현에 대한 지원 수준이나 일반적인 확장이 무엇인지 알려주지는 않습니다. 각 구현에 대한 문서를 읽을 수 있지만 시간이 많이 걸리고 완전히 정확하지는 않습니다.
제 생각에는 이상적인 형식은 일종의 커뮤니티 주석이 달린 POSIX 사양 버전이 될 것입니다. 여기서 각 기능은 다양한 구현에서의 지원 수준에 따라 주석이 추가됩니다. 그런 게 있나요? 아니면 다른 유용한 리소스가 있나요?
예를 들어,Sven Mascheck의 쉘 이식성 페이지, 그러나 구문 요소와 일부 내장 함수만 포함하며 이전 쉘만 다룹니다. 저는 좀 더 포괄적인 자료를 찾고 있습니다.
답변1
autoconf 매뉴얼에는 다음 섹션이 있습니다. 휴대용 쉘 프로그래밍.
비록 이것이 POSIX에만 해당되는 것은 아니지만 아마도 이식 가능한 쉘 코드를 작성하려고 할 때 해야 할 일과 하지 말아야 할 일의 가장 완전한 모음일 것입니다.
답변2
답변3
답변4
요즘에는 일반적으로 시스템에서 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 쉘에서 실행될 전체 스크립트를 작성하기 시작하는 것입니다. 이는 실제로 다른 셸이 없는 시스템에 대한 코드를 작성해야 하는 경우에만 필요합니다.