예를 들어, 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
적용될 것이라고 생각합니다.
이름
포인트 - 현재 환경에서 명령을 실행합니다.
요약
. file
설명하다
쉘은 다음에서 명령을 실행해야 합니다.문서현재 환경에서.
만약에문서<슬래시>가 없으면 쉘은 지정된 검색 경로를 사용해야 합니다.길다음을 포함하는 디렉토리를 찾으십시오.문서. 그러나 일반적인 명령 검색과 달리가리키다유틸리티는 실행 가능하지 않아도 됩니다. 읽을 수 있는 파일이 없으면 비대화형 쉘이 중단됩니다. 대화형 쉘은 표준 오류에 진단 메시지를 기록해야 하지만 이 경우 구문 오류로 간주되어서는 안 됩니다.
dash
또는 의 경우 bash
IEEE Std 1003.1-2017을 완전히 준수한다고 주장하지 않는 한 두 셸 모두에 대한 요구 사항이 없습니다.
재미있게,dash(1)
Debian Stretch의 현재 맨페이지
다음 텍스트가 포함되어 있습니다.
스프린트이는 시스템의 표준 명령 해석기입니다. 현재 버전스프린트쉘에 대한 POSIX 1003.2 및 1003.2a 사양을 준수하도록 변경되었습니다. ...POSIX 지정 기능과 일부 Berkeley 확장만 이 셸에 통합되었습니다.
이 맨페이지에는 다음과 같은 내용이 나와 있습니다..
예:
. file
쉘은 지정된 파일의 명령을 읽고 실행합니다.
보시다시피 dash
IEEE Std 1003.1-2017을 준수하지 않습니다. 그럼에도 불구하고 나는 이 동작이 표준 관점에서 볼 때 "잘못"되었을 수 있다고 가정합니다 dash
. 왜냐하면 이 동작은 계속하는 대신 현재 스크립트를 중단하기 때문입니다.