Как новый процесс, выполняемый в Bash, всегда имеет одни и те же переменные среды?

jq --argjson port "$newport" '."peer-port" |= $port' file.json >file-new.json

Это создаст новый файл с именем file-new.jsonсо значением ключа peer-port, измененным на значение переменной оболочки $newport. Переменная оболочки будет вставлена ​​как -, то есть без какой-либо кодировки, поэтому убедитесь, что это простое целое число (, используя --argвместо --argjson, чтобы вставить его как закодированную строку ).

2
03.10.2020, 19:19
1 ответ

Программа 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.

5
18.03.2021, 23:00

Теги

Похожие вопросы