GNU/Linux >> Znalost Linux >  >> Linux

Nahraďte proměnné prostředí v textu, pokud existují

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$PATHenvsubst , 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 obsahuje export .
  • 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.


Linux
  1. envsubst:příkaz nenalezen

  2. Nahrazení proměnných prostředí v souboru vlastností

  3. Jak nahradit proměnné shellu ve složitých textových souborech

  1. Nastavit dočasné prostředí ($PATH)

  2. Jak zrušit nastavení mnoha proměnných prostředí

  3. Jak číst proměnné prostředí procesu

  1. Odkazování na proměnné prostředí *v* /etc/environment?

  2. Kontrola proměnných prostředí

  3. Proměnné prostředí v symbolických odkazech