Що таке 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сказано на сторінці, всі змінні, на які посилається посилання 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він присутній.


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, досі не знаю, чому його називають так. Але після вищезазначених експериментів я думаю, що я знаю, що це робить.


Це мені дуже допомагає, прочитавши ці приклади, з довідки та інформації про людину, знаю лише, що існує SHELL-FORMAT, але не знаю, як це заявити!
zw963

0

Багатослів'я - це трохи плутанина. Щоб переробити текст довідки більш ретельно:

SHELL-FORMAT- необов'язковий аргумент командного рядка тексту, що містить посилання на змінні середовища. Для посилання на змінну середовища в тексті, приставте ім'я змінної з a $. Наприклад: Hello $FOO World $BARпосилання на змінні середовища FOOта BAR. Решта рядка ігнорується. Якщо SHELL-FORMATаргумент командного рядка присутній, тоді, коли підміна змінної відбувається на текст, отриманий через stdin, він буде обмежений змінними, на які посилається SHELL-FORMATаргумент командного рядка.

Отже, щоб чітко відповісти на ваше запитання: Поставте ім'я змінної за допомогою $.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.