Zamiana tylko określonych zmiennych na envsubst

53

Próbuję wykonać zamianę zmiennych środowiskowych envsubst, ale chcę zastąpić tylko określone zmienne.

Z dokumentów powinienem być w stanie powiedzieć, envsubstaby zastąpić tylko niektóre zmienne, ale nie jestem w stanie tego zrobić.

Na przykład, jeśli mam plik zawierający:

VAR_1=${VAR_1}
VAR_2=${VAR_2}

jak powinienem wykonać, envsubstaby zastąpić tylko odwołanie do ${VAR_1}?

João Angelo
źródło

Odpowiedzi:

130

Na stronę podręcznika:

envsubst [OPTION] [SHELL-FORMAT]

Jeśli podano FORMAT SHELL, tylko te zmienne środowiskowe, do których odwołuje się FORMAT SHELL, są zastępowane; w przeciwnym razie wszystkie odniesienia zmiennych środowiskowych występujące na standardowym wejściu zostaną podstawione.

Gdzie ciągi SHELL-FORMAT są „ciągami z odniesieniami do zmiennych powłoki w formie $variablelub ${variable}[...] Nazwy zmiennych muszą składać się wyłącznie ze znaków alfanumerycznych lub znaków podkreślenia ASCII, nie mogą zaczynać się cyfrą i być niepuste; w przeciwnym razie takie odwołanie do zmiennej jest ignorowane ”. . Trzeba
więc przekazać odpowiednie nazwy zmiennych do envsubstłańcucha formatu powłoki (oczywiście trzeba je wstawić / cytować, aby dosłownie przekazać envsubst). Przykład:

plik wejściowy np . infile:

VAR1=${VAR1}
VAR2=${VAR2}
VAR3=${VAR3}

i niektóre wartości jak

export  VAR1="one" VAR2="two" VAR3="three"

następnie biegnie

envsubst '${VAR1} ${VAR3}' <infile

lub

envsubst '${VAR1},${VAR3}' <infile

lub

envsubst '${VAR1}
${VAR3}' <infile

wyjścia

VAR1=one
VAR2=${VAR2}
VAR3=three

Lub, jeśli wolisz ukośnik odwrotny:

envsubst \$VAR1,\$VAR2 <infile

produkuje

VAR1=one
VAR2=two
VAR3=${VAR3}
don_crissti
źródło
13
dlaczego nie jest to akceptowana odpowiedź?
Qsiris,
3
Tak, to właściwa odpowiedź!
Thomas Decaux
3
Jeśli znasz prefiks zmiennej, aby ograniczyć zmienne, które można zastąpić:envsubst "$(printf '${%s} ' ${!PREFIX*})" < infile
Sam Liddicott,
A jeśli masz ich listę, SUBST_VARSto:envsubst "$(printf '${%s} ' $SUBST_VARS)" < infile
Sam Liddicott,