Что такое SHELL-FORMAT в envsubst?

19

Когда я наткнулся на это, envsubstя хотел использовать его для замены только определенных переменных и подозревал, что параметр SHELL-FORMAT может быть тем, что нужно, но я не могу заставить его работать.

К сожалению, manи infoстраница не дает ни одного примера использования и только слово

Если указан SHELL-FORMAT, подставляются только те переменные среды, на которые есть ссылки в SHELL-FORMAT.

Который не говорит мне, как ссылаться на них.

Никто
источник

Ответы:

20

Как указано в тексте, вы просто должны ссылаться (например, с помощью $VARNAMEили ${VARNAME}) на переменные, как в обычной команде оболочки. Однако вы должны убедиться, что оболочка не раскрывает их заранее.

Вот несколько примеров, чтобы проиллюстрировать это (при условии export FOO=BAR):

$ echo '$FOO$FOO2' | envsubst
BAR

Как видите, $ FOO2 был заменен на "", поскольку он не был определен. Теперь мы можем ограничить эту замену только $ FOO:

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

использование ""вместо ''привело бы к замене, прежде чем это требуется:

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

(Это соответствует эффективному вызову, envsubst "BAR"который не обнаруживает никаких переменных, поэтому ни одна из них не заменяется.)

Как manсказано в -page, все переменные, на которые есть ссылки SHELL-FORMAT, заменены, поэтому мы можем даже сделать это:

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

Как видите, SHELL-FORMATон довольно гибкий.

Наконец, параметр --variablesпозволяет вам оценить, какие переменные выбраны для замены SHELL-FORMAT:

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

В приведенном выше примере преждевременной замены это показало бы ошибку:

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

Как указано в man-page, envsubstне обрабатывает stdinput, когда --variablesприсутствует.

Никто
источник
8

Вот несколько примеров, которые помогли мне понять, как правильно его использовать. Мне было удивительно, что envsubstonly заменяет переменные, упомянутые в параметре.

$ 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

Я тоже не понимал, что значит SHELL-FORMAT, до сих пор не знаю, почему он так назван. Но после вышеупомянутых экспериментов я думаю, что знаю, что это делает.

dedeibel
источник
Это очень помогло мне после прочтения этого примера, из справки и информации man, только знаю, что существует SHELL-FORMAT, но не знаю, как это объявить!
zw963
0

Словоблеск немного путаница. Чтобы более тщательно перефразировать текст справки:

SHELL-FORMATнеобязательный текстовый аргумент командной строки, содержащий ссылки на переменные среды Чтобы ссылаться на переменную среды в тексте, добавьте к имени переменной префикс $. Например: Hello $FOO World $BARссылки на переменные среды FOOи BAR. Остальная часть строки игнорируется. Если присутствует SHELL-FORMATаргумент командной строки, то при подстановке переменных в тексте, полученном через stdin, он будет ограничен переменными, на которые ссылается SHELL-FORMATаргумент командной строки.

Итак, чтобы ответить на ваш вопрос в явном виде: префикс имени переменной с $.

wizulus
источник