Che cos'è SHELL-FORMAT in envsubst?


19

Quando mi sono imbattuto, envsubstvolevo usarlo per sostituire solo variabili specifiche e sospettavo che il parametro SHELL-FORMAT potesse essere ciò che si voleva, ma non riesco a farlo funzionare.

Sfortunatamente, le pagine mane infonon forniscono alcun esempio di utilizzo e dicono solo

Se viene fornito un SHELL-FORMAT, vengono sostituite solo le variabili di ambiente a cui fa riferimento SHELL-FORMAT

Il che non mi dice come fare riferimento a loro.

Risposte:


20

Come indicato dal testo, devi solo fare riferimento (ad esempio da $VARNAMEo ${VARNAME}) le variabili come in un normale comando di shell. Tuttavia, è necessario assicurarsi che la shell non li espanda in anticipo.

Ecco alcuni esempi per illustrare questo (supponendo export FOO=BAR):

$ echo '$FOO$FOO2' | envsubst
BAR

Come puoi vedere, $ FOO2 è stato sostituito da "" in quanto non è stato definito. Ora possiamo limitare tale sostituzione a soli $ FOO:

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

l'utilizzo ""invece di ''porterebbe alla sostituzione prima di volerlo:

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

(Ciò equivale alla chiamata effettiva envsubst "BAR"che non rileva variabili, quindi nessuna viene sostituita.)

Come mandiceva -page, tutte le variabili a cui si fa riferimento SHELL-FORMATvengono sostituite, quindi possiamo anche fare questo:

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

Come puoi vedere, SHELL-FORMATè abbastanza flessibile.

Infine, il parametro --variablesconsente di valutare quali variabili sono selezionate per la sostituzione mediante SHELL-FORMAT:

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

Nell'esempio di sostituzione prematura dall'alto questo avrebbe mostrato l'errore:

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

Come indicato nella manpagina, envsubstnon elabora alcuno stdinput quando --variablesè presente.


8

Ecco alcuni esempi che mi hanno aiutato a capire come usarlo correttamente. È stato sorprendente per me che envsubstonly sostituisce le variabili menzionate nel parametro.

$ 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

Non capivo nemmeno cosa significasse SHELL-FORMAT, ancora non so perché si chiama così. Ma dopo gli esperimenti di cui sopra penso di sapere cosa fa.


Questo mi aiuta molto dopo aver letto quegli esempi, dall'aiuto e dalle informazioni di man, so solo che esiste SHELL-FORMAT, ma non so come dichiararlo!
zw963,

0

La verbosità è un po 'confusa. Per riformulare il testo della guida in modo più meticoloso:

SHELL-FORMATè un argomento facoltativo della riga di comando di testo contenente riferimenti a variabili di ambiente. Per fare riferimento a una variabile di ambiente nel testo, aggiungere il prefisso al nome della variabile con a $. Ad esempio: Hello $FOO World $BARriferimenti a variabili di ambiente FOOe BAR. Il resto della stringa viene ignorato. Se SHELL-FORMATè presente l'argomento della riga di comando, quando si verifica la sostituzione delle variabili sul testo ricevuto tramite stdin, sarà limitato alle variabili a cui fa riferimento l' SHELL-FORMATargomento della riga di comando.

Quindi, per rispondere esplicitamente alla tua domanda: aggiungi il prefisso al nome della variabile $.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.