2017-08-23 37 views
1

我有一个文件(env/api.env)我节点的环境变量,我跑在bash这个脚本来发布变量:NODE ENV变量脚本在bash运行,而不是在zsh中

export $(cat env/api.env | grep -v ^#) 

如果我尝试在zsh而不是bash中运行它不起作用。变量将不会发布,并保持未定义状态。

我该如何做一个在bash/zsh中运行的脚本?

+0

如何处理文件内容的示例? – ghoti

+0

仅仅是一个类似组变量: DB_HOST =本地主机 DB_PORT = 3307 DB_TEST_HOST =本地主机 DB_TEST_PORT = 3308 – armova

+0

这是相关的。请[将其添加到您的问题](https://stackoverflow.com/posts/45828944/edit)。 – ghoti

回答

1

你显然有Zsh的extendedglob(AKA EXTENDED_GLOBZSHEXPN(1))选项设置,这是治疗的转义^水珠否定器 - 它得到grep之前。这是一个很好的Zsh 选项,值得启用IMO,但你必须经常引用一些。

所以,如果你把它写成你的方法应该工作:

% export $(grep -v '^#' env/api.env) 

但是,你更安全的关闭只是让api.env是一个简单的shell (岩组和Bash兼容)文件,这样就不必笨拙地解析出 的评论等。然后,它只是:

% source env/api.env 

source最好.在这种情况下,因为你从 当前目录工作。


你正在努力完成的是什么工具不能很好处理类似 direnvdotenv的精神。

+0

你能详细谈谈'source'-vs-'.'吗?在bash中,文档将它作为具有完全相同实现的别名,但在POSIX sh中,只指定了'.'(使其成为更便携的选项)。 zsh会做不同的事情吗? –

+1

是的,'source'和'.'在Bash中是相同的,但是Zsh稍微区​​分它们。在ZSHBUILTINS(1)中,我们看到:“和'一样。',除了当前目录总是被搜索并且总是首先在$ path中的目录之前被搜索。“ –