Когда я пытаюсь запустить сценарий, содержащий команду envsubst, я получаю эту ошибку. Глядя в Интернет, это кажется стандартной командой bash, поэтому я не уверен, что установить, чтобы заставить ее работать.
Когда я пытаюсь запустить сценарий, содержащий команду envsubst, я получаю эту ошибку. Глядя в Интернет, это кажется стандартной командой bash, поэтому я не уверен, что установить, чтобы заставить ее работать.
Ответы:
Изменить: ответ @cobberboy более правильный. проголосовать за него.
brew install gettext
brew link --force gettext
Вот мой старый ответ:
envsubst
входит в gettext
комплект.
Поэтому вы можете скомпилировать его самостоятельно, используя стандартные инструменты сборки, такие как make
или using 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 и заставит его правильно связываться. Требуется установка homebrew.
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
(и, следовательно, скорее всего, отсутствует в вашей системе)(Напротив, выполнение той же команды on, например, возвращается система 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
"
около $ line, но я еще не пробовал
envsubst
входит вgettext
комплект. вы можете компилировать самостоятельно. см. stackoverflow.com/questions/14940383/…