我正在尝试编写一个非常简单的bash
函数,它使用一行node
脚本从 JSON 文件中读取键的值。以下是当前的内容utils.bash
:
#!/bin/bash
project_name() {
echo $(node -e "require('../package.json').name;")
}
是的,我知道有一些工具可以让我更直接地访问 JSON 数据,但所有开发团队都已经有了node
,所以它是一个现有的依赖项,而不是一个新的依赖项。
我已使该文件可执行,但是当我source scripts/utils.bash
尝试(从命令行)引用该函数时,如下所示:
PROJECT_NAME=project_name
输出只是我输入的行。当我尝试简单地执行时project_name
,出现node
错误:
Error: Cannot find module '../package.json'
该utils.bash
脚本位于项目的scripts
文件夹中,package.json
文件位于父文件夹中。我从父文件夹执行此操作(尽管我希望这无关紧要)。我尝试过 import './package.json'
,但这也给了我一个错误。
我想要的最终结果是能够通过多个脚本引用name
键的值。project.json
bash
我怎样才能做到这一点?
答案1
嗯,问题PROJECT_NAME=project_name
是它应该是PROJECT_NAME="$(project_name)"
。在这种情况下,引号不是必需的,因为它是在对 a 的赋值中标量变量,但这是一个好习惯,就像在许多其他情况下一样(包括您的echo $(...)
),省略引号意味着将结果拆分为$IFS
字符并对结果单词执行通配(这是您不想要的)。
该函数具有与其运行位置相同的工作目录,并且您说您在scripts
.所以该函数正在寻找./../package.json
not ./scripts/../package.json
。
因此,您可能想要使用./package.json
(不像package.json
路径没有 no 时那样/
,node
在默认搜索路径而不是当前工作目录中查找)并找出为什么它会给您一个错误。
您还需要node
使用console.log()
, 和输出该值删除没有意义的echo
内容$(...)
(特别是$(...)
如上所示未引用的内容)。所以:
package_name() {
node -e "console.log(require('./package.json').name)"
}
PACKAGE_NAME="$(package_name)" || handle error from node if any