Считать имя свойства файла 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'"
но мне интересно как это сделать первым способом.
2 ответа
Вы получаете ошибку синтаксического анализа JSON, потому что вы пытаетесь разобрать строку
"[object Object]"
Вы должны изменить свой bash-скрипт, чтобы иметь:
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
ДОПОЛНЕНИЕ
В ответ на ФП желающих использовать 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
В системе Linux есть команда JQ, которая может анализировать файлы JSON
jq -r ".name" package.json