0

bashスクリプトから子プロセスとして(バックティックを使用して)呼び出されるbash関数があります。この関数 (子プロセスで実行されている) が親のトラップ ハンドラを変更する方法はありますか? この関数は、親が終了したときにクリーンアップしたい一時ファイルを作成します。例として

function get_roe_dir() {
    tmp_dir=`mktemp -d`
    if [ $? -eq 0 ]; then
        # some processing on $tmp_dir
        echo "$tmp_dir"
        # Add "rm -rf $tmp_dir" to parent's EXIT trap
    fi
}

次に、呼び出しスクリプトには次のようなものがあります。

roe_dir=`get_roe_dir`
# Some processing using files in $roe_dir.

$roe_dirこのスクリプトが終了したら、(EXIT トラップを使用して) 削除したいと思います。これを達成するためのクリーンな方法のアイデアはありますか?

get_roe_dir()出力をキャプチャするためにサブシェルで実行されるため、関数に EXIT トラップを追加できません。したがって、get_roe_dir()が戻るとすぐにサブシェルが終了し、EXIT トラップが呼び出され、作成された一時ディレクトリが削除されます。

4

1 に答える 1

0

正確には理解できないかもしれませんが、次の作品:

set_trap() {
    trap "rm -rf $roe_dir" 0
}

get_roe_dir() {
    dir=$(mktemp -d /tmp/roe.XXXXXX) && echo $dir && return 0
    return 1
}

roe_dir=$(get_roe_dir) && set_trap
ls -la "$roe_dir"
echo going to exit - check ls -l $roe_dir should not exists
于 2013-07-25T21:03:15.270 に答える