Jak „eksportować ŚCIEŻKĘ” z C [zamknięte]


0

Zastanawiasz się, jak wykonać jeden z tych rzeczy z C, tak, że utrzymuje się jak to będzie z ~/.bashrclub ~/.bash_profile:

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

Zastanawiam się, czy powinienem użyć execlpolecenia w taki sposób:

#include <stdio.h>
#include <unistd.h>
#include <dirent.h>

int main (void) {
  return execl("/bin/export", "...", NULL);
}

Lub jeśli istnieje inny idiomatyczny sposób C, aby to osiągnąć poprawnie.

bash  shell  c 

Odpowiedzi:


2

Nie można eksportować zmiennych z programu do powłoki nadrzędnej, ponieważ nie można modyfikować środowiska innego procesu.

Jeśli chcesz skonfigurować proces potomny, zobacz man setenvlub man execve.

Edytować

Różnica polega na tym, że .bashrcjest wykonywana przez samą powłokę, a nie przez podproces powłoki. Ponieważ jest wykonywany przez powłokę, może modyfikować środowisko powłoki.

Jedynym sposobem na obejście tego jest utworzenie poleceń, które będą wykonywane przez powłokę:

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

Następnie w powłoce uruchom dane wyjściowe z tego polecenia:

$(./myenv)

Lub

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

Ale to wciąż powłoka modyfikuje własne środowisko, po prostu wykonuje polecenia generowane z jakiegoś programu.


Nie jestem pewien, dlaczego chciałbym stworzyć proces potomny.

Nie powiedziałem, że tak, tylko że istnieje sposób na ustawienie PATHdla dziecka. Z drugiej strony nie ma możliwości zmiany PATHdla innego procesu, w tym dla rodzica. Więc to, co chcesz zrobić, jest niemożliwe.
RalfFriedl

Wygląda na to, że musi być jakiś sposób, ponieważ mógłbym zapisać do pliku ~ / .bashrc ten fragment PATH i wygląda na to, że zadziałałoby, więc może jest inne podejście, którego nie znam, ale o to chodzi. Dziękuję Ci.

@LancePollard Dokładnie jak wyobrażasz sobie uruchomienie tego programu C i jakie środowiska procesów mają na niego wpływać?
Gordon Davisson,

Nie mam preferencji, chcę po prostu móc w jakiś sposób z C ustawić zmienną środowiskową, a proces C będzie trwały długo.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.