휴대용 쉘 프로그래밍 리소스

휴대용 쉘 프로그래밍 리소스

이식 가능한 쉘 프로그래밍에 사용할 수 있는 리소스는 무엇입니까? 최종 대답은 모든 대상 플랫폼에서 테스트하는 것이지만 이는 거의 실용적이지 않습니다.

이것POSIX/단일 UNIX 사양시작이지만 각 구현에 대한 지원 수준이나 일반적인 확장이 무엇인지 알려주지는 않습니다. 각 구현에 대한 문서를 읽을 수 있지만 시간이 많이 걸리고 완전히 정확하지는 않습니다.

제 생각에는 이상적인 형식은 일종의 커뮤니티 주석이 달린 POSIX 사양 버전이 될 것입니다. 여기서 각 기능은 다양한 구현에서의 지원 수준에 따라 주석이 추가됩니다. 그런 게 있나요? 아니면 다른 유용한 리소스가 있나요?

예를 들어,Sven Mascheck의 쉘 이식성 페이지, 그러나 구문 요소와 일부 내장 함수만 포함하며 이전 쉘만 다룹니다. 저는 좀 더 포괄적인 자료를 찾고 있습니다.

답변1

autoconf 매뉴얼에는 다음 섹션이 있습니다. 휴대용 쉘 프로그래밍.

비록 이것이 POSIX에만 해당되는 것은 아니지만 아마도 이식 가능한 쉘 코드를 작성하려고 할 때 해야 할 일과 하지 말아야 할 일의 가장 완전한 모음일 것입니다.

답변2

dash및 외에 (또는 ) posh도 있습니다 .bourneshbsh가보 본 껍질, 감지하는 데 사용할 수 있습니다.바시즘.

Heirloom 프로젝트에는 100개 이상의 표준 Unix 유틸리티 모음인 "The Heirloom Toolchest"도 포함되어 있습니다(명령줄 옵션을 비교하기 위한 시작점 역할을 할 수 있음).

답변3

~처럼이 답변, 스크립트를 실행해 보세요사치.

또한 환경 변수를 true로 설정하는 것을 잊지 마십시오 POSIXLY_CORRECT. 이렇게 하면 많은 프로그램(셸뿐만 아니라)이 POSIX 표준을 더 엄격하게 준수하게 됩니다.

답변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 쉘에서 실행될 전체 스크립트를 작성하기 시작하는 것입니다. 이는 실제로 다른 셸이 없는 시스템에 대한 코드를 작성해야 하는 경우에만 필요합니다.

관련 정보