Substituindo apenas variáveis ​​específicas por envsubst

53

Estou tentando executar a substituição de variáveis ​​de ambiente envsubst, mas quero substituir apenas variáveis ​​específicas.

A partir dos documentos, devo ser capaz de dizer envsubstpara substituir apenas determinadas variáveis, mas não consigo fazer isso.

Por exemplo, se eu tiver um arquivo contendo:

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

como devo executar envsubstpara substituir apenas a referência ${VAR_1}?

João Angelo
fonte

Respostas:

131

Pela página do manual:

envsubst [OPTION] [SHELL-FORMAT]

Se for fornecido um SHELL-FORMAT, apenas as variáveis ​​de ambiente referenciadas no SHELL-FORMAT serão substituídas; caso contrário, todas as referências de variáveis ​​de ambiente que ocorrem na entrada padrão são substituídas.

Onde strings SHELL-FORMAT são "strings com referências a variáveis ​​de shell no formato $variableou ${variable}[...] nome da variável devem consistir apenas em caracteres ASCII alfanuméricos ou sublinhados, não devem começar com um dígito e não ser vazios; caso contrário, essa referência de variável é ignorado ". .
Portanto, é preciso passar os nomes das respectivas variáveis envsubstem uma string no formato de shell (obviamente, eles precisam ser escapados / citados para serem passados ​​literalmente para envsubst). Exemplo:

arquivo de entrada, por exemplo infile:

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

e alguns valores como

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

então correndo

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

ou

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

ou

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

saídas

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

Ou, se você preferir barra invertida:

envsubst \$VAR1,\$VAR2 <infile

produz

VAR1=one
VAR2=two
VAR3=${VAR3}
don_crissti
fonte
14
por que essa não é a resposta aceita?
Qsiris
3
Sim, esta é a resposta certa!
Thomas Decaux
3
Se você conhece um prefixo de variável a ser usado para limitar as variáveis ​​que podem ser substituídas:envsubst "$(printf '${%s} ' ${!PREFIX*})" < infile
Sam Liddicott
Ou se você tiver uma lista deles SUBST_VARS:envsubst "$(printf '${%s} ' $SUBST_VARS)" < infile
Sam Liddicott