2016-12-24 10 views
0

Я пытаюсь получить значение переменной PATH в Mono на OSX. Однако я не получаю такой же результат от терминала.Неполная переменная PATH

В C# (неполной):

Environment.GetEnvironmentVariable("PATH") 

/USR/бен:/бен:/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/бен:/USR/местные/доли/DotNet:/Library/Frameworks /Mono.framework/Versions/Current/Commands

Я попытался использовать все доступные EnvironmentVariableTarget в качестве второго параметра для GetEnvironmentVariable, но никто не возвращает полный путь.

Я пропустил что-то очевидное?

+2

Ваша заявка использует другую среду, отличную от вашего терминала. – bansi

+0

Да, это в основном ваша проблема. Когда терминал запускает, он выполняет некоторые файлы, которые готовят среду. В системах Linux обычно есть файл «profile», а также «.bashrc» в папке пользователя, эти файлы обычно изменяют и дополняют переменные системной среды. – r1verside

+0

Меня больше всего интересует получение пути команд Mono; каким-либо образом я мог бы загружать один и тот же профиль? – Lazlo

ответ

1

При запуске нового окна терминала оболочка автоматически выполняет /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. Вот где оболочка через path_helper получает моно-путь, который добавляется к переменной Path.