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.
Нет другого варианта, сразу доступного. Вы можете написать отдельную функцию, чтобы справиться с этим, если вам нужно сделать это несколько раз.