Доступ к пользовательской переменной среды в Swift для macos - PullRequest
0 голосов
/ 16 февраля 2019

Я разрабатываю консольное приложение для Mac OS в Swift, и я хочу получить доступ к переменным среды пользователя при вызове команды bash.Я использую следующий код для запуска команды bash в swift:

@discardableResult
func shell(_ command: String) -> String? {
    let task = Process()
    task.launchPath = "/usr/bin/env"
    task.arguments = ["bash", "-c", command]
    let pipe = Pipe()
    task.standardOutput = pipe
    task.launch()
    let data = pipe.fileHandleForReading.readDataToEndOfFile()
    let output = String(data: data, encoding: String.Encoding.utf8)

    return output
}

Когда я запускаю /usr/bin/env в своем терминале, я вижу нужную переменную, но когда я запускаю shell("/usr/bin/env") в коде, я не вижу ни одной,ProcessInfo.processInfo.environment["MY_ENV_VAR"] также не показывает мне необходимую переменную.Как получить доступ к пользовательским переменным env в swift?

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019
ProcessInfo.processInfo.environment

Предоставит вам переменные среды для пользователя, который запускает приложение, но XCode не запускает приложение с вашими правами и средой.

Так что на этапе тестирования вы можете определить необходимую переменнуюв Xcode, как на фото ниже

enter image description here

Если вы хотите быть уверенным, напишите следующий код в файле (например: main.swift):

import Foundation

print(ProcessInfo.processInfo.environment)

И в оболочке выполните swiftc main.swift затем ./main, и вы увидите переменные использования

Но вы можете использовать функцию C getenv

  • требуется UnsafePoiter<Int8>, который является ключом, который вам нужен (то есть: «ДОМ»): C char *
  • Возврат a UnsafeMutablePointer<Int8>!: значение
0 голосов
/ 16 февраля 2019

Недавно я боролся с очень похожей проблемой.Хотя у меня нет идеального решения для вас, у меня есть несколько предложений.

Во-первых, действительно важно, где именно было определено MY_ENV_VAR.Если он находится внутри .bashrc файла, вам нужно запустить bash в интерактивном режиме с -i, чтобы он читал этот файл.Если он определен в .bash_profile, вам нужно будет использовать -l для запуска так называемой оболочки входа в систему.

В моем конкретном случае я должен использовать оба -i и -l чтобы увидеть env vars, который я ищу.Все становится еще сложнее, если пользователь не использует bash.Например, я использую fish, поэтому мои необходимые переменные ENV вообще не видны для bash, независимо от вызова bash.

Итак, на самом деле я first defineкакая оболочка используется, а затем вызовите эту оболочку с помощью -i -l -c.zsh, bash и fish поддерживают эти параметры.

Это настоящая боль, и я даже не уверен, что этот метод надежен.Но он работает для меня в различных пользовательских средах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...