【问题标题】:Incomplete PATH variable不完整的 PATH 变量
【发布时间】:2017-05-09 23:51:16
【问题描述】:

我正在尝试在 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/vendor/ bin:/usr/local/php5/bin:/opt/X11/bin:/usr/local/share/dotnet:/Library/Frameworks/Mono.framework/Versions/Current/Commands

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

我是否遗漏了一些明显的东西?

【问题讨论】:

  • 您的应用程序使用的环境与您的终端不同。
  • 是的,这基本上是你的问题。当终端启动时,它会执行一些准备环境的文件。在 Linux 系统中,用户文件夹中通常有一个“profile”文件和“.bashrc”,这些文件通常会修改和增加系统环境变量。
  • 我最感兴趣的是获取 Mono 命令路径;有什么办法可以加载相同的配置文件?

标签: c# .net macos path mono


【解决方案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

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

【讨论】:

    猜你喜欢
    • 2010-10-14
    • 1970-01-01
    • 2012-02-16
    • 2021-03-19
    • 2018-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    相关资源
    最近更新 更多