Můžete použít env
zobrazit všechny aktuálně definované proměnné prostředí a poté použít tento seznam pouze k jejich nahrazení. (Manuální stránka v tom není příliš jasná, ale pro vysvětlení viz tato odpověď.)
echo 'Hello $USER $UNKNOWN' | envsubst "$(env | cut -d= -f1 | sed -e 's/^/$/')"
(Výstup env
uvádí také hodnoty proměnných, ale envsubst
také chce vidět úvodní $
, takže nemůžeme použít pouze cut -d= -f1
sama o sobě, bohužel. Můžete použít jeden sed
udělat cut
práce také, viz předchozí revize, ale preferuji jasnost cut
přes nepatrný nárůst výkonu.)
Pokud předáte argument jako $USER$PATH
až envsubst
, pak rozšíří pouze ty proměnné, na které se v tomto argumentu odkazuje.
Jedním ze způsobů by tedy mohlo být předat mu všechny aktuálně definované proměnné prostředí v tomto formátu. S zsh
:
echo 'Hello $USER ${USER} $UNDEFINED_VARIABLE' |
envsubst \$${(kj:$:)parameters[(R)*export*]}
$parameters
je speciální asociativní pole, které mapuje názvy proměnných na jejich typ$parameters[(R)*export*]
expanduje na všechny prvky asociativního pole, jehož hodnota obsahujeexport
.- se znakem
k
příznak rozšíření parametru, klíč místo hodnoty je vráceno j:$:
spojí tyto prvky pomocí$
mezi tím a jeden přidáme na začátku.
S jinými shelly se můžete vždy vrátit k perl
získat tento seznam:
echo 'Hello $USER ${USER} $UNDEFINED_VARIABLE' |
envsubst "$(perl -e 'print "\$$_" for grep /^[_a-zA-Z]\w*$/, keys %ENV')"
Dejte pozor, aby obě prozradily názvy proměnných prostředí ve výstupu ps
.
Místo toho můžete také provést celou věc v perl
:
perl -pe 's{(?|\$\{([_a-zA-Z]\w*)\}|\$([_a-zA-Z]\w*))}{$ENV{$1}//$&}ge'
Pozor, má stejná omezení jako envsubst
v tom, že nerozšíří věci jako ${VAR:-x}
a expandovalo by $HOME
ve věcech jako \$HOME
nebo $$HOME
což by shell neudělal.