envsubst:在Mac OS X 10.8上找不到命令

时间:2014-05-13 00:04:24

标签: bash shell terminal sh command-line-interface

当我尝试运行包含envsubst命令的脚本时,出现此错误。在线查看,这似乎是一个标准的bash命令,所以我不确定要安装什么才能让它工作。

5 个答案:

答案 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;