2016-12-24 61 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变量的单声道路径。