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 包中。

因此,您可以使用标准构建工具(例如makehomebrew)自行编译它。

但是,在 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 &lt; .env.example 不能只是eval echo &lt; .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

Windows 8.1下安装Mac OS X 10.8虚拟机