Как мне отформатировать файл json в переменную окружения bash? - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь взять содержимое файла конфигурации (в формате 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 для форматирования строки, экранирующей любые символы, которые могут быть проблемой в составе команды, но при вызове printf через xargs printf утверждает, что это не такt поддерживают% 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"]
        }
    ]
}

1 Ответ

1 голос
/ 20 мая 2019

Два способа:

  1. Используйте 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
    
  2. Проще: вам не нужно экранировать вывод команды, если вы ее цитируете. Точно так же, как 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
    

    Здесь используется более новая форма $(...) вместо `...`, поэтому результатом команды является одно слово, сохраненное как есть в переменной pwr_config. *

  3. Еще проще: если ваш npm run start скрипт заботится о пробелах в вашем JSON, он в корне нарушен :). Просто сделай:

    pwr_config="$(< config.json)" npm run start
    

    $(<...) возвращает содержимое config.json. Все они хранятся как одно слово ("") в pwr_config, символах новой строки и прочем. * Если что-то сломается, либо config.json имеет ошибку и должна быть исправлена, либо код, который вы ' Повторный запуск имеет ошибку и должен быть исправлен.

* На самом деле вам не нужны "" вокруг $(). Например, foo=$(echo a b c) и foo="$(echo a b c)" имеют одинаковый эффект. Однако я хотел бы включить "", чтобы напомнить себе, что я специально прошу, чтобы весь текст был вместе.

...