envsubst vs eval for variable substitution
eval works across all (albeit more dangerous)
envsubst does NOT work with bash ${THORG_ROOT:?} syntax
#!/bin/bash
export THORG_ROOT="/home/user/thorg"
echo "=== envsubst vs eval comparison ==="
echo
# Test cases
test1='${THORG_ROOT:?}/.ai_out/log.txt'
test2='${THORG_ROOT}/.ai_out/log.txt'
test3='$THORG_ROOT/.ai_out/log.txt'
test4='/tmp/.ai_out/log.txt'
for test_path in "$test1" "$test2" "$test3" "${test4:?}"; do
echo "Input: $test_path"
result=$(envsubst <<< "$test_path")
echo "envsubst: $result"
eval result_eval="$test_path"
echo "eval: $result_eval"
echo
done
echo "Summary: envsubst only expands \$VAR and \${VAR}, not \${VAR:?}"
Output
=== envsubst vs eval comparison ===
# Here you can see envsubst did not substitute the variable
Input: ${THORG_ROOT:?}/.ai_out/log.txt
envsubst: ${THORG_ROOT:?}/.ai_out/log.txt
eval: /home/user/thorg/.ai_out/log.txt
Input: ${THORG_ROOT}/.ai_out/log.txt
envsubst: /home/user/thorg/.ai_out/log.txt
eval: /home/user/thorg/.ai_out/log.txt
Input: $THORG_ROOT/.ai_out/log.txt
envsubst: /home/user/thorg/.ai_out/log.txt
eval: /home/user/thorg/.ai_out/log.txt
Input: /tmp/.ai_out/log.txt
envsubst: /tmp/.ai_out/log.txt
eval: /tmp/.ai_out/log.txt