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