2012-01-02 11 views
3

私は作成しているアプリケーションを持っていて、その中からシェルスクリプトを実行したいと思っています。スクリプトの1つは.plistファイルを作成し、もう1つはバイナリファイルにパッチを適用します。シェルスクリプトでこれをやりたいのは、私が必要とする2つのもののために動作することが分かっているからです。 Objective-C/Cocoaでどうやってやっているのかは分かりませんが、これを達成するための推奨事項は非常に高く評価されます。アプリケーションからのCocoa Objective-Cシェルスクリプト?

+0

あなたはMacOSか? iOSでは、obj-c(書き込み可能なディレクトリのみ)からバイナリを簡単に作成することができます。 –

+0

申し訳ありませんが、OS X用です。 –

+0

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

答えて

5

NSTaskを使用する必要があります。 NSTaskは、ターミナルコマンドを実行するためのシステムです。コマンド/path/to/script/sh yourScript.shを実行します

NSTask *task = [[NSTask alloc] init]; 
[task setLaunchPath:@"/path/to/script/sh"]; 
[task setArguments:[NSArray arrayWithObjects:@"yourScript.sh", nil]]; 
[task setStandardOutput:[NSPipe pipe]]; 
[task setStandardInput:[NSPipe pipe]]; 

[task launch]; 
[task release]; 

:ここでは、シェルスクリプトを実行するためにそれを使用することができます方法です。スクリプトに引数が必要な場合は、それらを引数の配列に追加できます。標準出力はすべての出力をパイプオブジェクトにリダイレクトします。パイプオブジェクトは、ファイルに出力したい場合にフックできます。入力に別のNSPipeを使用する必要があるのは、スクリプトにロギングする代わりにNSLogを正しく動作させるためです。

NSTaskの仕組みの詳細については、this answerを参照してください。

+0

すばらしい例をありがとう。スクリプトをバイナリにコンパイルする方法はありますか? –

+0

@Buxme:シェルスクリプトをプロジェクトに追加し、 '[[NSBundle mainBundle] pathForResource:@" scriptName "ofType:@" sh "]'でパスを取得することができます。その後、最初の引数にそのパスを使用すれば、うまく動作するはずです。 –

+0

ありがとう! –

3

私が知っている最も簡単な方法はNSTaskです。 これは、bashスクリプトを呼び出せる端末コマンドのようなものです。

+0

ターミナルコマンドよりも優れています。なぜなら、配列の引数を渡してプログラムがタスクを直接実行するからです。シェルが関与していない場合、シェルのエスケープについて心配する必要はありません。 –

+0

Cool。あなたは偶然の例を持っていますか?また、私のアプリケーションがシェルスクリプトを呼んでいることが明らかでないか、これは本当はシェルスクリプトではないのでしょうか? BTW - 私はバイナリにスクリプトをコンパイルしたいと思う。 –

+0

@Buxme:「明白」とはどういう意味ですか?ユーザーは、アクティビティモニターを表示しない限り、別のプロセスを実行していると判断できません。 –

関連する問題