envsubst:在 Mac OS X 10.8 上找不到命令
Posted
技术标签:
【中文标题】envsubst:在 Mac OS X 10.8 上找不到命令【英文标题】:envsubst: command not found on Mac OS X 10.8 【发布时间】:2014-06-30 12:17:06 【问题描述】:当我尝试运行包含 envsubst 命令的脚本时,我收到此错误。在网上看,这似乎是一个标准的 bash 命令,所以我不确定要安装什么才能让它工作。
【问题讨论】:
envsubst
包含在 gettext
包中。你可以自己编译。见***.com/questions/14940383/…
想要将其添加为答案以便我接受吗?
我把它作为答案发布了。
【参考方案1】:
brew install gettext
brew link --force gettext
这将在 OS X 上启用 envsubst,并强制它正确链接。它需要安装自制软件。
【讨论】:
Linking /usr/local/Cellar/gettext/0.19.8.1... 194 symlinks created
... wtf 194 符号链接?
@AlexanderMills 是的 gettext
包含了很多东西;安装envsubst
似乎有点过头了,但这是最快、最简单的方法。
似乎他们正在对每个文件进行符号链接,而不仅仅是对文件夹进行符号链接【参考方案2】:
编辑:@cobberboy 的回答更正确。给他点赞。
brew install gettext
brew link --force gettext
以下是我的旧答案:
envsubst
包含在 gettext
包中。
因此,您可以使用标准构建工具(例如make
或homebrew
)自行编译它。
但是,在 MacOS 中安装 gettext
时似乎没有什么问题。
详情见以下网址:How to install gettext on MacOS X
【讨论】:
虽然envsubst
是 gettext 的一部分(由 homebrew 安装),但默认情况下它没有链接。我希望这是因为 gettext 是一个仅限小桶的公式。您可以告诉 homebrew 链接小桶,但这可能会产生意想不到的副作用。一种侵入性较小的方法是通过将alias envsubst='/usr/local/Cellar/gettext/0.19.6/bin/envsubst'
添加到您的.profile
(或等效项)来设置别名。当然,您可能安装了另一个版本的 gettext。你可以通过运行brew info gettext
来了解它。
@trkoch 你可能想给/usr/local/opt/gettext/bin/envsubst
起别名,它在升级后仍然存在
虽然这是公认的答案,但请向下滚动到@cobberboy 的答案,因为您可能需要强制链接。
我想知道为什么我突然获得了更多的支持。感谢您的慷慨@ymonad
链接 /usr/local/Cellar/gettext/0.19.8.1... 创建了 194 个符号链接 ... wtf 194 个符号链接?【参考方案3】:
为了消除潜在的混乱:
envsubst
是一个外部可执行文件,因此不是 Bash 的一部分;外部可执行文件平台相关,无论是在哪些可用以及它们的特定行为和它们支持的特定选项方面(尽管,希望有一个基于 POSIX 规范的通用子集)
直接内置在bash
中的命令称为builtins,只有它们 可以依赖于所有 平台强>。
要测试给定命令是否为内置命令,请使用
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
文件包含带有未扩展变量引用的文本;例如:
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 变量引用 too - 以及 嵌入式 命令替换,这就是使用eval
一个安全问题。
【讨论】:
我喜欢eval echo
的想法,因为我相信来源,但它不一样..envsubst < .env.example
不能只是eval echo < .env.example
【参考方案4】:
我现在在需要 envsubst 的 bash 脚本中使用它:
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 周围添加"
但我还没有尝试过【参考方案5】:
如果您不想安装 homebrew 和 gettext,可以使用一行 perl 可执行文件:
#!/usr/bin/perl -p
$_ =~ s/\Q$$1||$2/$ENV$1?$2:$4/ while $_ =~ /(\$\([^]+))|(\$(\w+))/g;
【讨论】:
以上是关于envsubst:在 Mac OS X 10.8 上找不到命令的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Mac OS X 10.8 / Xcode 4.4 上使用/安装 gcc
MAC OS X 10.8 上的 gcc 4.8 抛出“架构 x86_64 的未定义符号:”
Mac OS X Mountain Lion 10.8 中的 Firefox X11
如何卸载 Xcode 4.4 命令行工具(Mac OS X 10.8 Mountain Lion)?
sh Mac OS X 10.7 / 10.8 / 10.9(Lion / Mountain Lion / Mavericks)Bootstrapping