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