POSIX는 중첩 포인트가 실패할 때 스크립트를 계속할지 여부를 지정합니까?

POSIX는 중첩 포인트가 실패할 때 스크립트를 계속할지 여부를 지정합니까?

예를 들어, example.sh다음과 같은 경우

. non-existing.sh
echo 'continues!'

그런 다음 대화형 세션에서 스크립트를 가져오고 . ./example.sh터미널에 "계속!"이 표시되면 어떻게 될까요? 이것기준지정하다

읽을 수 있는 파일이 없으면 비대화형 쉘이 중단됩니다. 대화형 쉘은 표준 오류에 진단 메시지를 기록해야 하지만 이 경우 구문 오류로 간주되어서는 안 됩니다.

세션을 계속해야 하는지는 알지만 . non-existing.sh중첩된 소스에 어떻게 적용되는지는 잘 모르겠습니다. Bash에서는 오류 메시지를 인쇄한 후 계속 실행됩니다(사용된 경우에도 set -o posix). Dash에서는 현재 스크립트를 중단합니다( example.sh). 이것이 Bash가 POSIX와 호환되지 않는지, 아니면 POSIX(구현 정의 동작)에 지정되지 않은 것인지 궁금합니다.

답변1

읽을 수 있는 파일이 없으면 비대화형 쉘이 중단됩니다
.
그렇지 않으면 [비대화형인 경우] 실행된 마지막 명령의 값을 반환합니다.https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#dot

두 번째 줄 인용문은 이전 명령의 종료 코드가 무시됨을 나타냅니다. 하지만 쉘을 오류 종료 모드로 설정하면 좋겠습니다. 글쎄, 그게 해야 할 일이야.

답변2

POSIX는 중첩된 소스 파일에 대해 침묵하지만 설명 요청이 있으면 기존 텍스트가 dot적용될 것이라고 생각합니다.

~에서IEEE 표준 1003.1-2017:

이름

    포인트 - 현재 환경에서 명령을 실행합니다.

요약

    . file

설명하다

    쉘은 다음에서 명령을 실행해야 합니다.문서현재 환경에서.

    만약에문서<슬래시>가 없으면 쉘은 지정된 검색 경로를 사용해야 합니다.다음을 포함하는 디렉토리를 찾으십시오.문서. 그러나 일반적인 명령 검색과 달리가리키다유틸리티는 실행 가능하지 않아도 됩니다. 읽을 수 있는 파일이 없으면 비대화형 쉘이 중단됩니다. 대화형 쉘은 표준 오류에 진단 메시지를 기록해야 하지만 이 경우 구문 오류로 간주되어서는 안 됩니다.

dash또는 의 경우 bashIEEE Std 1003.1-2017을 완전히 준수한다고 주장하지 않는 한 두 셸 모두에 대한 요구 사항이 없습니다.

재미있게,dash(1)Debian Stretch의 현재 맨페이지 다음 텍스트가 포함되어 있습니다.

스프린트이는 시스템의 표준 명령 해석기입니다. 현재 버전스프린트쉘에 대한 POSIX 1003.2 및 1003.2a 사양을 준수하도록 변경되었습니다. ...POSIX 지정 기능과 일부 Berkeley 확장만 이 셸에 통합되었습니다.

이 맨페이지에는 다음과 같은 내용이 나와 있습니다..예:

. file

    쉘은 지정된 파일의 명령을 읽고 실행합니다.

보시다시피 dashIEEE Std 1003.1-2017을 준수하지 않습니다. 그럼에도 불구하고 나는 이 동작이 표준 관점에서 볼 때 "잘못"되었을 수 있다고 가정합니다 dash. 왜냐하면 이 동작은 계속하는 대신 현재 스크립트를 중단하기 때문입니다.

관련 정보