在swift中使用NSTask来执行终端命令

时间:2016-07-16 16:36:16

标签: swift macos

您好我正在尝试使用swift创建一个简单的程序来执行此命令,在Dock中添加一个空格:

defaults write com.apple.dock persistent-apps -array-add '{"tile-type"="spacer-tile";}'; killall Dock

这是我使用的代码:

    let task = NSTask()
    task.launchPath = "/usr/bin/defaults"
    task.arguments = ["write","com.apple.dock","persistent-apps","-array-add","'{\"tile-type\"=\"spacer-tile\";}';","killall Dock"]
    let pipe = NSPipe()
    task.standardOutput = pipe
    task.standardError = pipe
    task.launch()
    task.waitUntilExit()
    let data = pipe.fileHandleForReading.readDataToEndOfFile()
    let output: String = NSString(data: data, encoding: NSUTF8StringEncoding) as! String
    print(output)

我没有错,但没有任何反应。有人能帮帮我吗?

2 个答案:

答案 0 :(得分:2)

这是对我有用的代码:

    let task = NSTask()
    task.launchPath = "/usr/bin/defaults"
    task.arguments = ["write","com.apple.dock","persistent-apps","-array-add","{\"tile-type\"=\"spacer-tile\";}"]
    let pipe = NSPipe()
    task.standardOutput = pipe
    task.standardError = pipe
    task.launch()
    task.waitUntilExit()

    let task2 = NSTask()
    task2.launchPath = "/usr/bin/killall"
    task2.arguments = ["Dock"]
    let pipe2 = NSPipe()
    task2.standardOutput = pipe2
    task2.standardError = pipe2
    task2.launch()
    task2.waitUntilExit()


    let data = pipe.fileHandleForReading.readDataToEndOfFile()
    let output: String = NSString(data: data, encoding: NSUTF8StringEncoding) as! String
    print(output)

答案 1 :(得分:0)

  defaults write ... ; killall Dock

两个命令。在终端中键入此行时,将传递该行 到你的shell(OS X上通常是“bash”),然后执行shell 两个命令顺序。

另一方面,NSTask只执行一个命令 没有任何外壳通常会做的魔术。在你的情况下 所有参数,包括最终的“killall Dock”,都被传递为 /usr/bin/defaults的参数。

一种可能的解决方案是按顺序执行两个 NSTask, 一个用于defaults命令,另一个用于killall命令。