bash -e 및 && 함수 내부 평가

bash -e 및 && 함수 내부 평가

-e옵션을 설정할 때 bash(및 대시)의 동작이 혼란스럽습니다.

간단한 예:

#!/bin/bash -e

func() {
    false && true
}

false && true

echo "1"

func

echo "2"

산출:

1

예상 출력:

1
2

첫 번째 발생은 예상대로 작동하지만 두 번째 발생(함수 내부)에서는 즉시 종료됩니다. 문서를 검색했지만 이 다른 동작에 대한 설명을 찾을 수 없습니다. 이것 뒤에 어떤 이유가 있습니까, 아니면 이것이 버그입니까? 나는 이것을 bash와 dash에서 동일한 결과로 테스트했습니다.

Bash 매뉴얼 페이지에 따르면:

-e 파이프(단일 단순 명령으로 구성될 수 있음), 목록 또는 복합 명령(위의 SHELL GRAMMAR 참조)이 0이 아닌 상태로 종료되면 즉시 종료하십시오. 실패한 명령이 while또는 키워드 바로 다음 명령 목록의 일부이거나, until또는 예약어 뒤의 테스트의 일부이거나, 또는 목록에서 실행되는 명령의 일부인 경우(마지막 또는 후속 명령 제외) 쉘이 종료되지 않습니다. 파이프라인의 마지막 명령 또는 명령의 반환 값이 와 같습니다. 명령이 무시될 때 실패했기 때문에 하위 셸 외부의 복합 명령이 0이 아닌 상태를 반환하는 경우 셸이 종료되지 않습니다. 트랩이 설정되어 있으면 쉘이 종료되기 전에 실행됩니다. 이 옵션은 셸 환경과 각 하위 셸 환경(위의 명령 실행 환경 참조)에 개별적으로 적용되며 하위 셸의 모든 명령을 실행하기 전에 하위 셸이 종료될 수 있습니다.ifelif&&||&&||!-eERR

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

답변1

func종료 상태가 0이 아니기 때문에 스크립트가 돌아올 때 종료됩니다 . 스크립트는 내부적으로 종료되지 않습니다 func.

목록 false && true은 영향을 받지 않으며 -e스크립트는 종료되지 않으며 스크립트의 주요 부분에도 없고 함수에도 없습니다.

그러나 false함수 내의 함수는 함수의 종료 상태를 0이 아닌 값으로 설정하므로 함수가 반환되면 쉘이 종료됩니다.

스크립트를 다음과 같이 단순화할 수 있습니다.

#!/bin/bash -e

false && true

echo "1"

false

echo "2"

false && true함수의 목록이 스크립트를 종료하지 않는다는 것을 확인하기 위해 함수에서 0 반환을 테스트할 수도 있습니다 .

#!/bin/bash -e

func() {
    false && true
    return 0
}

false && true

echo "1"

func

echo "2"

이 출력 실행

1
2

답변2

s 에 대해 질문하지 않았기 때문에 직접적인 관련은 없지만 trap...

ERR 트랩 및 설정 -E 및 설정 -e

이 스크립트에는 함수에 오류가 있으므로 set -E포함되지 않습니다 .set -e

$ cat trap_test.sh
#!/usr/bin/env bash
trap 'echo "Error on line $LINENO. Exit code: $?" >&2' ERR
myfunc() {
    noSuchCommand
    echo OK
}
myfunc

그런 다음 -E와 -e의 조합을 확인할 수 있습니다.

  1. 지정되지 않음: 트랩 없음, 조기 종료 없음
    $ bash trap_test.sh; echo "exit status: $?"
    trap_test.sh: line 6: noSuchCommand: command not found
    OK
    exit status: 0
    
  2. -e: 일찍 종료합니다. 함수에 트랩이 없습니다.
    $ bash -e trap_test.sh; echo "exit status: $?"
    trap_test.sh: line 6: noSuchCommand: command not found
    exit status: 127
    
  3. -E, 함수 오류로 인한 트랩
    $ bash -E trap_test.sh; echo "exit status: $?"
    trap_test.sh: line 6: noSuchCommand: command not found
    Error on line 6. Exit code: 127
    OK
    exit status: 0
    
  4. 조기 종료 및 함정/
    $ bash -eE trap_test.sh; echo "exit status: $?"
    trap_test.sh: line 6: noSuchCommand: command not found
    Error on line 6. Exit code: 127
    exit status: 127
    

관련 정보