![bash -e 및 && 함수 내부 평가](https://linux55.com/image/190408/bash%20-e%20%EB%B0%8F%20%26amp%3B%26amp%3B%20%ED%95%A8%EC%88%98%20%EB%82%B4%EB%B6%80%20%ED%8F%89%EA%B0%80.png)
-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이 아닌 상태를 반환하는 경우 셸이 종료되지 않습니다. 트랩이 설정되어 있으면 쉘이 종료되기 전에 실행됩니다. 이 옵션은 셸 환경과 각 하위 셸 환경(위의 명령 실행 환경 참조)에 개별적으로 적용되며 하위 셸의 모든 명령을 실행하기 전에 하위 셸이 종료될 수 있습니다.if
elif
&&
||
&&
||
!
-e
ERR
복합 명령 또는 셸 함수가 무시된 컨텍스트에서 실행되는 경우
-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의 조합을 확인할 수 있습니다.
- 지정되지 않음: 트랩 없음, 조기 종료 없음
$ bash trap_test.sh; echo "exit status: $?" trap_test.sh: line 6: noSuchCommand: command not found OK exit status: 0
- -e: 일찍 종료합니다. 함수에 트랩이 없습니다.
$ bash -e trap_test.sh; echo "exit status: $?" trap_test.sh: line 6: noSuchCommand: command not found exit status: 127
- -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
- 조기 종료 및 함정/
$ 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