setenv() для обновления переменной окружения PATH

Я хочу написать программу C, чтобы добавить строку в переменную среды PATH. что-то вроде "экспорт PATH=$PATH:$HOME/mylib"

у меня есть код C, как это

setenv("ПУТЬ", "$ПУТЬ:$HOME/mylib",1); //что не работает.

другая работа вокруг, которую я думал, заключалась в том, чтобы получить PATH и HOME с помощью getenv() и создать память в куче, а затем добавить их с помощью strcat().

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

есть ли альтернатива?

Спасибо


person Chanakya.sun    schedule 28.12.2012    source источник
comment
Хорошая новость в том, что у вас есть setenv(); если бы у вас было putenv(), жизнь была бы намного сложнее — вы бы почти неизбежно потеряли память.   -  person Jonathan Leffler    schedule 28.12.2012
comment
Я создал пример, используя setenv в других вопросах. См. stackoverflow.com/a/46400175/5842403.   -  person Joniale    schedule 25.09.2017


Ответы (3)


Синтаксис $FOO, который расширяется до значения переменной окружения с именем FOO, является функцией оболочки; он не доступен напрямую в C.

В вашей системе может быть предусмотрена функция wordexp(), которая обеспечивает аналогичную функциональность в C.

Но поскольку вы просто расширяете две переменные среды с фиксированными именами ("HOME" и "PATH"), имеет смысл использовать переносимую функцию getenv() и небольшую обработку строк. (Вы можете использовать sprintf или snprintf вместо strcat.)

ПРИМЕЧАНИЕ. Если вы используете обновленный $PATH только внутри своей программы, вы можете прекратить чтение здесь.

Надеюсь, вы не ожидаете, что какие-либо изменения в $PATH будут доступны в командной строке после завершения работы вашей программы. Ваша работающая программа на C, скорее всего, является дочерним процессом вашей интерактивной оболочки. Переменные среды наследуются дочерними процессами; они не распространяются обратно на родительские процессы.

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

PATH=`your-program`

Или он может напечатать команду (команды) для установки одной или нескольких переменных среды:

eval `your-program`

(В bash можно использовать как $(your-program), так и `your-program`.)

person Keith Thompson    schedule 28.12.2012

Нет альтернативы нет. Вы должны построить литеральную строку и передать ее в setenv.

person bmargulies    schedule 28.12.2012

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

person Roman Dmitrienko    schedule 28.12.2012