#shellcheck shell=sh # config: where settings come from, and in which order. # # Layers, last one wins: # defaults < /etc/conf.d/myos, /etc/default/myos < ~/.config/myos/config # < /.env < /.env. < environment < CLI VAR=val # MYOS_CONF_PRIORITY=system restores the old make behaviour where the system # file won over the project .env. # # Files are dotenv: KEY=value, one per line, # comments, optional quotes. # They are parsed, never sourced: a value never runs as code. # myos_dotenv_parse FILE print normalized KEY=value lines myos_dotenv_parse() { [ -f "$1" ] || return 0 sed -e 's/\r$//' -e '/^[[:space:]]*#/d' -e '/^[[:space:]]*$/d' "$1" | while IFS= read -r _line; do case $_line in *=*) ;; *) continue ;; esac _k=${_line%%=*} _v=${_line#*=} _k=$(printf '%s' "$_k" | tr -d '[:space:]') # whitespace around the = is not part of the value (make: s/[[:space:]]*=[[:space:]]*/=/) _v=${_v#"${_v%%[![:space:]]*}"} case $_k in ''|*[!A-Za-z0-9_]*) continue ;; esac # strip one layer of matching quotes case $_v in \"*\") _v=${_v#\"}; _v=${_v%\"} ;; \'*\') _v=${_v#\'}; _v=${_v%\'} ;; esac printf '%s=%s\n' "$_k" "$_v" done } # myos_dotenv_load FILE set the variables of FILE that are not already set # (an already exported variable wins, as `?=` does in make) myos_dotenv_load() { [ -f "$1" ] || return 0 while IFS= read -r _kv; do _k=${_kv%%=*} [ -n "$(myos_var "$_k")" ] && continue eval "$_k=\${_kv#*=}" done </dev/null | grep -oE '\$\{?[A-Z0-9_]+' | tr -d '{}$' | sort -u | tr '\n' ' ' | sed 's/ $//' } # myos_env_export VAR... print VAR='value' for each variable that has a value, # ready to be passed to env(1) myos_env_export() { for _v in "$@"; do _val=$(myos_var "$_v") [ -n "$_val" ] && printf "%s=%s\n" "$_v" "$_val" done return 0 }