함수 수준 bash 트랩(트랩...RETURN)을 사용할 때 "바인딩되지 않은 변수" 오류

함수 수준 bash 트랩(트랩...RETURN)을 사용할 때 "바인딩되지 않은 변수" 오류

함수를 호출하고 해당 함수에 대해 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 mainf1최상위 스크립트에서 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

관련 정보