jq --argjson port "$newport" '."peer-port" |= $port' file.json >file-new.json
Это создаст новый файл с именем file-new.json
со значением ключа peer-port
, измененным на значение переменной оболочки $newport
. Переменная оболочки будет вставлена как -, то есть без какой-либо кодировки, поэтому убедитесь, что это простое целое число (, используя --arg
вместо --argjson
, чтобы вставить его как закодированную строку ).
Программа Linux выполняется с помощью системного вызова execve
. execve
имеет следующую подпись:
int execve(const char *filename, char *const argv[], char *const envp[]);
Последний аргумент, envp
, используется для передачи окружения процессу в виде массива строк, каждая из которых имеет форму ключ=значение. По соглашению одна и та же среда передается от одного процесса к другому, если вызывающий процесс не внес в нее какие-либо изменения. Ядро принимает меры к тому, чтобы новая программа получала среду в стеке таким же образом, как передаются аргументы программы.
Библиотечные функции execl
, execlp
, execv
и execvp
не принимают параметр envp
(, а функции execle
и execvpe
принимают ). Эти функции берут среду из глобальной переменной environ
в вызывающем процессе. Таким образом, программе, использующей функцию execle
для запуска другой программы, не нужно беспокоиться о передаче среды, а библиотечная функция делает это автоматически «за кулисами».
Все упомянутые библиотечные функции в итоге вызывают системный вызов execve
, передавая среду в параметре envp
.