Чтение свойства имени файла package.json с помощью bash

У меня есть это:

str=`cat package.json`
prop="name"
my_val="$(node -e "console.log(JSON.parse(${str})[${prop}]);")"
echo "$my_val"

Я хочу прочитать свойство name файла package.json. Я думаю, что это близко, но я получаю ошибку JSON.parse:

SyntaxError: Unexpected token o in JSON at position 1
    at Object.parse (native)
    at [eval]:1:18
    at ContextifyScript.Script.runInThisContext (vm.js:25:33)
    at Object.runInThisContext (vm.js:97:38)

Кто-нибудь знает, как исправить?

Это работает:

prop="name"
my_val="$(node -e "console.log(require('./package.json')['$prop'])")"
echo "json val: '$my_val'"

но мне интересно, как это сделать первым.

Ответ 1

Вы получаете ошибку синтаксического анализа JSON, потому что вы пытаетесь проанализировать строку

"[object Object]"

Вы должны изменить свой bash script, чтобы иметь:

node -e "console.log(JSON.parse(\`$str\`)['name'])"

Обратите внимание на обратные кавычки! Ваша строка является многострочной строкой.

Здесь выполняется (в одном из моих каталогов проектов):

$ str=`cat package.json`
$ prop="name"
$ myval="$(node -e "console.log(JSON.parse(\`$str\`)['$prop'])")"
$ echo $myval
plainscript

ДОПОЛНЕНИЕ

В ответ на OP, желающий использовать require вместо повторения содержимого файла в строку, решение может быть следующим:

$ prop="name"
$ my_val="$(node -e "console.log(require('./package.json')['$prop'])")"
$ echo $my_val
plainscript

ДОБАВЛЕНИЕ 2

Вы даже можете оставить console.log, если используете -p:

$ prop="name"
$ my_val="$(node -pe "require('./package.json')['$prop']")"
$ echo $my_val
plainscript

Ответ 2

В Linux-системе есть команда jq, которая может анализировать файлы JSON

jq -r ".name" package.json