14

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

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

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

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

3 ответа3

14

Как указано в тексте, вам просто нужно ссылаться (например, $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 , все переменные, на которые есть ссылки в 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 , envsubst не обрабатывает никакой ввод stdinput, когда присутствует --variables .

4

Вот несколько примеров, которые помогли мне понять, как правильно его использовать. Мне было удивительно, что 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, до сих пор не знаю, почему он так назван. Но после вышеупомянутых экспериментов я думаю, что знаю, что это делает.

0

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .