Ste*_*n.B 5 macos swift swift2 swift3
我正在尝试创建一个mac应用程序,用户可以输入命令,就像在mac终端中一样,我得到了大部分工作,但我发现从发现者或xcode运行的应用程序的$ PATH变量是不同的比终端使用的$ PATH变量.
我可以运行命令并找到一种方法来为应用程序的$ PATH变量添加预定义路径,但是我需要一种方法来自动读取Terminal的$ PATH变量并将其复制到Application的$ PATH变量.这应该是自动化的,因为用户将在其变量中具有不同的路径.
我还发现,当我使用"open appname.app"从终端运行应用程序时,使用了正确的$ PATH变量(终端使用的是同一个变量)
到目前为止这是我的代码:
let task = Process()
var env = ProcessInfo.processInfo.environment
var path = env["PATH"]! as String
path = "/usr/local/bin:" + path
env["PATH"] = path
task.environment = env
task.launchPath = "/usr/bin/env"
task.arguments = ["echo","$PATH"]
let pipe = Pipe()
task.standardOutput = pipe
task.standardError = pipe
task.launch()
task.waitUntilExit()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output: String = NSString(data: data, encoding: String.Encoding.utf8.rawValue) as! String
print(output)
Run Code Online (Sandbox Code Playgroud)
这会将"/ usr/local/bin"添加到Application的$ PATH中,但我需要一种方法来复制终端的$ PATH中的值.
谢谢!
小智 5
可以在/etc/paths和中找到默认的外壳程序路径/etc/path.d/。读取外壳程序路径的一种方法是使用path_helper命令。扩展上面的代码示例,并使用bash作为外壳程序:
let taskShell = Process()
var envShell = ProcessInfo.processInfo.environment
taskShell.launchPath = "/usr/bin/env"
taskShell.arguments = ["/bin/bash","-c","eval $(/usr/libexec/path_helper -s) ; echo $PATH"]
let pipeShell = Pipe()
taskShell.standardOutput = pipeShell
taskShell.standardError = pipeShell
taskShell.launch()
taskShell.waitUntilExit()
let dataShell = pipeShell.fileHandleForReading.readDataToEndOfFile()
var outputShell: String = NSString(data: dataShell, encoding: String.Encoding.utf8.rawValue) as! String
outputShell = outputShell.replacingOccurrences(of: "\n", with: "", options: .literal, range: nil)
print(outputShell)
let task = Process()
var env = ProcessInfo.processInfo.environment
var path = env["PATH"]! as String
path = outputShell + ":" + path
env["PATH"] = path
task.environment = env
task.launchPath = "/usr/bin/env"
task.arguments = ["/bin/bash", "-c", "echo $PATH"]
let pipe = Pipe()
task.standardOutput = pipe
task.standardError = pipe
task.launch()
task.waitUntilExit()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
var output: String = NSString(data: data, encoding: String.Encoding.utf8.rawValue) as! String
output = output.replacingOccurrences(of: "\n", with: "", options: .literal, range: nil)
print(output)
Run Code Online (Sandbox Code Playgroud)
注意:
/Users/*userid*/.bash_profile。PATH环境变量中多次列出。它们将从左到右遍历。有一对夫妇应用和shell路径的线程OS X这提供更多的上下文 如何在OS X小牛设定全系统的环境变量 ,并 设置在小牛队的全系统的环境变量path