2016-04-24 17 views
1

Ich mache eine OS X App, die ein Shell-Skript ausführen muss. Hier sind meine SWIFT-Code:NSTask/bin/echo:/bin/echo: binäre Datei kann nicht ausgeführt werden

func runTask(arguments: [String]) { 
    output.string = "" 

    task = NSTask() 
    task.launchPath = "/bin/bash" 
    task.arguments = arguments; 

    errorPipe = NSPipe() 
    outputPipe = NSPipe() 

    task.standardError = errorPipe 
    task.standardOutput = outputPipe 

    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(didCompleteReadingFileHandle(_:)), name: NSFileHandleReadCompletionNotification, object: task.standardOutput!.fileHandleForReading) 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(didCompleteReadingFileHandle(_:)), name: NSFileHandleReadCompletionNotification, object: task.standardError!.fileHandleForReading) 

    errorPipe.fileHandleForReading.readInBackgroundAndNotify() 
    outputPipe.fileHandleForReading.readInBackgroundAndNotify() 

    task.launch() 
} 

func didCompleteReadingFileHandle(sender: NSNotification) { 
    let data: NSData = sender.userInfo![NSFileHandleNotificationDataItem] as! NSData; 
    let string = NSString(data: data, encoding: NSUTF8StringEncoding)! 
    // The output property is a NSTextView object 
    output.string?.appendContentsOf(String(string)) 
} 

Jetzt habe ich versucht, die runTask Methode aufrufen:

runTask(["/bin/echo", "1234"]) 

Es sagt der folgende Fehler:

/bin/echo: /bin/echo: cannot execute binary file 

Nun ging ich zurück in das Terminal und tippte echo 1234 läuft es ohne Probleme perfekt, wie funktioniert das jetzt? Vielen Dank.

Antwort

3

bash hat drei Hauptbetriebsarten:

  1. Wenn Sie übergeben es -c "some command string" es, dass die Befehlsfolge ausgeführt werden sollen.

  2. Wenn Sie ihm einen Dateipfad als Argument übergeben, liest er Befehle aus dieser Datei und führt sie aus (d. H. Führt die Datei als Shell-Skript aus).

  3. Wenn Sie keine Argumente übergeben, werden Befehle der Standardeingabe gelesen und ausgeführt.

Da Sie es die Argumente übergeben "/ bin/echo" und "1234", es Sie ist vorausgesetzt, wollen Modus 2, so dass er versucht, Shell-Befehle von/bin/echo zu lesen, und schlägt fehl. Ich bin auf dem nicht ganz klar, was Sie versuchen, zu erreichen, aber ich mehrere Optionen sehen, die relevant sein könnten:

  • Wenn Sie versuchen, eine binäre auszuführen (zB/bin/echo), nur ausführen, die direkt ohne überhaupt mit bash:

    task.launchPath = "/bin/echo" 
    task.arguments = ["1234"] 
    
  • wenn Sie eine Befehlsfolge (dh ausführen müssen, wenn Sie die Shell brauchen es zu analysieren, bevor es, so zB Platzhalter erweitert erhalten, oder es gibt mehr als einen Vollstreckungs Befehl oder ...), verwenden Sie bash -c:

    task.launchPath = "/bin/bash" 
    task.arguments = ["-c", "/bin/echo 1234; ls *"] 
    
  • Wenn Sie eine tatsächliche Skript ausführen müssen, das heißt, eine Datei mit Shell-Befehlen darin, läßt dann runTask allein, aber es ein tatsächliches Skript übergeben:

    runTask(["/path/to/script", "scriptarg", "another argument"]) 
    
1

Sie führen gerade /bin/bash /bin/echo aus, die in Terminal.app nicht funktioniert.

entfernen /bin/bash

task.launchPath = "/bin/echo" 
... 
runTask(["1234"])