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

And*_*rew 62 bash shell terminal sh command-line-interface

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

cob*_*boy 183

brew install gettext
brew link --force gettext 
Run Code Online (Sandbox Code Playgroud)

这将在OS X上启用envsubst,并强制它正确链接.它需要安装自制软件.

  • 这应该被标记为正确的答案! (3认同)

ymo*_*nad 91

编辑:@cobberboy的anwer更正确.支持他.

brew install gettext
brew link --force gettext 
Run Code Online (Sandbox Code Playgroud)

以下是我的回答:

envsubst包含在gettext包中.

因此,您可以使用标准构建工具(如make或使用)自行编译homebrew.

但是,gettext在MacOS中安装时似乎没什么问题.有关详细信息,请参阅以下URL:如何在MacOS X上安装gettext

  • 虽然`envsubst`是gettext的一部分(由homebrew安装),但默认情况下它没有链接.我希望这是因为gettext是一个只有keg的公式.你可以告诉自制软件链接桶,但这可能会产生意想不到的副作用.一种不太干扰的方法是通过将`alias envsubst ='/ usr/local/Cellar/gettext/0.19.6/bin/envsubst'添加到`.profile`(或等效的)来设置别名.当然,您可能安装了另一个版本的gettext.您可以通过运行`brew info gettext`来了解它. (8认同)
  • @trkoch 你可能想给 `/usr/local/opt/gettext/bin/envsubst` 取别名,它可以在升级后继续存在 (2认同)

mkl*_*nt0 13

为了消除潜在的混淆:

  • envsubst是一个外部可执行文件,因此不是Bash的一部分 ; 外部可执行文件是平台相关的,无论是哪些都可用,以及它们的特定行为和它们支持的特定选项(尽管,希望有一个基于POSIX规范的公共子集)
  • 直接构建的命令bash称为builtins,只有它们可以依赖于所有平台.

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

type <cmdName>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,type envsubst在macOS 10.13上运行返回-bash: type: envsubst: not found,您可以从中推断:

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

(相比之下,在例如Ubuntu 12.04系统上运行相同的命令会返回envsubst is hashed (/usr/bin/envsubst),这会告诉您实用程序存在以及它位于何处.)


虽然通常的警告适用,但是envsubst使用临时替代方法eval:eval仅对您控制或信任的内容使用:

假设一个sample.txt文件包含带有未扩展变量引用的文本; 例如:

cat > sample.txt <<'EOF'
Honey, I'm $USER
and I'm $HOME.
EOF
Run Code Online (Sandbox Code Playgroud)

相当于:

envsubst < sample.txt
Run Code Online (Sandbox Code Playgroud)

是:

eval "echo \"$(sed 's/"/\\"/g' sample.txt)\""
Run Code Online (Sandbox Code Playgroud)

然而,有一个至关重要的区别:

  • envsubst扩展环境变量引用
  • eval将扩大外壳变量引用 -以及嵌入式命令替换,这是利用了eval一个安全问题.