2011-01-10 40 views
4

とココア(obj.c)からシェルスクリプトを実行します。私はボタンをクリックするとそれを呼び出します。 'waitUntilExit'で行を削除すると、期待通りに動作しますが、一度だけ動作します。それがそこにあるとき、それは動作しません。 私は 'ls' 'ping -c1 google.com'のような基本的なコマンドも試してみましたが、どうにかして動作させることはできません。あなたが応答を受け取ってココアでシェルスクリプトを実行するためのいくつかの異なるアプローチを持っているなら、今私に教えてください。ありがとうございました:)は、私のようなものを持っている応答

+0

こんにちは、面白い - このコードは私のためにうまくいきます。しかし何らかの理由でNSLogが壊れてしまいます.NSLogは私のために何も表示しませんが、コンソールから直接実行すると期待どおりに動作します。私は決してあなたのコードを変更していません.... – Moszi

+0

[Cocoaアプリから端末コマンドを実行する]の可能な複製(http://stackoverflow.com/questions/412562/execute-a-terminal-command-from -a-cocoa-app) – Mark

答えて

5

ねえ、Kukosk。 NSTaskの実行時にCocoaDevに約NSLog()の問題があるというコメントがあります。修正は、タスクを起動する前にstdinためのパイプを設定することです:あなたはNSLog()に頼っている場合

[task setStandardInput:[NSPipe pipe]]; 

のみ、タスクが実行されたかどうかを確認するために、これはあなたの問題を解決することがあります。また、NSLog()ではなく、outputをGUIに表示することもできます。

+0

ありがとう@bavariousあなたは私の一日を救った!待って、あなたは別のNSTaskスレッドで同じ人ですか? :) 神のお恵みがありますように... – swdev

0

ああ、あなたが見逃していたと思われるドキュメントには、次のような気になるものがあります。「NSTaskオブジェクトは一度しか実行できません。タスクはエラーを発生させます。

だから、待ち合わせの前に[unixTask release]を追加してください。もう一度それを実行したいときは、タスクを作り直してください。

NSTimerはこれのようです。

+0

OPは、そのメソッドへの呼び出しごとに新しいタスクを作成しています。それは問題ではありません(ただし、コードがタスクを漏らしているという点で正しいですが)。 – bbum

+0

彼はまた、ガベージコレクションを使用していることを除いて、出力文字列を漏らしているでしょう。こんにちは、Kukosk。 = P –

+0

私はgcを使っていても動作しますので、私はそれをリリースします。 – Kukosk

2

問題は、タスクの出力バッファを空にしていないことです。タスクが非常に少量のデータを放出しない限り、単にタスクを起動することはできません。waitUntilDone

waitUntilDoneは、決して終了しないタスクではまったく動作しません。

任意の量の出力を発行するタスクでは、生成された出力が読み取られるように設定する必要があります。通常、readInBackgroundAndNotifyまたはその中の変種を使用します。

いずれの場合でも、NSTaskのクラス説明の先頭には、概念ガイドへのリンクとこれをカバーする一連の例があります。

+0

だから私は一般的に何をしなければなりませんか?少し説明をして作業コードを投稿してください。それは本当に助けになる!私はobjに精通しています。しかし、私はiOSプラットフォームをコーディングしていたので、一度も使ったことのないものは、まったく新しいものです:)あなたの応答に感謝します。 – Kukosk

+1

NSTaskのドキュメンテーションは、広範な例を含め、主題について深く説明しています。 – bbum

関連する問題