함수의 하위 셸에 대한 종료 코드가 잘못 처리됨

함수의 하위 셸에 대한 종료 코드가 잘못 처리됨

배쉬 5.2.15가 출시되었습니다.

다음 스크립트를 실행하면 에코가 실행되지 않을 것으로 예상됩니다.

#!/bin/bash

set -e  

function func() {
  (
    exit 1 
  )

   echo 'should not be run because of set -e'
}

func || true

실제로 작동하는데 이는 나에게 버그처럼 보입니다.

|| true함수가 호출되는 사이트에서 제거하면 (올바르게) 실행되지 않습니다.

내 설명은 "오류 삼키기"가 || true코드의 잘못된 부분에 적용된다는 것입니다. 마치 서브쉘의 닫는 괄호(저는 그렇지 않습니다)와 같은 줄에 쓴 것과 같습니다.

내가 뭐 놓친 거 없니?

답변1

이것은녹음된[강조하다내 거]:

-e
파이프라인(파이프라인 참조)(단일 단순 명령(단순 명령 참조)으로 구성될 수 있음), 목록(명령 목록 참조) 또는 복합 명령(복합 명령 참조)이 0이 아닌 상태를 반환하는 경우 즉시 종료하십시오.&&실패한 명령이 목록에서 실행된 명령의 [...] 부분인 경우 쉘은 종료되지 않습니다( ||마지막 또는 다음 명령 제외).&&||[…]. 서브쉘 외부의 복합 명령이 무시될 때 명령이 실패했기 때문에 0이 아닌 상태를 반환하는 경우 -e쉘은 종료되지 않습니다. […]

[…]

복합 명령 또는 셸 함수가 무시된 컨텍스트에서 실행되는 경우 -e복합 명령 또는 함수의 본문 내에서 실행되는 모든 명령은 이 설정이 설정되고 명령이 실패 상태를 반환 -e하더라도 이 설정의 영향을 받지 않습니다.-e[…]

이것은 func || true -e당신이 무시 ||당하고함수 전체에서 무시됩니다.

관련 정보