Configuration Files
Configuration Defaults
Script Values First
Scripts often start with defaults, then let configuration data override only the values that should change.
Program
Play the script to set a selectable default timeout and build the effective value.
config_defaults.sh
Replay: real traced execution (multi-file project)
#!/usr/bin/env bash
timeout=5
config_timeout=""
effective_timeout=${config_timeout:-$timeout}
echo "timeout=$effective_timeout"
#!/usr/bin/env bash
timeout=3
config_timeout=""
effective_timeout=${config_timeout:-$timeout}
echo "timeout=$effective_timeout"
#!/usr/bin/env bash
timeout=8
config_timeout=""
effective_timeout=${config_timeout:-$timeout}
echo "timeout=$effective_timeout"
timeout ← 5
3timeout=54config_timeout=""values this step5timeoutconfig_timeout ← (empty)
3timeout=54config_timeout=""5effective_timeout=${config_timeout:-$timeout}values this step(empty)config_timeouteffective_timeout ← 5
4config_timeout=""5effective_timeout=${config_timeout:-$timeout}6echo "timeout=$effective_timeout"values this step5effective_timeout(empty)config_timeout5timeoutecho "timeout=$effective_timeout"
5effective_timeout=${config_timeout:-$timeout}6echo "timeout=$effective_timeout"outputtimeout=5values this step5effective_timeout
timeout ← 3
3timeout=34config_timeout=""values this step3timeoutconfig_timeout ← (empty)
3timeout=34config_timeout=""5effective_timeout=${config_timeout:-$timeout}values this step(empty)config_timeouteffective_timeout ← 3
4config_timeout=""5effective_timeout=${config_timeout:-$timeout}6echo "timeout=$effective_timeout"values this step3effective_timeout(empty)config_timeout3timeoutecho "timeout=$effective_timeout"
5effective_timeout=${config_timeout:-$timeout}6echo "timeout=$effective_timeout"outputtimeout=3values this step3effective_timeout
timeout ← 8
3timeout=84config_timeout=""values this step8timeoutconfig_timeout ← (empty)
3timeout=84config_timeout=""5effective_timeout=${config_timeout:-$timeout}values this step(empty)config_timeouteffective_timeout ← 8
4config_timeout=""5effective_timeout=${config_timeout:-$timeout}6echo "timeout=$effective_timeout"values this step8effective_timeout(empty)config_timeout8timeoutecho "timeout=$effective_timeout"
5effective_timeout=${config_timeout:-$timeout}6echo "timeout=$effective_timeout"outputtimeout=8values this step8effective_timeout
Follow the Default
timeoutstarts at5.config_timeoutis empty.${config_timeout:-$timeout}usestimeoutbecause the config value is empty.effective_timeoutbecomes5.- The script prints
timeout=5. | timeout | config_timeout | effective_timeout | output | | ---: | --- | ---: | --- | | 3 | empty | 3 | timeout=3 | | 5 | empty | 5 | timeout=5 | | 8 | empty | 8 | timeout=8 |
default
A script default gives the program a value even when config is absent.
:-
`${name:-fallback}` expands to the fallback when `name` is empty or unset.
effective value
The effective value is the one later commands should use.
Exercise: config_defaults.sh
Reproduce timeout=5, then use the pinned timeout values 3 and 8 to predict timeout=3 and timeout=8.