我正在尝试编写一个非常简单的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
我怎样才能做到这一点?
嗯,问题是
PROJECT_NAME=project_name
它应该是PROJECT_NAME="$(project_name)"
。在这种情况下,引号不是必需的,因为它是在对标量变量的赋值中,但与许多其他上下文(包括您的echo $(...)
)一样,这是一个好习惯,省略引号意味着将结果拆分为$IFS
字符并对结果执行通配您不想要的单词在这里。该函数具有与其运行位置相同的工作目录,并且您说您在
scripts
. 所以该函数正在寻找./../package.json
not./scripts/../package.json
。因此,您可能想要使用
./package.json
(不像package.json
路径没有 no 时那样/
,node
在默认搜索路径而不是当前工作目录中查找)并找出为什么它会给您一个错误。您还需要
node
使用 输出该值console.log()
,并删除没有意义的值echo
($(...)
特别是$(...)
如上所示未加引号的值)。所以: