2016-12-24 134 views
0

我試圖在OSX上的Mono中檢索PATH變量的值。但是,我沒有從終端獲得相同的結果。不完整的路徑變量

在C#(不完全):

Environment.GetEnvironmentVariable("PATH") 

的/ usr/bin中:/ bin中:/ usr/sbin目錄:/ sbin目錄

在終端(預期):

echo $PATH 

/Library/Frameworks/Python.framework/Versions/3.5/bin:/usr/local/bin:/usr/bin:/b在:/ usr/sbin目錄:/ sbin目錄:〜/ .composer /供應商/斌:在/ usr /本地/ PHP5 /箱中:/ opt/X11/bin中:在/ usr/local/share下/ DOTNET:/庫/框架/Mono.framework/Versions/Current/Commands

我試圖用一切可用EnvironmentVariableTargetGetEnvironmentVariable第二個參數,但沒有返回的完整路徑。

我錯過了一些明顯的東西嗎?

+2

您的應用程序使用的是與您的終端不同的環境。 – bansi

+0

是的,這基本上是你的問題。當終端啓動時,它執行一些準備環境的文件。在Linux系統中,通常在用戶文件夾中有一個'profile'文件和'.bashrc',這些文件通常會修改和擴充系統環境變量。 – r1verside

+0

我最感興趣的是獲取單聲道命令路徑;任何方式我可以加載相同的配置文件? – Lazlo

回答

1

當啓動一個新的終端窗口時,shell會自動執行/etc/profile/etc/bashrc_Apple_Terminal(或/etc/bashrc不使用終端時)。

/etc/profile的一部分將運行/usr/libexec/path_helper -s,除了您在使用Environment.GetEnvironmentVariable("Path")時還會看到的「默認」元素之外,它還會生成一條路徑命令,爲路徑添加其他元素。

對於一個通用的解決方案,以獲得外殼採用,您可以使用下面的代碼的確切路徑:

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 

但是,如果你只是想這是針對單路徑,你可以閱讀文件內容/etc/paths.d/mono-commands。這就是shell通過path_helper獲取添加到Path變量的單聲道路徑。