当我试图运行包含envsubst命令的脚本时,我得到这个错误,上网看,这似乎是一个标准的bash命令,所以我不确定要安装什么才能让它工作。
db2dz4w81#
brew install gettext brew link --force gettext
这将在OS X上启用envsubst,并强制它正确链接。它需要安装自制程序。
wfsdck302#
编辑:@cobberboy的回答更正确,给他投上票。
以下是我以前的回答:envsubst包含在gettext软件包中。因此,您可以使用标准构建工具(如make或homebrew)自行编译它。不过,在MacOS中安装gettext时似乎没有什么问题,详情请参见以下URL:How to install gettext on MacOS X
envsubst
gettext
make
homebrew
bprjcwpo3#
为了澄清潜在的混淆:
bash
要测试给定命令是否为内置命令,请使用
type <cmdName>
在本例中,在macOS 10.13上运行type envsubst将返回-bash: type: envsubst: not found,您可以从中推断:
type envsubst
-bash: type: envsubst: not found
$PATH
(By相比之下,在Ubuntu 12.04系统上运行相同的on命令将返回envsubst is hashed (/usr/bin/envsubst),它告诉您该实用程序存在以及它位于何处。)envsubst的一个临时替代方案是使用eval,尽管通常的警告仍然适用:仅在您控制或信任其内容的字符串上使用eval:假设sample.txt文件包含带有未展开变量引用的文本;例如:
envsubst is hashed (/usr/bin/envsubst)
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)\""
但是,有一个关键的区别:
nxowjjhe4#
如果你不想安装homebrew和gettext,一行Perl可执行文件就可以了:
#!/usr/bin/perl -p $_ =~ s/\Q${$1||$2}/$ENV{$1?$2:$4}/ while $_ =~ /(\$\{([^}]+)})|(\$(\w+))/g;
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
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' )
6条答案
按热度按时间db2dz4w81#
这将在OS X上启用envsubst,并强制它正确链接。它需要安装自制程序。
wfsdck302#
编辑:@cobberboy的回答更正确,给他投上票。
以下是我以前的回答:
envsubst
包含在gettext
软件包中。因此,您可以使用标准构建工具(如
make
或homebrew
)自行编译它。不过,在MacOS中安装
gettext
时似乎没有什么问题,详情请参见以下URL:How to install gettext on MacOS Xbprjcwpo3#
为了澄清潜在的混淆:
envsubst
是***外部 * 可执行文件,因此 * 不是Bash***的一部分;外部可执行文件是"依赖于平台的",无论是在可用的外部可执行文件方面,还是在它们支持的特定行为和特定选项方面(尽管希望有一个基于POSIX规范的公共子集)bash
中的命令称为 * builtins *,只有 * builtins * 才能在 * 所有 * 平台**上出现。要测试给定命令是否为内置命令,请使用
在本例中,在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
文件包含带有未展开变量引用的文本;例如:相当于:
是:
但是,有一个关键的区别:
envsubst
扩展*仅环境 * 变量引用**eval
也会扩展shell * 变量引用**-以及嵌入式 * 命令替换*,这就是使用eval
安全问题的原因。nxowjjhe4#
如果你不想安装homebrew和gettext,一行Perl可执行文件就可以了:
06odsfpq5#
我现在在需要envsubst的bash脚本中使用这个函数:
您可以将其用作envsubst命令-当然,它不是完整的功能或其他命令:
hmmo2u0o6#
如果你不想安装homebrew、gettext和can't make heads or tails of perl,那么一个简单的python脚本也可以做到:
与
eval
解决方案相比,这种方法的优点在于它只处理变量替换,不会像eval
那样执行任意脚本。