Was ist SHELL-FORMAT in envsubst?

19

Als ich darauf gestoßen envsubstbin, wollte ich damit nur bestimmte Variablen ersetzen und vermutete, dass der SHELL-FORMAT-Parameter gewünscht ist, aber ich kann ihn nicht zum Laufen bringen.

Leider geben die manund infoSeiten kein Anwendungsbeispiel und sagen nur

Wenn ein SHELL-FORMAT angegeben ist, werden nur die Umgebungsvariablen ersetzt, auf die in SHELL-FORMAT verwiesen wird

Was mir nicht sagt, wie ich darauf verweisen soll.

Niemand
quelle

Antworten:

20

Wie im Text angegeben, müssen Sie nur wie in einem normalen Shell-Befehl auf die Variablen verweisen (z. B. durch $VARNAMEoder ${VARNAME}). Sie müssen jedoch vorher sicherstellen, dass die Shell sie nicht erweitert.

Hier einige Beispiele, um dies zu veranschaulichen (vorausgesetzt export FOO=BAR):

$ echo '$FOO$FOO2' | envsubst
BAR

Wie Sie sehen, wurde $ FOO2 durch "" ersetzt, da es nicht definiert wurde. Jetzt können wir diesen Ersatz auf nur $ FOO beschränken, indem wir:

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

Verwenden ""anstelle von ''würde zu einer Substitution führen, bevor dies gewünscht wird:

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

(Dies entspricht dem effektiven Aufruf envsubst "BAR", der keine Variablen erkennt, sodass keine ersetzt werden.)

Wie auf der man-page bereits erwähnt, werden alle Variablen, auf die verwiesen SHELL-FORMATwird, ersetzt, sodass wir dies sogar tun können:

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

Wie Sie sehen können, SHELL-FORMATist das recht flexibel.

Schließlich --variableskönnen Sie mit dem Parameter auswerten, welche Variablen zum Ersetzen durch die SHELL-FORMATfolgenden Variablen ausgewählt werden :

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

Im obigen Beispiel der vorzeitigen Substitution hätte dies den Fehler gezeigt:

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

manVerarbeitet, envsubstwie auf der Seite angegeben, keine Standardeingabe, wenn --variablesvorhanden.

Niemand
quelle
7

Hier sind einige Beispiele, die mir geholfen haben, die richtige Verwendung zu verstehen. Es war für mich überraschend, dass er die im Parameter genannten Variablen auf erstaunliche Weise ersetzt.

$ 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

Ich habe auch nicht verstanden, was SHELL-FORMAT bedeutet und weiß immer noch nicht, warum es so heißt. Aber nach den obigen Experimenten glaube ich zu wissen, was es tut.

dedeibel
quelle
Dies hilft mir sehr, nachdem ich das Beispiel gelesen habe, von Menschenhilfe und Info, weiß nur, dass es SHELL-FORMAT gibt, weiß aber nicht, wie ich es deklarieren soll!
21.
0

Die Aussprache ist etwas verwirrend. Um den Hilfetext genauer zu formulieren:

SHELL-FORMATist ein optionales Textbefehlszeilenargument, das Verweise auf Umgebungsvariablen enthält. Um auf eine Umgebungsvariable im Text zu verweisen, stellen Sie dem Variablennamen ein voran $. Zum Beispiel: Hello $FOO World $BARverweist auf Umgebungsvariablen FOOund BAR. Der Rest der Zeichenfolge wird ignoriert. Wenn das SHELL-FORMATBefehlszeilenargument vorhanden ist, ist die Variablensubstitution für über stdin empfangenen Text auf Variablen beschränkt, auf die im SHELL-FORMATBefehlszeilenargument verwiesen wird .

Um Ihre Frage explizit zu beantworten: Stellen Sie dem Variablennamen das Präfix voran $.

Wizulus
quelle