2016-04-24 70 views
1

我正在製作一個需要運行shell腳本的OS X應用程序。這裏是我的SWIFT代碼:NSTask/bin/echo:/ bin/echo:無法執行二進制文件

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)) 
} 

現在我打過電話了runTask方法:

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

它說以下錯誤:

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

現在我回到了碼頭和類型echo 1234它完美無缺地運行,現在你如何得到這個工作?謝謝。

回答

3

bash有操作的三種主要模式:

  1. 如果你傳遞-c "some command string",它會執行該命令字符串。

  2. 如果您將文件路徑作爲參數傳遞給它,它將從該文件讀取命令並執行它們(即將該文件作爲shell腳本執行)。

  3. 如果您不傳遞任何參數,它將從標準輸入讀取並執行命令。

既然你傳入的參數「/斌/回聲」和「1234」,這是假設你想要模式2,所以它會嘗試從/斌/回聲讀取shell命令,並失敗。我不清楚你試圖實現什麼,但我看到幾個選項,可能是相關的:

  • 如果你想執行一個二進制(是/ bin /回聲),只是執行直接不使用bash可言:

    task.launchPath = "/bin/echo" 
    task.arguments = ["1234"] 
    
  • 如果你需要的,如果你需要的外殼執行前解析它來執行一個命令串(即,所以如通配符得到擴展,或有不止一個命令或...),請使用bash -c

    task.launchPath = "/bin/bash" 
    task.arguments = ["-c", "/bin/echo 1234; ls *"] 
    
  • 如果您需要執行的實際腳本,即在它shell命令的文件,然後離開runTask獨自一人,但它傳遞的實際腳本:

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

您正在執行/bin/bash /bin/echo,它在Terminal.app中不起作用。

刪除/bin/bash

task.launchPath = "/bin/echo" 
... 
runTask(["1234"]) 
相關問題