Как `экспортировать PATH` из C

314
Lance Pollard

Хотите знать, как выполнить одну из этих вещей из C, чтобы она сохранялась, как это было бы из ~/.bashrcили ~/.bash_profile:

export PATH=~/bin:$PATH export PS1="$ " 

Хотите знать, если я должен использовать execlкоманду вроде этого:

#include <stdio.h> #include <unistd.h> #include <dirent.h>  int main (void) { return execl("/bin/export", "...", NULL); } 

Или, если есть другой идиоматический способ C, чтобы выполнить это должным образом.

0

1 ответ на вопрос

2
RalfFriedl

Вы не можете экспортировать переменные из программы в родительскую оболочку, потому что невозможно изменить среду другого процесса.

Если вы хотите настроить дочерний процесс, посмотрите man setenvили man execve.

редактировать

Разница в том, что .bashrcвыполняется самой оболочкой, а не подпроцессом оболочки. Поскольку он выполняется оболочкой, он может изменять среду оболочки.

Единственный способ обойти это - создать команды, которые будут выполняться оболочкой:

main () { printf ("PATH=/dir\n"); } 

Затем в командной консоли выполните вывод этой команды:

$(./myenv) 

Или же

./myenv > /tmp/file source /tmp/file 

Но это все еще оболочка, которая изменяет свою собственную среду, она просто делает это, выполняя команды, сгенерированные из какой-то программы.

Я не уверен, почему я хотел бы создать дочерний процесс. Lance Pollard 5 лет назад 0
Я не говорил, что вы это сделаете, просто есть способ установить 'PATH' для ребенка. С другой стороны, нет способа изменить `PATH` для другого процесса, включая родительский. То, что вы хотите сделать, невозможно. RalfFriedl 5 лет назад 0
Кажется, что должен быть какой-то путь, потому что я мог бы записать в файл ~ / .bashrc этот фрагмент PATH, и похоже, что он будет работать, так что, возможно, есть другой подход, с которым я не знаком, но этот вопрос о. Спасибо. Lance Pollard 5 лет назад 0
@LancePollard Точно, как вы себе представляете эту программу на С, и на какие среды процессов вы хотите, чтобы она влияла? Gordon Davisson 5 лет назад 0
У меня нет особых предпочтений, я просто хочу каким-то образом из C установить переменную среды, и процесс C будет продолжительным. Lance Pollard 5 лет назад 0
@LancePollard Я думаю, вы не понимаете, как работают переменные среды. Переменные среды являются частными для каждого процесса, поэтому установка переменной среды в программе на C влияет только на эту программу на C и на любые другие программы, которые она разветвляет и / или исполняет. Способ работы ~ / .bashrc и ~ / .bash_profile состоит в том, что каждая новая оболочка, которая порождает, запускает одну или другую из них и, таким образом, получает те переменные среды, которые определены в новой оболочке. Эти переменные env * должны создаваться заново для каждой новой (родительской) оболочки *, файлы являются лишь инструкциями, как это сделать. Gordon Davisson 5 лет назад 0
Я добавил пример, может быть, это помогает понять. RalfFriedl 5 лет назад 0

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