Swift NSTask/bin/echo:/bin/echo:无法执行二进制文件

Swift NSTask/bin/echo:/bin/echo:无法执行二进制文件,swift,macos,nstask,Swift,Macos,Nstask,我正在制作一个需要运行shell脚本的OSX应用程序。这是我的swift代码: func runTask(arguments: [String]) { output.string = "" task = NSTask() task.launchPath = "/bin/bash" task.arguments = arguments; errorPipe = NSPipe() outputPipe = NSPipe() task.st

我正在制作一个需要运行shell脚本的OSX应用程序。这是我的swift代码:

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
,它运行得很好,没有任何问题,现在你怎么让它工作呢?谢谢。

您正在执行的
/bin/bash/bin/echo
在Terminal.app中也不起作用

删除
/bin/bash

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

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

  • 如果您传递它
    -c“some command string”
    ,它将执行该命令字符串

  • 如果您将文件路径作为参数传递给它,它将从该文件中读取命令并执行它们(即,将文件作为shell脚本执行)

  • 如果不传递任何参数,它将从标准输入读取并执行命令

  • 由于您向它传递了参数“/bin/echo”和“1234”,它假定您需要模式2,因此它尝试从/bin/echo读取shell命令,但失败了。我不清楚您到底想实现什么,但我看到了几个可能相关的选项:

    • 如果您试图执行二进制文件(例如/bin/echo),只需直接执行即可,而无需使用bash:

      task.launchPath = "/bin/echo"
      task.arguments = ["1234"]
      
    • 如果您需要执行命令字符串(即,如果您需要shell在执行它之前对其进行解析,例如通配符得到扩展,或者有多个命令,或者…),请使用
      bash-c

      task.launchPath = "/bin/bash"
      task.arguments = ["-c", "/bin/echo 1234; ls *"]
      
    • 如果需要执行一个实际脚本,即其中包含shell命令的文件,则不要执行
      runTask
      ,而是向其传递一个实际脚本:

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