Что такое SHELL-формат в envsubst?

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

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

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

не подскажите как чтобы сослаться на них.

5
задан Nobody
источник

3 ответов

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

12
отвечен Nobody 2018-10-21 21:36:10
источник

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

2
отвечен dedeibel 2018-08-29 08:08:52
источник

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

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

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

0
отвечен wizulus 2018-10-18 16:31:45
источник

Другие вопросы bash environment-variables