O que é o SHELL-FORMAT no envsubst?

19

Quando me deparei com envsubstisso, queria usá-lo para substituir apenas variáveis ​​específicas e suspeitei que o parâmetro SHELL-FORMAT poderia ser o desejado, mas não consigo fazê-lo funcionar.

Infelizmente, as páginas mane infonão dão nenhum exemplo de uso e apenas dizem

Se um SHELL-FORMAT for fornecido, apenas as variáveis ​​de ambiente referenciadas no SHELL-FORMAT serão substituídas

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

Ninguém
fonte

Respostas:

20

Conforme indicado pelo texto, você apenas precisa fazer referência (por exemplo, por $VARNAMEou ${VARNAME}) às variáveis ​​como em um comando shell comum. No entanto, você deve garantir que o shell não os expanda antes.

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

$ echo '$FOO$FOO2' | envsubst
BAR

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

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

usar em ""vez de ''levaria a substituição antes que fosse desejado:

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

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

Como a página man-disse, todas as variáveis ​​mencionadas SHELL-FORMATsão substituídas, para que possamos fazer isso:

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

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

Por fim, o parâmetro --variablespermite 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 mostraria o erro:

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

Conforme declarado na manpágina-, envsubstnão processa nenhum stdinput quando --variablespresente.

Ninguém
fonte
7

Aqui estão alguns exemplos que me ajudaram a entender como usá-lo corretamente. Foi surpreendente para mim que o envsubstonly substitui 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

Também não entendi o que significa SHELL-FORMAT, ainda não sei por que é chamado assim. Mas após as experiências acima, acho que sei o que faz.

dedeibel
fonte
Isso me ajudou muito depois de ler esses exemplos, de man help and info, apenas sei que o SHELL-FORMAT existe, mas não sei como declará-lo!
Zw963
0

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

SHELL-FORMATé um argumento de linha de comando de texto opcional que contém referências a variáveis ​​de ambiente. Para fazer referência a uma variável de ambiente no texto, prefixe o nome da variável com a $. Por exemplo: Hello $FOO World $BARreferencia variáveis ​​de ambiente FOOe BAR. O restante da string é ignorado. Se o SHELL-FORMATargumento da linha de comando estiver presente, quando a substituição de variável ocorrer no texto recebido por meio de stdin, ele será limitado às variáveis ​​referenciadas no SHELL-FORMATargumento da linha de comando.

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

wizulus
fonte