首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >npm告诉.env文件不存在(但它确实存在),它甚至可以打印它

npm告诉.env文件不存在(但它确实存在),它甚至可以打印它
EN

Stack Overflow用户
提问于 2020-01-22 12:28:29
回答 2查看 1K关注 0票数 1

我只想简单地在npm脚本中使用环境变量,而不需要安装不必要的依赖项

我在项目根目录中有一个.env文件,包含

代码语言:javascript
运行
复制
AWS_S3_BUCKET_ID=whatever

我的package.json包括以下脚本

代码语言:javascript
运行
复制
"scripts": {
  "grep": "echo $(grep AWS_S3_BUCKET_ID .env | cut -d '=' -f2)",
  "source": "source .env && echo $AWS_S3_BUCKET_ID",
  "test-source": "[ -f .env ] && cat .env && npm run source"
},

信不信由你,npm run grep执行,而npm run source不执行。

现在,荒谬的是,npm run source返回了以下错误消息

代码语言:javascript
运行
复制
sh: line 0: source: .env: file not found

npm run test-source首先打印文件内容(!!)然后说文件不存在。

这种行为有什么原因吗?

编辑:我在Linux上

EN

Stack Overflow用户

发布于 2022-04-20 12:12:07

看起来,这与npm-run 默认情况下运行脚本而不是/bin/bash有关。

这可能会让人感到意外,因为在/bin/sh点命令中,文件名相对于$PATH,不包括当前的工作目录。您实际上可以通过以下方法对其进行测试:

代码语言:javascript
运行
复制
$ sh
sh-5.1$ . .env
sh: .: .env: file not found
sh-5.1$

这就是您需要确保将相对路径显式地命名为. ./.env的原因。但是,在/bin/bash上,点命令(.)是源的别名,它的行为不同,并且包含当前工作目录作为文件查找的一部分,因此下面这两个命令都是同义词和“您希望的”工作。

代码语言:javascript
运行
复制
$ /bin/bash
$ . .env
$ source .env

为了解决这个问题,您可以使用相对文件路径,或者运行带有标志script-shell标志的NPM脚本,就像@wowyesokay提到的那样。作为npm run test-source --script-shell /bin/bash。或者,您可能希望将该选项添加到您的.npmrc文件中,因此所有调用都使用script-shell作为bash。

此页上,您可以找到关于/bin/sh上的点命令的一些有价值的解释,最值得注意的是,这一部分:

如果文件名中有斜杠,则。(点)查找命名文件。如果没有斜线。(点)在PATH变量中指定的目录中搜索文件。当一些人使用点在工作目录中运行文件时,这可能会让他们感到惊讶,但是他们的搜索规则并不是为了查看工作目录而设置的。因此,shell找不到shell文件。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59859797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档