swift - 在 Swift for macos 中访问用户环境变量

标签 swift macos environment-variables

我正在 swift 中为 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"] 也没有向我显示所需的变量。 如何在 swift 中访问用户定义的环境变量?

最佳答案

我最近一直在努力解决一个非常相似的问题。虽然我没有为您提供完美的解决方案,但我确实有一些建议。

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

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

所以,我实际上要做的是首先确定正在使用的 shell,然后使用 -i -l -c 调用该 shell。 zsh、bash 和 Fish 都支持这些选项。

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

关于swift - 在 Swift for macos 中访问用户环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54724324/

相关文章:

java - Java 中的 Runtime.getRuntime().exec() 具有文件重定向功能

c - 从辅助线程获取主线程

path - What\bin 从 jdk 添加到系统路径环境变量

kubernetes - 混合来自 kubernetes 部署和 docker 镜像的环境变量

ios - Xcode 11 模拟器 - 检查暗模式是否激活时的 SIGABRT

ios - 如何对字典类型中的特定值求和

objective-c - OSX 弃用警告 CMake

node.js - 在请求之外检索本地和 heroku 应用程序主机名

Swift:无法将值 '(Bool, MCSession) -> Void' 分配给类型 '(Bool, MCSession!) -> Void!'

ios - 在 swift 中的参数中发送多个数组