Signals and Job Control Concepts
Trap Plan
Build a Cleanup Command
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.
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"
cleanup_target ← cache
3cleanup_target="cache"4trap_command="rm -rf /tmp/$cleanup_target"values this stepcachecleanup_targettrap_command ← rm -rf /tmp/cache
3cleanup_target="cache"4trap_command="rm -rf /tmp/$cleanup_target"5signal="EXIT"values this steprm -rf /tmp/cachetrap_commandcachecleanup_targetsignal ← EXIT
4trap_command="rm -rf /tmp/$cleanup_target"5signal="EXIT"6plan="trap '$trap_command' $signal"values this stepEXITsignalplan ← 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_commandEXITsignalecho "$plan"
6plan="trap '$trap_command' $signal"7echo "$plan"outputtrap 'rm -rf /tmp/cache' EXITvalues this steptrap 'rm -rf /tmp/cache' EXITplan
cleanup_target ← logs
3cleanup_target="logs"4trap_command="rm -rf /tmp/$cleanup_target"values this steplogscleanup_targettrap_command ← rm -rf /tmp/logs
3cleanup_target="logs"4trap_command="rm -rf /tmp/$cleanup_target"5signal="EXIT"values this steprm -rf /tmp/logstrap_commandlogscleanup_targetsignal ← EXIT
4trap_command="rm -rf /tmp/$cleanup_target"5signal="EXIT"6plan="trap '$trap_command' $signal"values this stepEXITsignalplan ← 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_commandEXITsignalecho "$plan"
6plan="trap '$trap_command' $signal"7echo "$plan"outputtrap 'rm -rf /tmp/logs' EXITvalues this steptrap 'rm -rf /tmp/logs' EXITplan
cleanup_target ← workspace
3cleanup_target="workspace"4trap_command="rm -rf /tmp/$cleanup_target"values this stepworkspacecleanup_targettrap_command ← rm -rf /tmp/workspace
3cleanup_target="workspace"4trap_command="rm -rf /tmp/$cleanup_target"5signal="EXIT"values this steprm -rf /tmp/workspacetrap_commandworkspacecleanup_targetsignal ← EXIT
4trap_command="rm -rf /tmp/$cleanup_target"5signal="EXIT"6plan="trap '$trap_command' $signal"values this stepEXITsignalplan ← 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_commandEXITsignalecho "$plan"
6plan="trap '$trap_command' $signal"7echo "$plan"outputtrap 'rm -rf /tmp/workspace' EXITvalues 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.