Wie exportiere ich PATH aus C

363
Lance Pollard

Fragen Sie sich, wie Sie eines dieser Dinge von C aus erledigen können, damit es so bleibt, wie es von ~/.bashrcoder wäre ~/.bash_profile:

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

Ich frage mich, ob ich den execlBefehl so verwenden sollte:

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

Oder wenn es einen anderen idiomatischen C-Weg gibt, um dies richtig zu erreichen.

0

1 Antwort auf die Frage

2
RalfFriedl

Sie können keine Variablen aus einem Programm in die übergeordnete Shell exportieren, da die Umgebung eines anderen Prozesses nicht geändert werden kann.

Wenn Sie einen untergeordneten Prozess einrichten möchten, lesen Sie man setenvoder man execve.

Bearbeiten

Der Unterschied besteht darin, dass .bashrcsie von der Shell selbst ausgeführt wird, nicht von einem Unterprozess der Shell. Während es von der Shell ausgeführt wird, kann es die Umgebung der Shell ändern.

Die einzige Möglichkeit, dies zu umgehen, besteht darin, Befehle zu erstellen, die von der Shell ausgeführt werden:

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

Führen Sie dann in der Shell die Ausgabe dieses Befehls aus:

$(./myenv) 

Oder

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

Es ist jedoch immer noch die Shell, die ihre eigene Umgebung ändert, indem sie Befehle ausführt, die von einem Programm generiert werden.

Ich bin nicht sicher, warum ich einen untergeordneten Prozess erstellen möchte. Lance Pollard vor 5 Jahren 0
Ich habe nicht gesagt, dass Sie das tun würden, nur dass es eine Möglichkeit gibt, "PATH" für ein Kind festzulegen. Auf der anderen Seite gibt es keine Möglichkeit, "PATH" für einen anderen Prozess, einschließlich des übergeordneten Elements, zu ändern. Was Sie also tun möchten, ist unmöglich. RalfFriedl vor 5 Jahren 0
Es scheint so, als müsste es auf irgendeine Art und Weise geben, da ich in eine Datei ~ / .bashrc schreiben könnte, die das PATH-Snippet enthält, und es scheint, als würde es funktionieren. Daher gibt es vielleicht einen anderen Ansatz, mit dem ich nicht vertraut bin, aber es geht um diese Frage. Vielen Dank. Lance Pollard vor 5 Jahren 0
@LancePollard Wie genau können Sie sich vorstellen, dass dieses C-Programm ausgeführt wird, und welche Prozessumgebungen sollen davon betroffen sein? Gordon Davisson vor 5 Jahren 0
Ich habe nicht viel Vorliebe, ich möchte einfach in der Lage sein, eine Umgebungsvariable von C festzulegen, und der C-Prozess wird lange andauern. Lance Pollard vor 5 Jahren 0
@LancePollard Ich denke, Sie verstehen falsch, wie Umgebungsvariablen funktionieren. Umgebungsvariablen sind für jeden Prozess privat. Das Festlegen einer Umgebungsvariable in einem C-Programm wirkt sich nur auf dieses C-Programm und alle anderen Programme aus, die er forciert und / oder ausführt. Die Funktionsweise von ~ / .bashrc und ~ / .bash_profile besteht darin, dass jede neue Shell, die erzeugt wird, die eine oder die andere von ihnen ausführt und somit diese Umgebungsvariablen in der neuen Shell definiert. Diese env-Variablen * müssen für jede neue (übergeordnete) Shell * neu erstellt werden. Die Dateien sind lediglich Anweisungen, wie das gemacht wird. Gordon Davisson vor 5 Jahren 0
Ich fügte ein Beispiel hinzu, vielleicht hilft das Verständnis. RalfFriedl vor 5 Jahren 0