【问题标题】:Zsh - export: not valid in this context: charge"}'Zsh - 导出:在此上下文中无效:charge"}'
【发布时间】:2021-05-13 11:41:03
【问题描述】:

我有一个值为 .env 的文件

export AB_EXPERIMENT_NAMES='{"consumer_estimated_delivery_charges_v1":"Delivery charge"}'

但是当我像下面这样运行它时,我得到了错误

export: not valid in this context: charge\"}\"'
export $(cat .env | xargs -0)

问题似乎出在Delivery charge 的空间中。 我该如何解决这个问题。

【问题讨论】:

  • 你为什么使用xargs?只要.env 包含有效的shell 分配(顺便说一句,这不是 一个安全的假设),您就可以简单地获取它。 . .env.
  • 我在dockerfile中使用它RUN cd ${APP_DIR} && \ export $(cat .env | xargs -0) && \ mix local.hex --force && \ mix local.rebar --force
  • @SahilPaudel,该上下文应该在您最初的问题陈述中。但它仍然不能解释你为什么使用混淆的export $(cat .env | xargs -0)。这除了没有做任何有用的事情外,还涉及“对猫的无用使用”。你真的只运行cat .env | xargs -0 并检查了输出吗?提示:export export AB_EXPERIMENT_NAMES... 没有任何意义。
  • @SahilPaude,另一个提示:在交互式 zsh 会话中运行 set -x 然后 export "$(cat .env | xargs -0)"。请注意命令替换周围的双引号,以禁止对其输出进行分词。
  • @SahilPaudel:你的命令相当于export $(xargs -0 /bin/echo <.env),所以为了看看效果,我建议你做一个普​​通的xargs -0 /bin/echo <.env 来观察发生了什么。您将立即看到,为什么您的方法不起作用。问题是你为什么要用这种不寻常的方式来设置环境?这是一种编程挑战吗?

标签: docker environment-variables zsh cat


【解决方案1】:

首先,不要做export $(cat .env | xargs -0),你应该做

source .env

但是为了它,假设您实际上想从.env 读取导出语句,然后将它们作为参数传递给另一个命令,但在它们前面没有export 这个词。在 Zsh 中正确的做法是

<command> ${${(fz)"$( < .env )"}:#export}

它的工作原理如下:

  • &lt; .env 读取.env 的内容并将它们传递给标准输入。如果没有命令连接到&lt;(就像这里的情况),那么 Zsh 将隐式使用cat
  • $( &lt; .env ) 捕获 &lt; .env 的输出并将其扩展为字符串。请注意,使用 $( &lt; ... ) 比使用 $( cat ... ) 更快,因为 Zsh 实际上并没有为其生成单独的进程。
  • "$( &lt; .env )" 确保保留换行符。
  • ${(f)...} 在换行符处分割字符串。
  • ${(z)...} 将字符串拆分为 shell 单词。
  • 在结果的 shell 单词数组中,${...:#export} 删除单词 export 的所有实例。

请参阅http://zsh.sourceforge.net/Doc/Release/Expansion.html 了解更多信息。

【讨论】:

    猜你喜欢
    • 2014-04-19
    • 2017-05-27
    • 1970-01-01
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多