Выходная среда UNIX как JSON

Мне нужен однострочный код unix, который будет выводить текущую среду выполнения в виде структуры JSON, например: { "env-var" : "env-value",... и т.д...}

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

(echo "{"; printenv | sed 's/\"/\\\"/g' | sed -n 's|\(.*\)=\(.*\)|"\1"="\2"|p' | grep -v '^$' | paste -s -d"," -; echo "}")

но имеет несколько дополнительных строк, и я думаю, что это не сработает, если в значениях или переменных среды есть «=» или символы новой строки.

Предпочел бы чистый bash/sh, но компактные однострочники python/perl/ruby/etc также будут оценены.


person Constance Eustace    schedule 12.08.2015    source источник


Ответы (2)


Использование jq 1.5 (например, jq 1.5rc2 -- см. http://stedolan.github.io/jq) :

$ jq -n env
person peak    schedule 13.08.2015
comment
Хотите знать, знает ли кто-нибудь, как это сделать, но только передавая подмножество переменных текущей среды? - person Alexander Trauzzi; 01.10.2018
comment
Если вы можете определить подмножество детерминировано, это будет легко реализовать в jq. Руководство по jq находится по адресу stedolan.github.io/jq/manual. - person peak; 01.10.2018
comment
какая рифма/причина, по которой это работает с jq? Я пытался использовать jq -n echo "foo", и это не сработало... так как же он распознает команду env? - person Alexander Mills; 19.05.2019
comment
env - это функция jq. Сравните: s=abc jq -n 'env.s'; и: s=abc jq -n '$ENV.s' - person peak; 19.05.2019

Это работает для меня:

python -c 'import json, os;print(json.dumps(dict(os.environ)))'

Это довольно просто; основная сложность заключается в том, что os.environ является объектом, подобным словарю, но на самом деле это не словарь, поэтому вам нужно преобразовать его в словарь, прежде чем передавать его сериализатору json.

Добавление круглых скобок вокруг оператора печати позволяет ему работать как в Python 2, так и в 3, поэтому в обозримом будущем он должен работать на большинстве систем * nix (тем более, что Python входит по умолчанию в любой основной дистрибутив).

person Patrick Maupin    schedule 12.08.2015
comment
Это тоже сработало. Я собираюсь пойти с ответом jq из-за смехотворной краткости, но это хорошо для более распространенных сред зависимостей UNIX. - person Constance Eustace; 13.08.2015
comment
Спасибо за это. Основываясь на вашем ответе, я написал небольшой фрагмент Python для чтения файла .env и вывода его значений в json. Вероятно, есть лучшие способы, но мне нужно было это быстро :) - person GabLeRoux; 13.01.2017