함수에 Bash 트랩이 있지만 전체 스크립트가 종료되면 실행됩니까?

함수에 Bash 트랩이 있지만 전체 스크립트가 종료되면 실행됩니까?

그런 일이 가능한지 궁금합니다.

function get_temp_dir() {
    local tmp_dir=$(mktemp -d)
    trap "{
           rm -r $tmp_dir
       }" EXIT
    echo $tmp_dir
}

temp=$(get_temp_dir)

# I'd like to $temp for the duration of this script, and deleted
# when this current scope ends, not when the function scope ends.

나는 다른 스크립트가 전역 배열과 배열을 열거하고 이에 대해 일부 작업을 수행하는 단일 트랩 함수를 사용하여 동일한 효과를 얻는 것을 보았습니다. 가능하다면 이런 일은 피하고 싶습니다.

나는 또한 단 하나의 tmp 디렉토리를 생성하고 해당 디렉토리 내에 여러 개의 tmp 디렉토리를 생성할 수 있다는 것을 알고 있습니다. 하지만 설치/제거와 같은 다른 작업에도 널리 사용되므로 이 방법을 사용하고 싶습니다.

어떤 아이디어가 있나요? 미리 감사드립니다.

편집: 따라서 쉘 스크립트가 끝날 때 TRAP이 호출되지만 원래 질문에서는 하위 쉘( $())을 사용하고 있었습니다. 코드를 다음 형식으로 다시 포맷한 후 작동하게 되었습니다.

#!/usr/bin/env bash

function get_temp_dir() {
    local tmp_dir=$(mktemp -d)
    trap "{
           rm -r $tmp_dir
       }" EXIT
    retval=$tmp_dir
}

get_temp_dir
tmp_dir=$retval

ls $tmp_dir

답변1

RETURN나는 당신이 신호를 찾고 있다고 생각합니다 .

[...] SIGNAL_SPEC가 EXIT(0)인 경우 쉘을 종료할 때 ARG가 실행됩니다.
[...] SIGNAL_SPEC가 RETURN인 경우 .shell 함수나 스크립트가 실행될 때마다 ARG가 실행됩니다. 또는 소스 내장 프로그램이 실행을 완료합니다.

예:

$ bash
$ trap "echo shell exiting" EXIT
$ fn() { trap "echo function exiting" RETURN; }
$ fn
function exiting
$ (fn)
function exiting
$ value=$(fn); echo "$value"
function exiting
$ exit
shell exiting

그리고 이 질문과 밀접한 관련이 있습니다.

$ f2() { 
    local tmp=$(mktemp)
    trap 'rm "$tmp"' RETURN
    echo "$tmp"
    date >> "$tmp"
    cat "$tmp"
}
$ f2
/tmp/tmp.MHpI20X0a1
Fri May 11 14:29:01 EDT 2018
$ ls -l /tmp/tmp.MHpI20X0a1
ls: cannot access '/tmp/tmp.MHpI20X0a1': No such file or directory

답변2

내 스크립트에서는 임시 파일에 쓰고 싶을 때 처음에 다음과 같은 작업을 자주 수행합니다.

scratch="$(mktemp -d)"
trap 'rm -fr "$scratch"' EXIT

mkdir $scratch/foo; touch $scratch/foo/bar실제 파일이나 디렉터리는 스크립트 중에 이름(예:)으로 쓸 수 있지만 스크립트가 trap.

관련 정보