Defensive File Operations
Backup Name
Plan Before Writing
Before overwriting a file, a script can compute the backup name and report the copy plan. The visible plan is easier to review than a hidden write.
Program
Play the script to choose the filename and see the backup plan.
backup_name_plan.sh
Replay: real traced execution (multi-file project)
#!/usr/bin/env bash
filename="config.yml"
backup="$filename.bak"
plan="copy $filename $backup"
echo "$plan"
#!/usr/bin/env bash
filename="secrets.env"
backup="$filename.bak"
plan="copy $filename $backup"
echo "$plan"
filename ← config.yml
3filename="config.yml"4backup="$filename.bak"values this stepconfig.ymlfilenamebackup ← config.yml.bak
3filename="config.yml"4backup="$filename.bak"5plan="copy $filename $backup"values this stepconfig.yml.bakbackupconfig.ymlfilenameplan ← copy config.yml config.yml.bak
4backup="$filename.bak"5plan="copy $filename $backup"6echo "$plan"values this stepcopy config.yml config.yml.bakplanconfig.ymlfilenameconfig.yml.bakbackupecho "$plan"
5plan="copy $filename $backup"6echo "$plan"outputcopy config.yml config.yml.bakvalues this stepcopy config.yml config.yml.bakplan
filename ← secrets.env
3filename="secrets.env"4backup="$filename.bak"values this stepsecrets.envfilenamebackup ← secrets.env.bak
3filename="secrets.env"4backup="$filename.bak"5plan="copy $filename $backup"values this stepsecrets.env.bakbackupsecrets.envfilenameplan ← copy secrets.env secrets.env.bak
4backup="$filename.bak"5plan="copy $filename $backup"6echo "$plan"values this stepcopy secrets.env secrets.env.bakplansecrets.envfilenamesecrets.env.bakbackupecho "$plan"
5plan="copy $filename $backup"6echo "$plan"outputcopy secrets.env secrets.env.bakvalues this stepcopy secrets.env secrets.env.bakplan
backup
A backup preserves the old file before a risky write.
plan
Printing the plan makes the operation reviewable before execution.
suffix
A predictable suffix keeps backup names easy to find.