trap registers a command to run later, commonly on script exit. Planning the command as text makes cleanup behavior reviewable.

Program

Play the script to choose the cleanup target and build the trap command that would be registered.

cleanup_target
trap_plan.sh
Replay: real traced execution (multi-file project)
#!/usr/bin/env bash

cleanup_target="cache"
trap_command="rm -rf /tmp/$cleanup_target"
signal="EXIT"
plan="trap '$trap_command' $signal"
echo "$plan"
#!/usr/bin/env bash

cleanup_target="logs"
trap_command="rm -rf /tmp/$cleanup_target"
signal="EXIT"
plan="trap '$trap_command' $signal"
echo "$plan"
#!/usr/bin/env bash

cleanup_target="workspace"
trap_command="rm -rf /tmp/$cleanup_target"
signal="EXIT"
plan="trap '$trap_command' $signal"
echo "$plan"
  1. cleanup_target ← cache

    3cleanup_target="cache"4trap_command="rm -rf /tmp/$cleanup_target"
    values this stepcachecleanup_target
  2. trap_command ← rm -rf /tmp/cache

    3cleanup_target="cache"4trap_command="rm -rf /tmp/$cleanup_target"5signal="EXIT"
    values this steprm -rf /tmp/cachetrap_commandcachecleanup_target
  3. signal ← EXIT

    4trap_command="rm -rf /tmp/$cleanup_target"5signal="EXIT"6plan="trap '$trap_command' $signal"
    values this stepEXITsignal
  4. plan ← trap 'rm -rf /tmp/cache' EXIT

    5signal="EXIT"6plan="trap '$trap_command' $signal"7echo "$plan"
    values this steptrap 'rm -rf /tmp/cache' EXITplanrm -rf /tmp/cachetrap_commandEXITsignal
  5. echo "$plan"

    6plan="trap '$trap_command' $signal"7echo "$plan"
    outputtrap 'rm -rf /tmp/cache' EXIT
    values this steptrap 'rm -rf /tmp/cache' EXITplan
  1. cleanup_target ← logs

    3cleanup_target="logs"4trap_command="rm -rf /tmp/$cleanup_target"
    values this steplogscleanup_target
  2. trap_command ← rm -rf /tmp/logs

    3cleanup_target="logs"4trap_command="rm -rf /tmp/$cleanup_target"5signal="EXIT"
    values this steprm -rf /tmp/logstrap_commandlogscleanup_target
  3. signal ← EXIT

    4trap_command="rm -rf /tmp/$cleanup_target"5signal="EXIT"6plan="trap '$trap_command' $signal"
    values this stepEXITsignal
  4. plan ← trap 'rm -rf /tmp/logs' EXIT

    5signal="EXIT"6plan="trap '$trap_command' $signal"7echo "$plan"
    values this steptrap 'rm -rf /tmp/logs' EXITplanrm -rf /tmp/logstrap_commandEXITsignal
  5. echo "$plan"

    6plan="trap '$trap_command' $signal"7echo "$plan"
    outputtrap 'rm -rf /tmp/logs' EXIT
    values this steptrap 'rm -rf /tmp/logs' EXITplan
  1. cleanup_target ← workspace

    3cleanup_target="workspace"4trap_command="rm -rf /tmp/$cleanup_target"
    values this stepworkspacecleanup_target
  2. trap_command ← rm -rf /tmp/workspace

    3cleanup_target="workspace"4trap_command="rm -rf /tmp/$cleanup_target"5signal="EXIT"
    values this steprm -rf /tmp/workspacetrap_commandworkspacecleanup_target
  3. signal ← EXIT

    4trap_command="rm -rf /tmp/$cleanup_target"5signal="EXIT"6plan="trap '$trap_command' $signal"
    values this stepEXITsignal
  4. plan ← trap 'rm -rf /tmp/workspace' EXIT

    5signal="EXIT"6plan="trap '$trap_command' $signal"7echo "$plan"
    values this steptrap 'rm -rf /tmp/workspace' EXITplanrm -rf /tmp/workspacetrap_commandEXITsignal
  5. echo "$plan"

    6plan="trap '$trap_command' $signal"7echo "$plan"
    outputtrap 'rm -rf /tmp/workspace' EXIT
    values this steptrap 'rm -rf /tmp/workspace' EXITplan
trap `trap 'command' EXIT` registers cleanup for script exit.
cleanup target Keeping the target in a variable makes the final cleanup command visible.
command plan This example prints a plan instead of deleting files.