![함수 수준 bash 트랩(트랩...RETURN)을 사용할 때 "바인딩되지 않은 변수" 오류](https://linux55.com/image/159814/%ED%95%A8%EC%88%98%20%EC%88%98%EC%A4%80%20bash%20%ED%8A%B8%EB%9E%A9(%ED%8A%B8%EB%9E%A9...RETURN)%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%A0%20%EB%95%8C%20%22%EB%B0%94%EC%9D%B8%EB%94%A9%EB%90%98%EC%A7%80%20%EC%95%8A%EC%9D%80%20%EB%B3%80%EC%88%98%22%20%EC%98%A4%EB%A5%98.png)
함수를 호출하고 해당 함수에 대해 trap
을 설정하는 다음 스크립트를 고려해보세요 RETURN
.
#!/usr/bin/env bash
set -euo pipefail
function f1() {
local temp_file
temp_file="$(mktemp)"
trap 'echo DELETED; rm -- "${temp_file}"' RETURN
date > temp_file
}
function main() {
for i in $(seq 0 2); do
f1
done
}
main
어떤 이유로 DELETED
문자열이 3번이 아닌 4번 인쇄되고 다음 unbound variable
오류와 함께 실패합니다.
DELETED
DELETED
DELETED
DELETED
hack/deploy-example-server.sh: line 13: temp_file: unbound variable
분명히 뭔가가 this 를 추가로 실행하고 있는 것 같습니다 trap
. 전체 스크립트가 종료되는 것 같습니다.
function main
f1
최상위 스크립트에서 for 루프를 제거하고 호출하기만 하면 이런 일이 발생하지 않습니다.
이 동작의 원인은 무엇입니까?
답변1
설정한 모든 내용은 trap
전역적입니다.
네 번째 함정은 main()
돌아올 때 발생합니다. 이 시점에서는 local
변수가 temp_file
더 이상 설정되지 않습니다. (그러므로 unbound variable
오류가 발생합니다.)
main()
루프 후에 트랩을 취소하는 것을 고려하십시오 for
. 무장 해제 트랩을 사용할 수 있다고 생각합니다 trap RETURN
.
또는 (최상?) 사용을 고려하십시오 trap
.
옵션 1: 삭제하려는 각 파일을 배열에 추가한 다음 나중에 명시적으로 파일을 삭제합니다.
옵션 2: f1()
함수를 다른 함수로 래핑하고 f2()
파일 f2()
을 삭제합니다. 아마도 다음과 같을 것입니다(테스트해본 적은 없습니다).
#! /usr/bin/env bash
set -euo pipefail
function trace() {
# usage: trace command [arg ...]
echo "+ $*" 1>&2
"$@"
}
function f1() {
true # replace true with your code
}
function f2() {
# usage: f2 func_name
local func_name="$1"
local temp_file="$(mktemp)"
"$func_name"
trace rm -- "$temp_file"
}
function main() {
for i in $(seq 0 2); do
f2 f1
done
}
main