首页 > 解决方案 > 使用 env 命令设置 OS X 环境变量,包括键/值文件中的空格

问题描述

我正在使用 OS x 和 bash 并尝试使用env命令从文件中设置环境变量,但我不明白为什么它不起作用。

示例文件(dummy.env):

KEYA=VALUEA
KEYB=\"VALUE B\"

这是我尝试过的:

env $(cat dummy.env  | grep -v "^#" | xargs) <command>

输出:

env: B: 没有这样的文件或目录

但是,如果我执行以下操作:

获取命令的输出

cat dummy.env  | grep -v "^#" | xargs

这给了我

KEYA=VALA KEYB="值 B"

然后获取确切的输出并将其替换为 env 命令,例如

env KEYA=VALA KEYB="VALUE B" <command>

有用。

我知道我可能在这里遗漏了一些基本的东西,但我只是不明白在第一种情况下它是如何不起作用的,因为它似乎忽略了双引号,但在第二种情况下它起作用了。

任何帮助将不胜感激。谢谢。

标签: bashmacosenvironment-variables

解决方案


理想情况下,您不应该使用env它。

反而:

(set -a; . dummy.env; exec yourcommand)
  • 由于括号,我们fork()为下面的所有内容都关闭了 shell 的副本,因此它不会改变启动它的 shell 的环境。
  • 由于set -a,我们将随后在该子外壳中设置的所有变量导出到环境中。
  • 由于exec,我们使用子外壳并将其替换为yourcommand.

但如果你真的,真的出于某种原因想要...

#!/usr/bin/env bash

env_args=( )
while IFS="=" read -r key value; do
  [[ $key = "#"* ]] && continue     # skip comments
  [[ $key && $value ]] || continue  # skip lines without a key and a value
  case $value in
    '\"'*'\"')  value=${value#'\"'}; value=${value%'\"'} ;;
    '"'*'"')    value=${value#'"'}; value=${value%'"'} ;;
  esac
  env_args+=( "$key=$value" )
done <dummy.env

env "${env_args[@]}" your_command
  • 因为这个内容没有通过 shell 的解析器,所以我们需要在内容被读取后去掉(文字)引号,以及(文字)反斜杠。
  • 为了确保参数边界保持在一起并受到尊重,我们组装了一个数组,并仔细引用了对该数组的添加及其最终扩展。

推荐阅读