Я пытаюсь взять содержимое файла конфигурации (формат 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 утверждает, что не поддерживает %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"]
}
]
}
cat file.json | xargs -0 printf %q
у меня работает на debian9. Можете ли вы предоставить дополнительную информацию и пример вывода из канала до команды xargs? - person Fredrik Pihl   schedule 14.05.2019xargs -0 bash -c printf %q
— возможно,printf
доступен только как встроенная оболочка вашей системы. - person cxw   schedule 14.05.2019%q
дляprintf
указывает на более старую версию Bash. - person tripleee   schedule 14.05.2019xargs printf
будет запускать /usr/bin/printf, а не встроенную версию bash (посколькуprintf
выполняется не bash, аxargs
), а версия /usr/bin обычно не поддерживает формат%q
. - person Gordon Davisson   schedule 14.05.2019printf
? Либо он уже правильно процитирован в соответствии с правилами JSON, либо нет - в любом случае цитирование в соответствии с правилами оболочки просто исказит его. - person muru   schedule 15.05.2019bash -c
, у меня возникают проблемы сprintf
: ``` $ bash -c printf %q Hello world printf: использование: printf [-v var] формат [аргументы] `` ` - person Mark Stickley   schedule 20.05.2019bash -c 'printf "%q" "Hello"'
со всей командой после-c
, заключенной в кавычки, здесь''
.-c
использует в качестве команды только следующий аргумент, поэтому вся команда должна быть заключена в кавычки, чтобы она анализировалась как один аргумент. mywiki.wooledge.org/WordSplitting - person cxw   schedule 20.05.2019