OSX
Xcode
Swift

【OSX】【swift】コマンドの実行

More than 3 years have passed since last update.

OS X 向けの簡単なGUIアプリを作り、ターミナルで実行していることをできれば

便利じゃないかなと思いまして。

(XcodeでiOSのように、IBActionから処理の指定ができたりするので)

まずはコマンドの実行について


実行と引数の指定


var cmd:String = "/usr/bin/killall"
var task:NSTask = NSTask()
task.launchPath = cmd;
//配列
task.arguments = ["Finder"]
task.launch()


標準出力の取得


var cmd:String = "/bin/echo"
var task:NSTask = NSTask()
task.launchPath = cmd;
task.arguments = ["hoge","hogehoge","hogehogehoge"]
var pipe:NSPipe = NSPipe()
task.standardOutput = pipe
task.launch()
var output:NSData = pipe.fileHandleForReading.readDataToEndOfFile()
var outputStr:NSString = NSString(data:output,encoding:NSUTF8StringEncoding)!
println(outputStr)


対話型の場合の出力

var cmd:String = "/usr/bin/top"
task = NSTask()
task.launchPath = cmd;
pipe = NSPipe()
task.arguments = ["-s", "1", "-l", "3600", "-stats", "pid,cpu,time,command"];
task.standardOutput = pipe
task.launch()

NSNotificationCenter.defaultCenter().addObserver(self,
selector: "notificationReadedData:",
name:NSFileHandleReadCompletionNotification, object: nil)
pipe.fileHandleForReading.readInBackgroundAndNotify()

NSNotificationCenterで通知を受け取る形にし、

(taskとpipeはメンバ変数にしています)

    func notificationReadedData(notification:NSNotification)

{
var output:NSData = notification.userInfo![NSFileHandleNotificationDataItem] as NSData;
var outputStr:NSString = NSString(data:output,encoding:NSUTF8StringEncoding)!
println(outputStr)
if task.running {
pipe.fileHandleForReading.readInBackgroundAndNotify()
} else {
NSNotificationCenter.defaultCenter().removeObserver(self,
name:NSFileHandleReadCompletionNotification, object: nil)
}

}

なお、コマンドの停止は


task.terminate()

top時についての引数指定については以下を参考にさせていただきました

参考URL:http://stackoverflow.com/questions/3557594/nstask-to-call-command-top-getting-error