Основываясь на ответе @Amir , вот сценарий, который генерирует и затем включает библиотеку во время выполнения:
#!/bin/bash
set -euo pipefail
function clean_up {
trap - EXIT # Restore default handler to avoid recursion
[[ -e "${isatty_so:-}" ]] && rm "$isatty_so"
}
# shellcheck disable=2154 ## err is referenced but not assigned
trap 'err=$?; clean_up; exit $err' EXIT HUP INT TERM
isatty_so=$(mktemp --tmpdir "$(basename "$0")".XXXXX.isatty.so)
echo "int isatty(int fd) { return 1; }" \
| gcc -O2 -fpic -shared -ldl -o "$isatty_so" -xc -
# Allow user to SH=/bin/zsh faketty mycommand
"${SH:-$SHELL}" -c 'eval $@' - LD_PRELOAD="$isatty_so" "$@"
Ваш пример своеобразен, потому что новое значение полностью заменит старое значение. Исходное значение имеет только один ключ "A", а значение, которое необходимо "объединить", содержит другое значение для ключа "A", которое заменит исходное.
Итак, для иллюстрации я сделаю вид, что вы имели в виду, что эти входные данные должны быть в другом порядке (, так что «Привет, мир» перезапишет «Прощай, мир», а «Это была шутка» останется без изменений. ).
Это можно сделать так:
( echo "{\"A\":\"Goodbye world\", \"B\": \"This was a joke\"}" ; echo "{\"A\":\"Hello world\"}" ) | jq -s add
Суть в том, что вы просто последовательно вводите два объекта json, поэтому вы используете -s
, чтобы заставить jq
обрабатывать их так, как будто они находятся в массиве; а затем вы просто передаете их фильтру add
, который складывает вместе все элементы массива.
Когда объекты добавляются в jq
, они объединяются, при этом любые идентичные ключи разрешаются в пользу объекта в правой части операции добавления (, в этом случае последний из двух объектов ).
См. документацию: