Skip to content

Instantly share code, notes, and snippets.

@Seasons7
Created July 22, 2015 19:21
Show Gist options
  • Select an option

  • Save Seasons7/836d3676884a40c8c98a to your computer and use it in GitHub Desktop.

Select an option

Save Seasons7/836d3676884a40c8c98a to your computer and use it in GitHub Desktop.
NSTask Sample for Swift
import Cocoa
import Foundation
var str = "Hello, playground"
var task:NSTask = NSTask()
var pipe:NSPipe = NSPipe()
task.launchPath = "/bin/ls"
task.arguments = ["-la"]
task.standardOutput = pipe
task.launch()
var handle = pipe.fileHandleForReading
var data = handle.readDataToEndOfFile()
var result_s = NSString(data: data, encoding: NSUTF8StringEncoding)
print(result_s)
@Seasons7

Copy link
Copy Markdown
Author

save this file.
chmod +x nstask.swift
xcrun swift a.swift -f /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks

@dautermann

Copy link
Copy Markdown

for what it's worth, pipe and task are immutable and should be let

that is to say:

                let task = NSTask()
                let pipe = NSPipe()

                task.launchPath = "/bin/ls"
                task.arguments = ["-la"]
                task.standardOutput = pipe
                task.launch()

the other variables might also need to be declared let.

@ingconti

ingconti commented Oct 1, 2016

Copy link
Copy Markdown

for swift 3.0:

    // Create a Task instance (was NSTask on swift pre 3.0)
    let task = Process()

    // Set the task parameters
    task.launchPath = "/bin/ls"
    task.arguments = ["-laF@" , filePath]

    // Create a Pipe and make the task
    // put all the output there
    let pipe = Pipe()
    task.standardOutput = pipe

    // Launch the task
    task.launch()

    // Get the data
    let data = pipe.fileHandleForReading.readDataToEndOfFile()
    let output = NSString(data: data, encoding: String.Encoding.utf8.rawValue)

    print(output!)

@Gerst20051

Copy link
Copy Markdown

thanks! @ingconti

@pakLebah

Copy link
Copy Markdown

@ingconti: Do you have any sample how to interact with standardInput? And why Process is Task on Swift 3 for Linux? Thank you.

ghost commented Mar 16, 2017

Copy link
Copy Markdown

is it possible to run multiple commands?

@shishanyu

Copy link
Copy Markdown

Updated for Swift 4

//: Playground - noun: a place where people can play

import Cocoa
import Foundation

var task = Process()
var pipe = Pipe()

task.executableURL = URL(fileURLWithPath: "/bin/ls")
task.arguments = ["-la","/Users/"] //multiple options
task.standardOutput = pipe
try task.run()

var handle = pipe.fileHandleForReading
var data = handle.readDataToEndOfFile()
var printing = String (data: data, encoding: String.Encoding.utf8)
print(printing!)

@alisanie

Copy link
Copy Markdown

I'm using this method for running app but I got "Message from debugger: Terminated due to signal 9".Any idea?

 let path=("\(FileManager.default.currentDirectoryPath)/data/app/setup.pkg")
            
            let buildTask: Process = Process()
            
            //Path for open
            buildTask.launchPath = "/usr/bin/open"
            buildTask.arguments = [path]
            buildTask.launch()

Message from debugger: Terminated due to signal 9

@welljsjs

welljsjs commented Feb 8, 2018

Copy link
Copy Markdown

buildTask.launch() is not up to date anymore. Since High Sierra, Process().lauch() is deprecated. Use Process().run instead and catch the error that may be thrown.
See Apple Developer Documentation for launch()

This Tutorial goes a bit more into detail regarding NSTasks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment