Коли я намагаюся запустити сценарій, що містить команду envsubst, я отримую цю помилку. Дивлячись в Інтернеті, це здається стандартною командою bash, тому я не впевнений, що встановлювати, щоб змусити її працювати.
Коли я намагаюся запустити сценарій, що містить команду envsubst, я отримую цю помилку. Дивлячись в Інтернеті, це здається стандартною командою bash, тому я не впевнений, що встановлювати, щоб змусити її працювати.
Відповіді:
Редагувати: відповідь @cobberboy правильніша. підтримати його.
brew install gettext
brew link --force gettext
Ось моя стара відповідь:
envsubst
входить до gettext
комплект.
Тому ви можете скомпілювати його самостійно, використовуючи стандартні інструменти побудови, такі як make
або за допомогоюhomebrew
.
Однак, схоже, у нього мало проблем при встановленні gettext
в MacOS. Дивіться наступну URL-адресу для деталей: Як встановити gettext на MacOS X
envsubst
є частиною gettext (як встановлено homebrew), він не пов’язаний за замовчуванням. Я сподіваюся, що це тому, що gettext - це формула, що містить лише кеґ. Ви можете сказати homebrew пов’язати бочку, але це може мати небажані побічні ефекти. Менш нав'язливим підходом є встановлення псевдоніма шляхом додавання alias envsubst='/usr/local/Cellar/gettext/0.19.6/bin/envsubst'
до вашого .profile
(або еквівалента). Звичайно, у вас може бути встановлена інша версія gettext. Ви можете дізнатися про це, запустивши brew info gettext
.
/usr/local/opt/gettext/bin/envsubst
який переживає оновлення
brew install gettext
brew link --force gettext
Це дозволить envsubst в OS X і змусить його правильно зв’язуватись. Для цього потрібно встановити доморощену мову.
Linking /usr/local/Cellar/gettext/0.19.8.1... 194 symlinks created
... символічні посилання wtf 194?
gettext
включає в себе надзвичайно багато речей; здається надмірним, щоб просто envsubst
встановити, але це найшвидший і найпростіший спосіб.
Щоб усунути потенційну плутанину:
envsubst
є зовнішнім виконуваним файлом і, отже, не є частиною Bash ; зовнішні виконувані файли залежать від платформи як з точки зору того, які з них доступні, так і з точки зору їхньої конкретної поведінки та конкретних параметрів, які вони підтримують (хоча, сподіваємось, існує загальна підмножина на основі специфікацій POSIX)bash
, називаються вбудованими , і лише на них можна покластися, щоб вони були присутніми на всіх платформах .Щоб перевірити, чи є дана команда вбудованою , використовуйте
type <cmdName>
У type envsubst
наведеному випадку запуск на macOS 10.13 повертається -bash: type: envsubst: not found
, з чого можна зробити висновок:
envsubst
НЕ є вбудованимenvsubst
відсутній у вашій системі $PATH
(і, отже, відсутній у вашій системі)(Навпаки, те саме виконувати за командою, наприклад, повертається система Ubuntu 12.04 envsubst is hashed (/usr/bin/envsubst)
, яка повідомляє, що утиліта присутня і де вона знаходиться.)
Імпровізованою альтернативою envsubst
є використання eval
, хоча застосовується звичайне застереження: використанняeval
лише для рядків, вмістом яких ви керуєте чи довіряєте:
Припустимо sample.txt
файл, що містить текст із розгорнутими посиланнями на змінні; наприклад:
cat > sample.txt <<'EOF'
Honey, I'm $USER
and I'm $HOME.
EOF
Еквівалент:
envsubst < sample.txt
це:
eval "echo \"$(sed 's/"/\\"/g' sample.txt)\""
Однак є суттєва різниця :
envsubst
розширює лише посилання на змінні середовищаeval
буде розширюватися оболонками посилання змінної теж - а також вбудовані команди заміна , яка є те , що робить використання eval
в проблемі безпеки.eval echo
тому що я довіряю джерелу, але це не те саме .. envsubst < .env.example
не може бути простоeval echo < .env.example
Зараз я використовую це у своєму скрипті bash, який вимагає envsubst:
if ! which envsubst > /dev/null 2>&1; then
envsubst() {
while read line; do
line=$( echo $line | sed 's/"/\\"/g' )
eval echo $line
done
}
fi
Ви можете використовувати його як команду envsubst - звичайно, це не повноцінна функція чи щось інше:
envsubst <<<'Honey, I am $HOME.'
envsubst < input > output 2> corrupt
"
близько $ рядка, але я ще не пробував це
envsubst
входить вgettext
комплект. Ви можете скомпілювати самостійно. см stackoverflow.com/questions/14940383 / ...