Co to jest SHELL-FORMAT w envsubst?

19

Kiedy natknąłem się na envsubstto, chciałem go użyć do zastąpienia tylko określonych zmiennych i podejrzewałem, że parametr SHELL-FORMAT może być tym, czego potrzebuję, ale nie mogę go uruchomić.

Niestety, mana infostrony nie daje żadnego przykładu użytkowaniu i tylko powiedzieć

Jeśli podano FORMAT SHELL, podstawiane są tylko te zmienne środowiskowe, do których odwołuje się FORMAT SHELL

Co nie mówi mi, jak się do nich odwoływać.

Nikt
źródło

Odpowiedzi:

20

Jak wskazano w tekście, wystarczy odwołać się (np. Przez $VARNAMElub ${VARNAME}) do zmiennych, jak w zwykłym poleceniu powłoki. Musisz jednak upewnić się, że powłoka nie rozwinie ich wcześniej.

Oto kilka przykładów ilustrujących to (zakładając export FOO=BAR):

$ echo '$FOO$FOO2' | envsubst
BAR

Jak widać, $ FOO2 został zastąpiony przez „”, ponieważ nie został zdefiniowany. Teraz możemy ograniczyć tę wymianę tylko do $ FOO poprzez:

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

użycie ""zamiast ''prowadziłoby do podstawienia, zanim będzie potrzebne:

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

(Jest to skuteczne wywołanie, envsubst "BAR"które nie wykrywa żadnych zmiennych, więc żadne nie są zastępowane).

Jak mannapisano na stronie, wszystkie zmienne, do których istnieją odwołania, SHELL-FORMATsą zastępowane, więc możemy nawet to zrobić:

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

Jak widać, SHELL-FORMATjest dość elastyczny.

Na koniec parametr --variablespozwala ocenić, które zmienne są wybrane do podstawienia przez SHELL-FORMAT:

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

W powyższym przykładzie przedwczesnego zastąpienia pokazałby błąd:

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

Jak podano na stronie man, envsubstnie przetwarza żadnego standardowego wejścia, jeśli --variablesjest obecne.

Nikt
źródło
8

Oto kilka przykładów, które pomogły mi zrozumieć, jak prawidłowo go używać. Zaskoczyło mnie, że envsubstonly zastępuje zmienne wymienione w parametrze.

$ 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

Nie rozumiałem też, co znaczy FORMAT SHELL, wciąż nie wiem, dlaczego tak się nazywa. Ale po powyższych eksperymentach myślę, że wiem, co to robi.

dedeibel
źródło
To bardzo mi pomaga po przeczytaniu tego przykładu, z pomocy człowieka i informacji, wiem tylko, że FORMAT SHELL istnieje, ale nie wiem, jak to zadeklarować!
zw963
0

Verbage to trochę zamieszanie. Aby dokładniej przeredagować tekst pomocy:

SHELL-FORMATjest opcjonalnym argumentem tekstowym wiersza poleceń zawierającym odniesienia do zmiennych środowiskowych. Aby odwołać się do zmiennej środowiskowej w tekście, poprzedź nazwę zmiennej znakiem a $. Na przykład: Hello $FOO World $BARodwołuje się do zmiennych środowiskowych FOOi BAR. Reszta ciągu jest ignorowana. Jeśli SHELL-FORMATobecny jest argument wiersza poleceń, to w przypadku zastąpienia zmiennych w tekście otrzymanym przez stdin, będzie on ograniczony do zmiennych wymienionych w SHELL-FORMATargumencie wiersza poleceń.

Aby więc wyraźnie odpowiedzieć na twoje pytanie: poprzedź nazwę zmiennej za pomocą $.

wizulus
źródło