如何将 json 文件格式化为 bash 环境变量?
How can I format a json file into a bash environment variable?
我正在尝试获取配置文件的内容(JSON 格式),删除多余的新行和空格以保持简洁,然后在启动我的应用程序之前将其分配给环境变量。
这是我到目前为止的进展:
pwr_config=`echo "console.log(JSON.stringify(JSON.parse(require('fs').readFileSync(process.argv[2], 'utf-8'))));" | node - config.json | xargs -0 printf '%q\n'` npm run start
这会将一个简短的 node.js 应用程序通过管道传输到节点运行时,并以文件名作为参数,它解析并字符串化 JSON 文件以验证它并删除任何不必要的空格。到目前为止一切顺利。
然后将此结果通过管道传输到 printf,或者至少是这样,但 printf 显然不支持这种输入方式,所以我使用 xargs 以它支持的方式传递它。
我正在使用 %q 格式化程序来格式化字符串,转义任何作为命令的一部分可能会出现问题的字符,但是当通过 xargs 调用 printf 时,printf 声称它不支持 %q。我认为这可能是因为 printf 的版本不止一个,但我不确定如何解决这个问题。
任何帮助将不胜感激,即使解决方案与我开始的完全不同 :) 谢谢!
更新
这是我在 MacOS 上获得的输出:
$ cat config.json | xargs -0 printf %q
printf: illegal format character q
我的 JSON 文件如下所示:
{
"hue_host": "192.168.1.2",
"hue_username": "myUsername",
"port": 12000,
"player_group_config": [
{
"name": "Family Room",
"player_uuid": "ATVUID",
"hue_group": "3",
"on_events": ["media.play", "media.resume"],
"off_events": ["media.stop", "media.pause"]
},
{
"name": "Lounge",
"player_uuid": "STVUID",
"hue_group": "1",
"on_events": ["media.play", "media.resume"],
"off_events": ["media.stop", "media.pause"]
}
]
}
两种方式:
使用 xargs
获取 bash
的 printf
内置而不是 printf(1)
可执行文件,可能在 /usr/bin/printf
(感谢@GordonDavisson):
pwr_config=`echo "console.log(JSON.stringify(JSON.parse(require('fs').readFileSync(process.argv[2], 'utf-8'))));" | node - config.json | xargs -0 bash -c 'printf "%q\n"'` npm run start
更简单:如果引用命令,则不必转义命令的输出。就像 echo "<|>"
在 bash
中可以一样,这也应该有效:
pwr_config="$(echo "console.log(JSON.stringify(JSON.parse(require('fs').readFileSync(process.argv[2], 'utf-8'))));" | node - config.json )" npm run start
这使用较新的 $(...)
形式而不是 `...`
,因此命令的结果是将 as-is 存储到 pwr_config
变量中的单个单词。*
更简单:如果您的 npm run start
脚本关心 JSON 中的空格,它根本就坏了:)。只要做:
pwr_config="$(< config.json)" npm run start
$(<...)
returns config.json
的内容。它们都作为单个单词 (""
) 存储到 pwr_config
、换行符和所有内容中。* 如果出现问题,config.json
中的任何一个都会出错并且应该被修复,或者你的代码 运行 有错误需要被修复。
* 你实际上不需要 $()
周围的 ""
。例如,foo=$(echo a b c)
和 foo="$(echo a b c)"
具有相同的效果。但是,我喜欢包含 ""
以提醒自己我特别要求将所有文本放在一起。
我正在尝试获取配置文件的内容(JSON 格式),删除多余的新行和空格以保持简洁,然后在启动我的应用程序之前将其分配给环境变量。
这是我到目前为止的进展:
pwr_config=`echo "console.log(JSON.stringify(JSON.parse(require('fs').readFileSync(process.argv[2], 'utf-8'))));" | node - config.json | xargs -0 printf '%q\n'` npm run start
这会将一个简短的 node.js 应用程序通过管道传输到节点运行时,并以文件名作为参数,它解析并字符串化 JSON 文件以验证它并删除任何不必要的空格。到目前为止一切顺利。
然后将此结果通过管道传输到 printf,或者至少是这样,但 printf 显然不支持这种输入方式,所以我使用 xargs 以它支持的方式传递它。
我正在使用 %q 格式化程序来格式化字符串,转义任何作为命令的一部分可能会出现问题的字符,但是当通过 xargs 调用 printf 时,printf 声称它不支持 %q。我认为这可能是因为 printf 的版本不止一个,但我不确定如何解决这个问题。
任何帮助将不胜感激,即使解决方案与我开始的完全不同 :) 谢谢!
更新 这是我在 MacOS 上获得的输出:
$ cat config.json | xargs -0 printf %q
printf: illegal format character q
我的 JSON 文件如下所示:
{
"hue_host": "192.168.1.2",
"hue_username": "myUsername",
"port": 12000,
"player_group_config": [
{
"name": "Family Room",
"player_uuid": "ATVUID",
"hue_group": "3",
"on_events": ["media.play", "media.resume"],
"off_events": ["media.stop", "media.pause"]
},
{
"name": "Lounge",
"player_uuid": "STVUID",
"hue_group": "1",
"on_events": ["media.play", "media.resume"],
"off_events": ["media.stop", "media.pause"]
}
]
}
两种方式:
使用
xargs
获取bash
的printf
内置而不是printf(1)
可执行文件,可能在/usr/bin/printf
(感谢@GordonDavisson):pwr_config=`echo "console.log(JSON.stringify(JSON.parse(require('fs').readFileSync(process.argv[2], 'utf-8'))));" | node - config.json | xargs -0 bash -c 'printf "%q\n"'` npm run start
更简单:如果引用命令,则不必转义命令的输出。就像
echo "<|>"
在bash
中可以一样,这也应该有效:pwr_config="$(echo "console.log(JSON.stringify(JSON.parse(require('fs').readFileSync(process.argv[2], 'utf-8'))));" | node - config.json )" npm run start
这使用较新的
$(...)
形式而不是`...`
,因此命令的结果是将 as-is 存储到pwr_config
变量中的单个单词。*更简单:如果您的
npm run start
脚本关心 JSON 中的空格,它根本就坏了:)。只要做:pwr_config="$(< config.json)" npm run start
$(<...)
returnsconfig.json
的内容。它们都作为单个单词 (""
) 存储到pwr_config
、换行符和所有内容中。* 如果出现问题,config.json
中的任何一个都会出错并且应该被修复,或者你的代码 运行 有错误需要被修复。
* 你实际上不需要 $()
周围的 ""
。例如,foo=$(echo a b c)
和 foo="$(echo a b c)"
具有相同的效果。但是,我喜欢包含 ""
以提醒自己我特别要求将所有文本放在一起。