不完整的PATH变量

时间:2016-12-24 17:44:32

标签: c# .net macos path mono

我试图在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:/bin:/usr/sbin:/sbin::〜/ .composer /供应商/箱:在/ usr /本地/ PHP5 / bin中:/选择/ X11 / bin中:在/ usr /本地/共享/ DOTNET:/Library/Frameworks/Mono.framework/Versions/Current/Commands

我尝试将每个可用的EnvironmentVariableTarget用作GetEnvironmentVariable的第二个参数,但没有一个返回完整路径。

我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:1)

启动新的终端窗口时,shell会自动执行/etc/profile/etc/bashrc_Apple_Terminal(或/etc/bashrc不使用终端时。)

/etc/profile的一部分是运行/usr/libexec/path_helper -s,除了"默认"之外,它还会构建路径命令,为路径添加其他元素。使用Environment.GetEnvironmentVariable("Path")时也会看到的元素。

要获得shell使用的确切路径的一般解决方案,您可以使用以下代码:

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

但是,如果您只想要特定于mono的路径,则只需读取文件/etc/paths.d/mono-commands的内容即可。这就是shell通过path_helper获取添加到Path变量的单声道路径。