ココア初心者警告!シェルコマンドから出力をキャプチャするにはどうすればよいですか?
Iは、プロセスが実行されているかどうかを判断する良い方法であると、次のシェル・コマンドを見つける(1 =実行中、0 =動作していない):
if [ $(ps -Ac | egrep -o 'ProcessName') ]; then echo 1; else echo 0; fi;
I「はシステムとココアにこれを組み込むことができ「コマンド:
system("if [ $(ps -Ac | egrep -o 'Finder') ]; then echo 1; else echo 0; fi;");
しかし、出力が実行ログを対象としている、と私は私のココアコードに(1または0)の結果をキャプチャする方法を見つけ出すことはできません。
私は次のようにNSTaskでこれを実装してみました:
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@"/bin/sh"];
[task setArguments:[NSArray arrayWithObject:@"if [ $(ps -Ac | egrep -o 'Finder') ]; then echo 1; else echo 0; fi;"]];
NSPipe *pipe = [NSPipe pipe];
[task setStandardOutput:pipe];
[task launch];
NSData *data = [[pipe fileHandleForReading] readDataToEndOfFile];
[task waitUntilExit];
[task release];
NSString *output = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog (@"%@", output);
[output release];
しかし、これは、次のエラーメッセージを生成:[$場合
を(PS -Ac | egrepの-o 'ファインダー') ];次にエコー1。 else echo 0;このファイルまたはディレクトリはありません
出力(1または0)をコードでキャプチャできるようにこのシェルコマンドを正しく実装する方法を教えてください。 (私はプロセスが実行されているかどうかを判断する他の方法を知っていますが、私の質問の理由の一部は、ココア内のシェルスクリプトを一般的に実装する方法を学ぶことです)。
ありがとう問題。
これはどのように動作するのかを見るには、なぜスターターにとって比較的複雑な表現に頼るのですか? 'echo 1'が動作するかどうか確認してください。また 'No such file or directory' msgのために、system()が直接ローカルディレクトリを呼び出し、ファイル名が' if ... 'であることを確認します。シェルのパスと '-e'(オプションを実行する?)を入れて、単純なケーステスト' [task setArguments:[NSArray arrayWithObject:@ "/]を生成する必要があると思いますbin/bash -e 'echo 1' "]]'を実行します。なぜあなたのファイルシステムに保存されたスクリプトを呼び出すためにあなたのコードを使用するだけではありませんか?がんばろう。 – shellter
シェルスクリプトはシェルによって実行されます。 'system()'からシェルを実行するには、 'system(" sh -c 'echo moo' ")'のようなものを使用します。コマンドの出力ではなく、 'system()'から結果コードを取得するほうが良いですし、 'if'と' echo'sは必要ありません: 'system(" sh -c 'ps -Ac | egrep -o Finder '")'と一致するかどうかを示す 'egrep'の終了コードが返されます。 – tripleee
psの出力をテストする必要はありません。 egrep。代わりにegrepの戻り値をテストします。 IOW、 "ps -Ac | egrep -o 'Finder'>/dev/null"と書いてください(または単にpgrepを使ってください)。 –