명령 실패 시 Bash 'if' 문이 일찍 종료됩니다.

명령 실패 시 Bash 'if' 문이 일찍 종료됩니다.

다음 코드는 "if" 문이 일찍 종료되도록 하고 "if" 블록의 "echo" 명령을 실행하지 않게 합니다. 나는 알고 싶다이는 "if" 블록에서만 발생하며 스크립트의 주요 부분에서는 발생하지 않습니다. 참고: ':='를 ':-'로 변경하면 문제가 해결된다는 것을 알고 있습니다. 문제를 해결하려는 것이 아니라 문제를 일으키는 'if' 블록의 실행 환경 간의 차이점을 이해하고 싶습니다. 우선적으로 발생합니다.

#!/bin/bash

if true; then
        VAR=${$1:='val'}
        echo "This does not run"
fi


VAR=${$1:='val'}
echo "This does run"

출력은 다음과 같습니다

line 4: ${$1:='val'}: bad substitution
line 7: ${$1:='val'}: bad substitution
This does run

다시 말하지만 저는 오류 메시지를 대체하여 오류를 수정하는 데 관심이 없으며 이를 수행하는 방법과 이런 일이 발생하는 이유를 이해합니다. 내가 이해하려고 하는 것은 echo "This does not run"위의 "if" 블록에 잘못된 대체가 있을 때 해당 행이 실행되지 않는 이유입니다.

다음 bash 버전으로 재인쇄되었습니다:

GNU bash, 버전 5.1.16(1)-릴리스(x86_64-pc-linux-gnu)

GNU bash, 버전 4.2.46(2)-릴리스(x86_64-redhat-linux-gnu)

답변1

Kusalananda가 의견에서 지적했듯이 이는 본질적으로 설명된 것과 동일합니다.복합 명령에서 Bash 옵션 설정.

~에서배시 참조:

다음은 명령을 읽고 실행할 때 쉘의 작업에 대한 간략한 설명입니다. 기본적으로 쉘은 다음을 수행합니다.

  1. 토큰을 간단한 합계로 구문 분석복합 명령(셸 명령 참조)

  2. 다양한 수행쉘 확장(셸 확장 참조) 확장된 토큰을 파일 이름 목록(파일 이름 확장 참조)과 명령 및 인수로 나눕니다.

  3. ...

  4. 구현하다명령(명령 실행 참조).

명령문의 블록은 if다음과 같습니다.복합 명령그리고 확장 오류가 있습니다. 즉, VAR=${$1:='val'}전체 블록이 실패하고 6단계에 도달하지 못하며 echo첫 번째 단계가 실행되지 않습니다.

확장 오류에 대한 이러한 특수 처리는 POSIX 표준을 위반한다는 점에 유의하세요.섹션 2.8.1설명하다확장된 오류로 인해 비대화형 셸이 종료되어야 합니다..

POSIX 모드에서 Bash는 일관되게 작동합니다.

% bash horse 
horse: line 2: ${$1:='val'}: bad substitution
horse: line 4: ${$1:='val'}: bad substitution
This does run
% bash --posix horse 
horse: line 2: ${$1:='val'}: bad substitution

Bash를 무죄 판결하려면 이 위반 사항은 다음과 같습니다.녹음된:

다음 목록은 "POSIX 모드"가 적용될 때 변경되는 사항입니다.

  1. 지정문 다음에 명령 이름이 없을 때 변수 지정 오류가 발생하면 비대화식 쉘이 오류 상태로 종료됩니다.

관련 정보