setenv() для обновления переменной среды PATH

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

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

setenv ("PATH", "$ PATH: $ HOME / mylib", 1); // который не работает.

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

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

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

Спасибо

3 ответа

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

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

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

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

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

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

PATH=`your-program`

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

eval `your-program`

(В Bash вы можете использовать $(your-program) так же как `your-program`.)

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

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

Другие вопросы по тегам