在Swift中为MacOS访问用户环境变量

时间:2019-02-16 14:54:57

标签: swift macos environment-variables

我正在为Mac OS迅速开发控制台应用程序,我想在调用bash命令时访问用户环境变量。我使用以下代码在swift中运行bash命令:

@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"]也没有显示所需的变量。 如何快速访问用户定义的环境变量?

2 个答案:

答案 0 :(得分:1)

最近我一直在努力解决类似的问题。虽然我没有适合您的完美解决方案,但我有一些建议。

首先,确切定义MY_ENV_VAR的位置确实很重要。如果它位于.bashrc文件中,则需要使用-i以交互方式启动bash,以便它读取该文件。如果在.bash_profile中进行了定义,则需要使用-l来启动所谓的登录shell。

在我的特定情况下,我必须同时使用 -i-l来查看我所关注的环境变量。如果用户不使用bash,这一切将变得更加复杂。例如,我使用fish,因此无论bash调用如何,我所需的ENV变量都根本看不见。

因此,我实际上要做的是首先,确定正在使用的外壳,然后使用-i -l -c调用该外壳。 zsh,bash和fish均支持这些选项。

这是一个真正的痛苦,我什至不确定这种方法是否可靠。但是,它可以在许多不同的用户环境中为我工作。

答案 1 :(得分:0)

ProcessInfo.processInfo.environment

将为您提供启动应用程序的用户的环境变量,但Xcode不会根据您的权限和环境启动应用程序。

因此在测试阶段,您可以在Xcode中定义所需的变量,如下图所示

enter image description here

如果要确定,请在文件中写入以下代码(例如:“ main.swift”):

import Foundation

print(ProcessInfo.processInfo.environment)

然后在shell中执行swiftc main.swift然后执行./main,您将看到使用变量

但是您可以使用 C 函数getenv

  • 需要UnsafePoiter<Int8>这就是您需要的密钥(即“ HOME”):C char *
  • 返回UnsafeMutablePointer<Int8>!:值