C# 不完全路径变量

C# 不完全路径变量,c#,.net,macos,path,mono,C#,.net,Macos,Path,Mono,我试图在OSX上的Mono中检索PATH变量的值。然而,我并没有从终端得到相同的结果 在C#(不完整)中: /usr/bin:/bin:/usr/sbin:/sbin 在航站楼(预计): /Library/Frameworks/Python.framework/Versions/3.5/bin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:.:~/.composer/vendor/bin:/usr/local/php5/bin:/opt/X11/bin:/usr

我试图在OSX上的Mono中检索
PATH
变量的值。然而,我并没有从终端得到相同的结果

在C#(不完整)中:

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

在航站楼(预计):

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

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


我是否遗漏了一些明显的内容?

当启动新的终端窗口时,shell会自动执行
/etc/profile
/etc/bashrc\u Apple\u Terminal
(或者在不使用终端时执行
/etc/bashrc

/etc/profile
的一部分是运行
/usr/libexec/path\u helper-s
,它构建一个path命令,在使用
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/path.d/mono命令的内容。这就是shell通过
path\u helper
获取添加到path变量的mono路径的地方

启动新的终端窗口时,shell会自动执行
/etc/profile
/etc/bashrc\u Apple\u Terminal
(或者在不使用终端时执行
/etc/bashrc

/etc/profile
的一部分是运行
/usr/libexec/path\u helper-s
,它构建一个path命令,在使用
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/path.d/mono命令的内容。这就是shell通过
path\u helper
获取添加到path变量的mono路径的地方

您的应用程序使用的环境与您的终端不同。是的,这基本上是您的问题。当终端启动时,它执行一些准备环境的文件。在Linux系统中,通常有一个“profile”文件和用户文件夹中的“.bashrc”,这些文件通常会修改和增加系统环境变量;我可以加载相同的配置文件吗?你的应用程序使用的环境与你的终端不同。是的,这基本上是你的问题。当终端启动时,它执行一些准备环境的文件。在Linux系统中,通常有一个“profile”文件和用户文件夹中的“.bashrc”,这些文件通常会修改和增加系统环境变量;我可以加载相同的配置文件吗?
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