Envsubst: команда не найдена в Mac OS X 10.8
Когда я пытаюсь запустить script, который содержит команду envsubst, я получаю эту ошибку. Если смотреть онлайн, это, кажется, стандартная команда bash, поэтому я не уверен, что устанавливать, чтобы заставить ее работать.
Ответы
Ответ 1
envsubst
включен в пакет gettext
.
Поэтому вы можете скомпилировать его самостоятельно, используя стандартные инструменты сборки, такие как make
или используя homebrew
.
Однако при установке gettext
в MacOS он малозначичен.
Подробнее см. В следующем URL: Как установить gettext на MacOS X
Ответ 2
brew install gettext
brew link --force gettext
Это позволит envsubst в OS X и заставить его правильно соединить. Это требует, чтобы доморощенный был установлен.
Ответ 3
Чтобы устранить потенциальную путаницу:
-
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
a проблема безопасности.
Ответ 4
Я использую это сейчас в своем bash script, для которого требуется 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