쉘 스크립트의 POSIX 준수를 테스트하려면 어떻게해야합니까?


72

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

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

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



@Gilles : 아마도이 질문을 보았지만 하나의 답변만으로 테스트를 제안했다고 언급해야합니다 dash. 나는 내 질문에 대한 일반적인 맥락으로 이식성을 언급했지만 그것이 진정한 의도는 아니었다.
rahmu

물론 두 사람의 질문이 같은 사람들에게 흥미로울 수 있기 때문에 연결되기를 원했습니다. 어떤 방법으로도 복제되지 않습니다. 그런데 posh는 대시보다 POSIX 준수에 대한 더 나은 테스트입니다.
Gilles

2
busybox 는 POSIX 및 POSIX에만 가깝습니다. diffutils와 같은 다른 패키지도 설치하면 기능이 추가 될 수 있습니다. Checkout Alpine Linux 의 livecd는 순수한 busybox 환경으로 시작합니다. Alpine은 musl C 라이브러리를 사용하므로 확장 정규식과 같은 기능을 추가 할 수있는 GNU 확장을 얻지 못합니다.
Michael Fox

답변:


37

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

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

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

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


posh내가 요구하는 것과 같은 소리를냅니다. 최대한 빨리 테스트하겠습니다.
rahmu

1
관련 질문을 발견하기 전에 대답했습니다! posh는 데비안 일이므로 모든 시스템에 패키지되어 있지는 않습니다. 또한, 쉘이 반드시 가장 걱정해야 할 것은 아닙니다. 예를 들어, sed 비 호환성은 큰 문제입니다.
Nicholas Wilson

Solaris / bin / sh 일명 Bourne 쉘 (POSIX가 아님)로 포팅하는 것을 귀찮게하지 않을 것입니다. 모든 현대 유닉스와 마찬가지로 솔라리스는 POSIX 쉘을 가지고 있으며, 일반적인 위치 (/ usr / xpg4 / bin / sh)에 있지 않습니다
Stéphane Chazelas

안타깝게도 적어도 모든 / bin / sh에서 실행해야하는 스크립트를 제공합니다. 그것은 모든 것만 큼 나쁘지 않습니다 ... 오히려 할 필요는 없습니다.
니콜라스 윌슨

2
내가 / bin / sh를 중요하게 취급하는 이유는 많은 스크립트에서 shebang에서 호출 되었기 때문입니다. "/ usr / bin / env sh"는 거의 개선되지 않았습니다. POSIX 이외의 쉘에서 무언가를 만들기 위해 노력한다면, 나는 각 시스템의 / bin / sh를 우선시 할 수 있다고 생각합니다. 일부 고객이 기본 쉘로 스크립트를 실행하기까지는 그리 오래 걸리지 않습니다.
니콜라스 윌슨

28

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.

1
이 몇 년 동안 ShellCheck에 대해 들어 본 적이 없습니다 ... 링크 주셔서 감사합니다!
톤 반 덴 Heuvel

최고의 도구! 특히 온라인 버전을 사용하면 코드를 빠르게 확인하는 것이 좋습니다!
Mecki

12

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 호환 목표가 좋은 출발입니다.


21
POSIX 모드에서도 bash는와 같은 일부 POSIX 이외의 기능을 계속 허용 [[합니다.
jordanm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.