2016-12-24 5 views
0

Ich versuche, den Wert der PATH Variable in Mono unter OSX abzurufen. Allerdings bekomme ich vom Terminal nicht das gleiche Ergebnis.Unvollständige PATH-Variable

In C# (unvollständig):

Environment.GetEnvironmentVariable("PATH") 

/usr/bin/bin:/usr/sbin:/sbin

In-Terminal (erwartet):

echo $PATH 

/Library/Frameworks/Python.framework/Versions/3.5/bin:/usr/local/bin:/usr/bin:/b in:/usr/sbin:/sbin:.: ~/.composer/vendor/bin:/usr/lokal/php5/bin:/opt/X11/bin:/usr/lokal/share/dotnet:/Bibliothek/Frameworks /Mono.framework/Versions/Current/Commands

ich habe versucht, für GetEnvironmentVariable jeden verfügbaren EnvironmentVariableTarget als zweiten Parameter verwenden, aber keine den vollständigen Pfad zurückzukehren.

Fehle ich etwas offensichtlich?

+2

Ihre Anwendung verwendet eine andere Umgebung als Ihr Terminal. – bansi

+0

Ja, das ist im Grunde dein Problem. Wenn das Terminal startet, führt es einige Dateien aus, die die Umgebung vorbereiten. In Linux-Systemen gibt es häufig eine "Profil" -Datei und auch ".bashrc" im Benutzerordner. Diese Dateien ändern und erweitern normalerweise die Systemumgebungsvariablen. – r1verside

+0

Ich bin hauptsächlich daran interessiert, den Mono-Befehlspfad zu bekommen; Wie könnte ich das gleiche Profil laden? – Lazlo

Antwort

1

Beim Start eines neuen Terminal-Fensters führt die Shell automatisch /etc/profile und /etc/bashrc_Apple_Terminal (oder /etc/bashrc, wenn kein Terminal verwendet wird) aus.

Teil von /etc/profile ist die Ausführung /usr/libexec/path_helper -s, die einen Pfadbefehl erstellt, der Ihrem Pfad zusätzliche Elemente hinzufügt, zusätzlich zu den "Standard" -Elementen, die Sie auch sehen, wenn Sie Environment.GetEnvironmentVariable("Path") verwenden.

Für eine allgemeine Lösung des genauen Pfad zu bekommen die Shell verwendet, können Sie den folgenden Code verwenden:

var info = new ProcessStartInfo(); 
info.FileName = "/bin/bash"; 
info.Arguments = "-l -c \"echo $PATH\""; // -l = 'login shell' so we execute /etc/profile 
info.UseShellExecute = false; 
info.RedirectStandardOutput = true; 
info.RedirectStandardError = true; 
var p = Process.Start(info); 
p.WaitForExit(); 

string path = p.StandardOutput.ReadToEnd().Trim(); // Drop the trailing \n from our echo output 

Wenn Sie jedoch einfach den Pfad mögen, die spezifisch für mono ist, können Sie nur das lesen Inhalt der Datei /etc/paths.d/mono-commands. Dort erhält die Shell über path_helper den Mono-Pfad, der zur Path-Variablen hinzugefügt wird.