Quando tento executar um script que contém o comando envsubst, recebo este erro. Olhando online, este parece ser um comando bash padrão, então não tenho certeza do que instalar para fazê-lo funcionar.
Quando tento executar um script que contém o comando envsubst, recebo este erro. Olhando online, este parece ser um comando bash padrão, então não tenho certeza do que instalar para fazê-lo funcionar.
Respostas:
Edit: a resposta de @cobberboy é mais correta. votar a favor dele.
brew install gettext
brew link --force gettext
A seguir está minha velha resposta:
envsubst
está incluído no gettext
pacote.
Portanto, você pode compilá-lo por conta própria, usando ferramentas de construção padrão como make
ou usando homebrew
.
No entanto, parece ter poucos problemas ao instalar gettext
no MacOS. Consulte o seguinte url para obter detalhes: Como instalar gettext no MacOS X
envsubst
seja parte do gettext (instalado pelo homebrew), ele não é vinculado por padrão. Espero que isso aconteça porque gettext é uma fórmula exclusiva para barris. Você poderia dizer ao homebrew para ligar o barril, mas isso pode ter efeitos colaterais indesejados. Uma abordagem menos intrusiva é configurar um alias adicionando alias envsubst='/usr/local/Cellar/gettext/0.19.6/bin/envsubst'
ao seu .profile
(ou equivalente). Claro, você pode ter outra versão do gettext instalada. Você pode aprender sobre isso executando brew info gettext
.
/usr/local/opt/gettext/bin/envsubst
que sobrevive a atualizações
brew install gettext
brew link --force gettext
Isso habilitará o envsubst no OS X e o forçará a vincular corretamente. Requer a instalação do homebrew.
Linking /usr/local/Cellar/gettext/0.19.8.1... 194 symlinks created
... links simbólicos wtf 194?
gettext
inclui um monte de coisas; parece um exagero apenas ser envsubst
instalado, mas é a maneira mais rápida e simples.
Para esclarecer possíveis confusões:
envsubst
é um executável externo e, portanto, não faz parte do Bash ; executáveis externos são dependentes da plataforma , tanto em termos de quais estão disponíveis quanto em seu comportamento específico e as opções específicas que eles suportam (embora, esperançosamente, haja um subconjunto comum baseado nas especificações POSIX)bash
são chamados builtins , e só eles podem ser invocadas para estar presente em todas as plataformas .Para testar se um determinado comando é interno , use
type <cmdName>
No caso em questão, a execução type envsubst
no macOS 10.13 retorna -bash: type: envsubst: not found
, a partir do qual você pode inferir:
envsubst
NÃO é embutidoenvsubst
não está no seu sistema $PATH
(e, portanto, provavelmente não está presente no seu sistema)(Por outro lado, a execução do mesmo comando no, por exemplo, um sistema Ubuntu 12.04 retorna envsubst is hashed (/usr/bin/envsubst)
, informando que o utilitário está presente e onde está localizado.)
Uma alternativa improvisada envsubst
é usar eval
, embora a advertência usual se aplique: use eval
apenas em strings cujo conteúdo você controla ou confia:
Considere um sample.txt
arquivo contendo texto com referências de variáveis não expandidas; por exemplo:
cat > sample.txt <<'EOF'
Honey, I'm $USER
and I'm $HOME.
EOF
O equivalente a:
envsubst < sample.txt
é:
eval "echo \"$(sed 's/"/\\"/g' sample.txt)\""
Há uma diferença crucial , no entanto:
envsubst
expande apenas referências de variáveis de ambienteeval
irá expandir as referências de variáveis de shell também - bem como substituições de comandos embutidos , que é o que faz uso de eval
uma preocupação de segurança.eval echo
porque confio na fonte, mas não é a mesma .. envsubst < .env.example
não pode ser apenaseval echo < .env.example
Estou usando isso agora em meu script bash que requer 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
você pode usá-lo como o comando envsubst - é claro que não é um recurso completo ou outra coisa:
envsubst <<<'Honey, I am $HOME.'
envsubst < input > output 2> corrupt
"
cerca de $ linha, mas eu não tentei ainda
envsubst
está incluído nogettext
pacote. você pode compilar por conta própria. consulte stackoverflow.com/questions/14940383/…