我正在为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"]
也没有显示所需的变量。
如何快速访问用户定义的环境变量?
答案 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中定义所需的变量,如下图所示
如果要确定,请在文件中写入以下代码(例如:“ main.swift”):
import Foundation
print(ProcessInfo.processInfo.environment)
然后在shell中执行swiftc main.swift
然后执行./main
,您将看到使用变量
但是您可以使用 C 函数getenv
UnsafePoiter<Int8>
这就是您需要的密钥(即“ HOME”):C char *
UnsafeMutablePointer<Int8>!
:值