POSIX가 모든 unice의 보편적 표준에 가장 가까운 것임을 고려할 때 이를 지원하는 전용 쉘이 있는지 알고 싶습니다. 대부분의 최신 셸은 POSIX에 대한 지원을 제공하고(그리고 문제 없이 POSIX 호환 스크립트를 실행할 수 있음) 호환되지 않는 기능을 제대로 지적하지 못합니다.
호환되지 않는 기능에 대해 오류가 발생하도록 POSIX 및 POSIX만 구현하는 셸이 있습니까?
편집하다나는 이식 가능한 쉘 스크립트 작성에 대한 일반적인 팁을 요구하는 것이 아니라는 점을 분명히 하고 싶습니다. 의견에 언급된 관련 질문에서 이미 이 내용을 다루고 있습니다. 나는 옵션 bash
이 있다는 것을 알았을 때 이 문제를 생각해 냈지만 --posix
그것이 정확히 내가 원하는 것이 아닌 일부 초기화 동작에만 영향을 미친다는 것을 알게 되었습니다.
답변1
당신은 그것을 사용할 수 있습니다쉘체크(GitHub)쉘 스크립트용 린터로 사용됩니다. 아직 하나 있어요온라인 버전.
POSIX 호환성 문제 감지(예:SC2039), 이것셰르본 라인쉘 스크립트 는 #!/bin/sh
.--shell=sh
shellcheck
예( 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.
답변2
불행하게도 쉘 스크립트의 경우 "이식 가능"은 일반적으로 "POSIX 호환"보다 더 엄격한 요구 사항입니다. 즉, POSIX 셸에서 실행되는 무언가를 작성하는 것은 그리 어렵지 않지만 실제 셸에서 실행되도록 만드는 것은 더 어렵습니다.
패키지 관리자에 모든 셸, 특히 posh
원하는 대로 들리는 데비안 셸(정책을 준수하는 일반 SHell)을 설치하는 것부터 시작할 수 있습니다. 데비안의 정책은 POSIX이며 몇 가지 예외가 있습니다( echo -n
지정됨, local
...).
이 외에도 테스트에서는 다양한 플랫폼의 일부 셸(특히 /bin/sh)을 다루어야 합니다. 저는 Solaris(/bin/sh 및 xpg4/sh)와 BSD에서 테스트하고 있습니다. AIX와 HP-UX는 호환성이 매우 높으며 문제를 일으키지 않습니다. bash에는 자신만의 작은 세계가 있습니다.
나는 추천하고 싶다Autoconf 휴대용 쉘 가이드, 정말 훌륭하고 많은 시간을 절약해 줍니다. 많은 부분이 더 이상 사용되지 않지만 괜찮습니다. 신경쓰지 않는다면 TruUnix와 Ultrix 등은 건너뛰세요!
답변3
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 준수라면 이는 좋은 시작입니다.
답변4
호환되지 않는 기능에 대해 오류가 발생하도록 POSIX 및 POSIX만 구현하는 셸이 있습니까?
스프린트여기에서 요구 사항을 충족하십시오.
/bin/sh
DASH는 가능한 한 작은 것을 목표로 하는 POSIX 호환 구현입니다 . 가능한 한 속도를 희생하지 않고 이 작업을 수행합니다. 실제로 대부분의 작업에서 bash(GNU Bourne-Again SHell)보다 훨씬 빠릅니다.
쉘 스크립트를 작성할 때 다음 사항을 준수해야 합니다.POSIX 쉘 명령 언어, 스크립트를 테스트할 때 Dash를 해석기로 사용했습니다. 왜냐하면 Dash는 POSIX 셸 기능만 구현하고 Bashism(배열 변수 또는 프로세스 대체 등)이 발견되면 오류를 발생시키기 때문입니다.
/bin/sh
Dash는 Debian 기반 시스템 의 Almquist 셸(따라서 Debian Almquist 셸이라는 이름)의 포트입니다 /bin/dash
. 자세한 내용은 를 참조하세요.알름퀴스트 껍데기 - Wikipedia.