Anforderungen für das Ausführen und Einstellen von Umgebungsvariablen verstehen

8

Wir haben viele Schwierigkeiten, unseren Lehrer zu interpretieren. Wir baten um eine Klarstellung und holten das Folgende von ihm zurück.

  1. Senden Sie für execve eine Umgebung, die Sie mit Ihren exportierten Variablen eingerichtet haben, und erstellen Sie einen eingebauten Befehl, um eine Untershell von / bin / bash zu erzeugen, damit Sie Ihre exportierten Variablen mit env sehen können.

    (Er spricht hier über die Schaffung unserer eigenen Umwelt.)

  2. Ja, erstellen Sie Ihre eigenen. Sie können mit dem Kopieren der Umgebung beginnen, wenn Ihre Shell startet, und nur exportierte Variablen hinzufügen

Dies ist mit dem folgenden Beitrag auf Stack Overflow von mir verwandt (das Lesen dieses anderen Beitrags wird Ihnen helfen, zu verstehen, was ich versuche):

einen neuen Pfad mit verwenden Führen Sie den Befehl ls

aus

Wir sind nur sehr verwirrt darüber. Noch einmal werde ich erklären, was wir jetzt zu tun versuchen. Ähnlich wie Ihre Linux-Shell das tut, müssen wir ein eigenes Programm schreiben, das Umgebungsvariablen wie PATH und USER und alle anderen Variablen, die der Benutzer definieren möchte, setzen kann.

Ein Beispiel dafür, wie Sie das nennen würden, wäre (in Ihrem Programm an der Eingabeaufforderung):

%Vor%

würde eine Umgebungsvariable erzeugen, die aussieht wie "dog = spike"

Wichtiger noch, wir müssen in der Lage sein, unsere eigene PATH-Variable zu setzen und sie an einen exec -Befehl zu senden. Dies ist der verwirrende Teil, weil wir aufgrund all unserer Fragen nicht verstehen, was wir tun sollen.

    
james 05.10.2011, 03:56
quelle

3 Antworten

26

Es ist eigentlich sehr einfach. Sie wissen bereits, dass Ihre Argumente eine Liste von char * sind, die durch einen NULL-Zeiger beendet wird. In ähnlicher Weise ist die Umgebung einfach eine Liste von char * , die durch einen NULL-Zeiger beendet wird. Herkömmlicherweise haben die Werte in der Liste die Form VARNAME=var-value . Sie können jedoch auch andere Formate übergeben.

Also, um einen einfachen Fall zu nehmen:

%Vor%

In diesem Beispiel wird das Programm /bin/sh mit den Argumenten -c und env ausführen, was bedeutet, dass die Shell das env -Programm ausführt, das auf ihrem aktuellen PATH gefunden wurde. Die Umgebung hier enthält 5 Werte im orthodoxen Format. Wenn Sie env in date (oder env; date ) ändern, sehen Sie z. B. den Effekt der TZ-Einstellung. Wenn ich das auf meinem MacOS X-Rechner starte, lautet die Ausgabe:

%Vor%

Die Shell hat die Umgebungsvariablen SHLVL , _ und PWD zu den explizit im execve() -Aufruf festgelegten hinzugefügt.

Sie können auch raffiniertere Dinge tun, wie zum Beispiel das Kopieren einiger der anderen Umgebungsvariablen aus Ihrer echten Umgebung, wo sie nicht in Konflikt mit denen stehen, die Sie explizit einstellen wollen. Sie können auch Spiele wie zwei Werte für eine einzelne Variable in der Umgebung spielen - welche wird wirksam? Und Sie können Spiele mit Variablennamen spielen, die Leerzeichen enthalten (die Shell mag nicht so viel) oder Einträge, die nicht mit der Notation "varname = value" übereinstimmen (kein Gleichheitszeichen).

    
Jonathan Leffler 05.10.2011, 05:48
quelle
1

Der Code von Jonathan Leffler funktioniert hervorragend, außer wenn Sie die Variable PWD (Arbeitsverzeichnis) ändern möchten.

Was ich getan habe, um das Arbeitsverzeichnis zu ändern, war ein chdir(..) vor execve(..) zu setzen und aufzurufen:

%Vor%     
qknight 28.08.2012 11:25
quelle
0

Ich bin hier ein wenig zu spät zur Party, aber wenn Sie die alten Umgebungsvariablen beibehalten und Ihre eigenen erstellen möchten, verwenden Sie setenv und übergeben Sie dann environ an execve() .

%Vor%

environ ist eine in unistd.h deklarierte Variable, die während dieses laufenden Prozesses die Umgebungsvariablen verfolgt.

setenv() und putenv() modify environ , wenn Sie also execve() übergeben, sind die Umgebungsvariablen genau so, wie Sie es erwarten würden.

    
Fred Frey 22.08.2016 20:15
quelle

Tags und Links