2016-04-24 15 views
1

シェルスクリプトの実行が必要なOS X Appを作成しています。ここに私の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. ファイルパスを引数として渡すと、そのファイルからコマンドが読み込まれ、実行されます(つまり、ファイルをシェルスクリプトとして実行します)。

  3. 引数を渡さないと、標準入力からコマンドが読み込まれ、実行されます。それは、ビン/エコー/からシェルコマンドを読み取ろうとし、失敗したので

あなたは、引数「/ binに/エコー」それを渡されたので、「1234」、あなたがモード2をしたいと仮定しています。ただ、あなたが(例えば/ binに/エコー)バイナリを実行しようとしている場合

  • :私はあなたが達成しようとしている正確に何に明確ではないんだけど、私は、関連するかもしれないいくつかのオプションを参照してくださいすべてではbashを使用せずに、直接そのコマンドを実行します

    task.launchPath = "/bin/echo" 
    task.arguments = ["1234"] 
    
  • コマンド文字列を実行する必要がある場合は、それを実行する前にそれを解析するためにシェルが必要な場合(つまり、そう例えばワイルドカードが展開、または2つ以上があります取得コマンドなど)を使用する場合は、bash -c

    task.launchPath = "/bin/bash" 
    task.arguments = ["-c", "/bin/echo 1234; ls *"] 
    
  • あなたは、実際のスクリプト、その中にシェルコマンドを持つ、すなわち、ファイルを実行して一人でrunTaskを残すが、それを実際のスクリプト渡す必要がある場合:

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

/bin/bash /bin/echoはTerminal.appでも動作しません。

/bin/bash

task.launchPath = "/bin/echo" 
... 
runTask(["1234"]) 
関連する問題