bash - 使用 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>
有用。
我知道我可能在这里遗漏了一些基本的东西,但我只是不明白在第一种情况下它是如何不起作用的,因为它似乎忽略了双引号,但在第二种情况下它起作用了。
任何帮助将不胜感激。谢谢。
解决方案
理想情况下,您不应该使用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 的解析器,所以我们需要在内容被读取后去掉(文字)引号,以及(文字)反斜杠。
- 为了确保参数边界保持在一起并受到尊重,我们组装了一个数组,并仔细引用了对该数组的添加及其最终扩展。
推荐阅读
- node.js - npm 与 Node.js 不兼容
- javascript - 如何在 ReactJS 中使用来自 API 的数据显示图表(rechart)
- push-notification - AoG 的 POST 或 GET 请求将 TTS 消息发送到特定的家庭扬声器
- c - 长双 vs 长长
- python - Plotly 流媒体服务不再有效
- apache - Apache VirtualHost 设置在 1 个 IP 地址上的多个服务器,每个域都有多个域,每个域都有 SSL
- dart - 在 dart 中使用 AES/CFB8 加密字节
- python - 我正在尝试在 python 中自动化生命表
- snowflake-cloud-data-platform - Snowflake 中的复制命令无法解析数据中的 \n
- reactjs - 我的 firebase 存储功能不允许我从函数中获取 url