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

nszi6y05  于 2023-01-21  发布在  Shell
关注(0)|答案(6)|浏览(260)

当我试图运行包含envsubst命令的脚本时,我得到这个错误,上网看,这似乎是一个标准的bash命令,所以我不确定要安装什么才能让它工作。

db2dz4w8

db2dz4w81#

brew install gettext
brew link --force gettext

这将在OS X上启用envsubst,并强制它正确链接。它需要安装自制程序。

wfsdck30

wfsdck302#

编辑:@cobberboy的回答更正确,给他投上票。

brew install gettext
brew link --force gettext

以下是我以前的回答:
envsubst包含在gettext软件包中。
因此,您可以使用标准构建工具(如makehomebrew)自行编译它。
不过,在MacOS中安装gettext时似乎没有什么问题,详情请参见以下URL:How to install gettext on MacOS X

bprjcwpo

bprjcwpo3#

为了澄清潜在的混淆:

  • envsubst是***外部 * 可执行文件,因此 * 不是Bash***的一部分;外部可执行文件是"依赖于平台的",无论是在可用的外部可执行文件方面,还是在它们支持的特定行为和特定选项方面(尽管希望有一个基于POSIX规范的公共子集)
      • 直接内置到bash中的命令称为 * builtins *,只有 * builtins * 才能在 * 所有 * 平台**上出现。

测试给定命令是否为内置命令,请使用

type <cmdName>

在本例中,在macOS 10.13上运行type envsubst将返回-bash: type: envsubst: not found,您可以从中推断:

  • envsubst不是内置的
  • envsubst不在系统的$PATH中(因此可能不存在于系统中)

(By相比之下,在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 * 变量引用**-以及嵌入式 * 命令替换*,这就是使用eval安全问题的原因。
nxowjjhe

nxowjjhe4#

如果你不想安装homebrew和gettext,一行Perl可执行文件就可以了:

#!/usr/bin/perl -p
$_ =~ s/\Q${$1||$2}/$ENV{$1?$2:$4}/ while $_ =~ /(\$\{([^}]+)})|(\$(\w+))/g;
06odsfpq

06odsfpq5#

我现在在需要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
hmmo2u0o

hmmo2u0o6#

如果你不想安装homebrew、gettext和can't make heads or tails of perl,那么一个简单的python脚本也可以做到:

envsubst() {
  python -c 'import os,sys;[sys.stdout.write(os.path.expandvars(l)) for l in sys.stdin]'
}

eval解决方案相比,这种方法的优点在于它只处理变量替换,不会像eval那样执行任意脚本。

$ cat > sample.txt <<'EOF'
Honey, I'm $USER
and I'm $HOME.
Danger: $( echo 'eval can do evil here, but python expandvars rocks' )
EOF

$ envsubst < sample.txt

Honey, I'm mattmc3
and I'm /Users/mattmc3.
Danger: $( echo 'eval can do evil here, but python expandvars rocks' )

相关问题