当我尝试运行包含envsubst命令的脚本时,出现此错误。在线查看,这似乎是一个标准的bash命令,所以我不确定要安装什么才能让它工作。
答案 0 :(得分:134)
brew install gettext
brew link --force gettext
这将在OS X上启用envsubst,并强制它正确链接。它需要安装自制软件。
答案 1 :(得分:53)
编辑:@cobberboy的答案更正确。支持他。
brew install gettext
brew link --force gettext
以下是我的回答:
envsubst
包含在gettext
包中。
因此,您可以使用标准构建工具(例如make
或使用homebrew
)自行编译。
但是,在MacOS中安装gettext
时似乎没什么问题。
有关详细信息,请参阅以下网址:How to install gettext on MacOS X
答案 2 :(得分:13)
澄清潜在的混淆:
envsubst
是 外部可执行文件,因此不属于Bash ;外部可执行文件是依赖于平台的,无论是哪些都可用,以及它们的特定行为和它们支持的特定选项(尽管,希望有一个基于POSIX规范的公共子集) bash
的命令称为 builtins ,只有他们可以依赖 all 平台。要测试给定命令是否为内置,请使用
type <cmdName>
在目前的情况下,在macOS 10.13上运行type envsubst
会返回-bash: type: envsubst: not found
,您可以从中推断出来:
envsubst
不是内置的envsubst
不在您的系统$PATH
中(因此可能不在您的系统中)(相比之下,在例如Ubuntu 12.04系统上运行相同的on命令会返回envsubst is hashed (/usr/bin/envsubst)
,这会告诉您该实用程序存在以及它位于何处。)
envsubst
的临时替代方法是使用eval
,但通常的警告适用:仅对您控制或信任其内容的字符串使用eval
:
假设sample.txt
文件包含带有未扩展变量引用的文本; e.g:
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
会扩展 shell 变量引用 - 以及嵌入式命令替换 ,这是eval
安全问题的解决方法。 答案 3 :(得分:2)
我现在在我的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
答案 4 :(得分:2)
如果您不想麻烦安装homebrew和gettext,则只需要一行perl可执行文件即可:
#!/usr/bin/perl -p
$_ =~ s/\Q${$1||$2}/$ENV{$1?$2:$4}/ while $_ =~ /(\$\{([^}]+)})|(\$(\w+))/g;