쉘 스크립트의 POSIX 준수를 테스트하려면 어떻게해야합니까? 호환 기능에 대해 오류를

POSIX가 모든 유니스 중에서 공통 표준에 가장 가까운 것을 고려할 때 독점적으로 지원하는 쉘이 있는지 알고 싶습니다. 대부분의 최신 쉘은 POSIX를 지원하며 (문제없이 POSIX 호환 스크립트를 실행할 것임) 비준수 기능을 지적하는 데는 별다른 도움이되지 않습니다.

비 호환 기능에 대해 오류를 발생시키는 방식으로 POSIX 및 POSIX 만 구현하는 쉘이 있습니까?

편집 휴대용 쉘 스크립트 작성에 대한 일반적인 팁을 요구하지 않음을 명확히하고 싶습니다. 의견에 언급 된 관련 질문은 이미 이것을 다루었습니다. 옵션 bash이 있다는 것을 알았을 때이 질문에 대해 생각 --posix했지만 그것이 내가 찾고있는 것이 아닌 일부 초기화 행동에만 영향을 미친다는 것을 발견했습니다.



답변

불행히도 ‘휴대용’은 일반적으로 쉘 스크립트의 ‘POSIX 호환’보다 강력한 요구 사항입니다. 즉, POSIX 쉘에서 실행되는 것을 작성하는 것은 그리 어렵지 않지만 실제 쉘에서 실행하는 것은 더 어렵습니다.

패키지 관리자의 모든 셸, 특히 posh원하는 데비안 사운드 (정책 호환 일반 SHell) 를 설치하여 시작할 수 있습니다 . 데비안의 정책은 POSIX이며 몇 가지 예외가 있습니다 ( echo -n지정, local…).

그 외에도 테스트는 다양한 플랫폼에서 몇 가지 쉘 (특히 / bin / sh)을 다루어야합니다. Solaris (/ bin / sh 및 xpg4 / sh) 및 BSD에서 테스트합니다. AIX 및 HP-UX는 매우 호환되며 문제를 일으키지 않습니다. bash는 그 자체의 작은 세계입니다.

휴대용 쉘에 대한 Autoconf 안내서를 추천합니다. 절대적으로 훌륭하고 많은 시간을 절약합니다. 그것의 큰 덩어리는 더 이상 사용되지 않지만 괜찮습니다. 걱정하지 않으면 TruUnix와 Ultrix 등을 건너 뛰십시오!


답변

ShellCheck (GitHub) 를 쉘 스크립트의 린터로 사용할 수 있습니다 . 도 있습니다 온라인 버전 .

POSIX 호환성 문제 (예 : SC2039 ) 를 감지하려면 쉘 스크립트 의 shebang 줄 이 있어야합니다 #!/bin/sh. 또한 전달할 수 있습니다 --shell=shshellcheck.

예 ( test.sh) :

#!/bin/sh
if [[ $HOSTNAME == test ]]; then
    echo fail &> foo
fi

결과 ( shellcheck test.sh) :

In test.sh line 2:
if [[ $HOSTNAME == test ]]; then
   ^-- SC2039: In POSIX sh, [[ ]] is undefined.
      ^-- SC2039: In POSIX sh, HOSTNAME is undefined.

In test.sh line 3:
    echo fail &> foo
              ^-- SC2039: In POSIX sh, &> is undefined.

답변

POSIXLY_CORRECT환경 변수가 설정된 경우 Bash는 POSIX 호환 모드에서 실행됩니다 . 맨 페이지에서 :

   POSIXLY_CORRECT
          If  this  variable  is  in the environment when bash starts, the
          shell enters posix mode before reading the startup files, as  if
          the  --posix  invocation option had been supplied.  If it is set
          while the shell is running, bash enables posix mode, as  if  the
          command set -o posix had been executed.

다른 많은 GNU 유틸리티도 존중할 것입니다 POSIXLY_CORRECT. 따라서 대부분 GNU 도구 (예 : 대부분의 Linux 시스템)가있는 시스템을 사용하는 경우 POSIX 호환 목표가 좋은 출발입니다.