O que é SHELL-FORMAT no envsubst?

10

Quando eu tropecei em envsubst , eu queria usá-lo para substituir apenas variáveis específicas e suspeitava que o parâmetro SHELL-FORMAT poderia ser o desejado, mas não consigo fazê-lo funcionar.

Infelizmente, as páginas man e info não fornecem exemplos de uso e dizem apenas

If a SHELL-FORMAT is given, only those environment variables that are referenced in SHELL-FORMAT are substituted

O que não me diz como referenciá-los.

    
por Nobody 23.11.2016 / 12:54

3 respostas

12

Como indicado pelo texto, você só precisa referenciar (por exemplo, $VARNAME ou ${VARNAME} ) as variáveis como em um comando shell usual. No entanto, você precisa ter certeza de que o shell não os expanda antecipadamente.

Aqui estão alguns exemplos para ilustrar isso (assumindo export FOO=BAR ):

$ echo '$FOO$FOO2' | envsubst
BAR

Como você pode ver, $ FOO2 foi substituído por "" porque não foi definido. Agora podemos restringir essa substituição para apenas $ FOO por:

$ echo '$FOO$FOO2' | envsubst '$FOO'
BAR$FOO2

usando "" em vez de '' levaria a substituição antes de ser desejado:

echo '$FOO$FOO2' | envsubst "$FOO"
$FOO$FOO2

(Isso equivale à chamada efetiva envsubst "BAR" , que não detecta nenhuma variável, então nenhuma é substituída.)

Como a man -page disse, todas as variáveis referenciadas em SHELL-FORMAT são substituídas, então podemos até fazer isso:

echo '$FOO$FOO2$FOO3' | envsubst '$FOO some more text ${FOO3}'
BAR$FOO2

Como você pode ver, o SHELL-FORMAT é bastante flexível.

Finalmente, o parâmetro --variables permite avaliar quais variáveis são selecionadas para substituição pelo SHELL-FORMAT :

envsubst --variables '$FOO some more text ${FOO3}'
FOO
FOO3

No exemplo de substituição prematura acima, isso teria mostrado o erro:

$ envsubst --variables "$FOO"
(empty string returned)

Como afirmado em man -page, envsubst não processa nenhum stdinput quando --variables está presente.

    
por 23.11.2016 / 12:54
2

Aqui estão alguns exemplos que me ajudaram a entender como usá-lo corretamente. Foi surpreendente para mim que o subcompreensível substitua as variáveis mencionadas no parâmetro.

$ export FOOX="foox"
$ export FOOY="fooy"
$ export FOOZ="fooz"

$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst            
x foox y fooy z fooz

$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst '$FOOX'
x foox y $FOOY z $FOOZ

$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst '$FOOX $FOOZ'
x foox y $FOOY z fooz

$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst '$FOOZ $FOOY'
x $FOOX y fooy z fooz

Eu não entendi o que o SHELL-FORMAT quis dizer, ainda não sei por que ele é chamado assim. Mas depois das experiências acima, acho que sei o que faz.

    
por 18.05.2017 / 20:56
0

O palavreado é um pouco confuso. Para reformular o texto de ajuda com mais meticulosidade:

SHELL-FORMAT is an optional text command line argument containing references to environment variables. To reference an environment variable in the text, prefix the variable name with a $. For example: Hello $FOO World $BAR references environment variables FOO and BAR. The rest of the string is ignored. If the SHELL-FORMAT command line argument is present, then when variable substitution occurs on text received through stdin, it will be limited to variables referenced in the SHELL-FORMAT command line argument.

Então, para responder à sua pergunta explicitamente: Prefixe o nome da variável com $ .

    
por 18.10.2018 / 18:31