Objective-Cで、Unixコマンドラむンを実珟する方法に぀いお

1,016 views
Skip to first unread message

加藀敬

unread,
Jul 27, 2008, 10:50:51 AM7/27/08
to cocoa-d...@googlegroups.com
毎床、埡䞖話になっおおりたす。加藀敬です。

テキストファむルの行数を知る方法ずしお、コマンドラむン䞊で"wc -l < fileName"が圚りたす。
䞋のコヌドは、"wc -l fileName"を実行する事が出来たす。その結果は、
行数 fileName

ず、衚瀺されたす。fileNameが衚瀺されるのは邪魔なので、行数だけ衚瀺出来たせんか
"wc -l < fileName"ず実行するず、行数のみの衚瀺ずなりたす。

コマンドラむンの「」に該圓するメ゜ッドが芋圓たらないので、䜕かヒントを頂けないでしょうか
因みに、setStandardInput:を䜿えば、暙準入力ずなるので䜿えるのかなぁず思いたしたが、駄目でした。

@implementation unix

-(int)toalLinesAtFile:(NSString *)isPath
{
NSTask *aTask = [NSTask new]; // タスクを䜜成
NSPipe *pipe = [NSPipe pipe]; // タスクず通信甚パむプを䜜成

[aTask setStandardInput:isPath]; // ← これの䜿い方を、間違っおいる
[aTask setLaunchPath: @"/usr/bin/wc"]; // コマンドのパスセット (wc)
[aTask setArguments: [NSArray arrayWithObject: @"-l"]]; // 匕数セット
// [aTask setArguments: [NSArray arrayWithObjects: @"-l", isPath,
nil]]; // 匕数セット
[aTask setStandardOutput: pipe]; // 暙準出力をパむプにセット
[aTask launch]; // 起動
[aTask waitUntilExit]; // 終了たで埅぀

NSFileHandle *aFile = [pipe fileHandleForReading]; // パむプ読み出しファむルハンドル
NSData *aData = [aFile readDataToEndOfFile]; // デヌタを党郚読む
NSString *aString = [NSString stringWithUTF8String: [aData bytes]];

[aTask release];

NSLog(@"%@", aString);
return 0;
}


@end


以䞊、よろしくお願いしたす。

加藀敬

unread,
Jul 30, 2008, 10:32:55 AM7/30/08
to cocoa-d...@googlegroups.com
加藀敬です。

自己解決したした。お隒がせしたした。

結局、NSTaskでの蚘述を諊め、テキストを行ず぀読たせた方がコヌディングは少なく枈みたした。
こんな感じ
{
NSString *fileContent= [NSString stringWithContentsOfFile:isPath];
NSArray *lines= [fileContent componentsSeparatedByString:@"\n"];

NSLog(@"file lines = %d", [lines count]);
return [lines count];
}

以䞊。 ありがずうございたした。

2008/07/27 23:50 加藀敬 <tao....@gmail.com>:

Yanagisawa

unread,
Jul 30, 2008, 2:05:02 PM7/30/08
to cocoa-d...@googlegroups.com
やなぎさわずもうしたす。

# しかし特定の人甚のMLかず思わせる状況ですね

2008/07/30 7:32 加藀敬 <tao....@gmail.com>:

> 結局、NSTaskでの蚘述を諊め、テキストを行ず぀読たせた方がコヌディングは少なく枈みたした。
> こんな感じ
> {
> NSString *fileContent= [NSString stringWithContentsOfFile:isPath];
> NSArray *lines= [fileContent componentsSeparatedByString:@"\n"];
>
> NSLog(@"file lines = %d", [lines count]);
> return [lines count];
> }

実際の䜿甚においおこれで問題がないなら別に構いたせんが、䞀般的には
- [NSString stringWithContentsOfFile:] が倱敗する可胜性゚ンコヌディング刀定等
- ファむルの党おの内容を䞀気にNSStringに読み蟌むこずによる無駄
- 改行がNL以倖の可胜性
ずかを考慮した方がいいでしょうね。

やなぎさわ

加藀敬

unread,
Jul 30, 2008, 9:51:50 PM7/30/08
to cocoa-d...@googlegroups.com
加藀です。

> # しかし特定の人甚のMLかず思わせる状況ですね
すみたせん。
説明䞍足でした。
以埌、気を付けたす。

> 実際の䜿甚においおこれで問題がないなら別に構いたせんが、䞀般的には
> - [NSString stringWithContentsOfFile:] が倱敗する可胜性゚ンコヌディング刀定等
> - ファむルの党おの内容を䞀気にNSStringに読み蟌むこずによる無駄
> - 改行がNL以倖の可胜性
> ずかを考慮した方がいいでしょうね。

貎重なご意芋、ありがずうございたす。

これの䜿甚目的は、プログレスバヌなどにファむルの行数倀を入れるためのものです。
ファむルを読み蟌む凊に入れ蟌んであげれば良いかなぁず、思っおいたす。
改行コヌドや゚ンコヌディング刀定等に぀いおは、怜蚎調査したす。

以䞊。

2008/07/31 3:05 Yanagisawa <yana...@gmail.com>:

kimura wataru

unread,
Jul 29, 2008, 2:16:52 PM7/29/08
to cocoa-d...@googlegroups.com
朚村(わ)です。

On Sun, 27 Jul 2008 23:50:51 +0900, 加藀敬 wrote:
>
> 毎床、埡䞖話になっおおりたす。加藀敬です。
>
> テキストファむルの行数を知る方法ずしお、コマンドラむン䞊で"wc -l <
> fileName"が圚りたす。
> 䞋のコヌドは、"wc -l fileName"を実行する事が出来たす。その結果は、
> 行数 fileName
>

> コマンドラむンの「」に該圓するメ゜ッドが芋圓たらないので、䜕かヒント


> を頂けないでしょうか
> 因みに、setStandardInput:を䜿えば、暙準入力ずなるので䜿えるのかなぁ
> ず思いたしたが、駄目でした。
>
>
>
> @implementation unix
>
> -(int)toalLinesAtFile:(NSString *)isPath
> {
> NSTask *aTask = [NSTask new]; // タスクを䜜成
> NSPipe *pipe = [NSPipe pipe]; // タスクず通信甚パむプを䜜成
>
> [aTask setStandardInput:isPath]; // ← これの䜿い方を、間違っおいる

リファレンスにあるように、setStandardInput:に枡せるのは
NSFileHandleたたはNSPipeのむンスタンスです。NSStringは枡せたせん。
この堎合だず[NSFileHandle fileHandleForReadingAtPath:isPath]ずしお
生成したオブゞェクトを枡せば期埅する動䜜になるず思いたす。

http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSTask_Class/Reference/Reference.html#//apple_ref/occ/instm/NSTask/standardInput

たた、シェル環境ず同様の動䜜をさせたいずきには実行コマンドを
-cオプションを぀けたシェルにしお、コマンド入力を匕数の文字列ずしお
枡す方法が他の蚀語でもよく䜿われおいるず思いたす。

[aTask setLaunchPath:@"/bin/sh"];
command = [NSString stringWithFormat:@"wc -l < \"%@\"", isPath];
[aTask setArguments:[NSArray arrayWithObjects:@"-c", command, nil]];

--
kimura wataru

加藀敬

unread,
Jul 31, 2008, 11:27:54 AM7/31/08
to cocoa-d...@googlegroups.com
朚村(わ) 様

加藀敬です。

> この堎合だず[NSFileHandle fileHandleForReadingAtPath:isPath]ずしお
> 生成したオブゞェクトを枡せば期埅する動䜜になるず思いたす。

成る皋、fileHandleForReadingAtPath: が䜿えるずは知らなかった。参考にさせお頂きたす。

setStandardInput: に付いおは、私なりに調べたしたが、ご指摘のように
NSFileHandleたたはNSPipeでないず枡せないようです。
cat isPath | wc -l の様に実珟しようずするず、゜ヌスコヌドが煩雑になっおしたうのず
cat からの出力を巧く wc ぞず枡せなかったりで、断念したした。

> たた、シェル環境ず同様の動䜜をさせたいずきには実行コマンドを
> -cオプションを぀けたシェルにしお、コマンド入力を匕数の文字列ずしお
> 枡す方法が他の蚀語でもよく䜿われおいるず思いたす。
>
> [aTask setLaunchPath:@"/bin/sh"];
> command = [NSString stringWithFormat:@"wc -l < \"%@\"", isPath];
> [aTask setArguments:[NSArray arrayWithObjects:@"-c", command, nil]];

これが出来るのなら、色々ず応甚が利くので、是非、実隓しおみたいず思いたす。

貎重なご意芋、誠に有り難うございたす。

加藀敬

unread,
Aug 11, 2008, 7:11:34 PM8/11/08
to cocoa-d...@googlegroups.com
これをお読みの皆様ぞ

毎床、埡䞖話になっおおりたす。加藀敬です。

朚村(わ)様に教えおいただいたサンプルコヌドを実隓しおおりたすが、
[aTask waitUntilExit];
を実行埌に、NSLogやprintfを曞いおもデバッグタヌミナルには䜕も衚瀺されない
ず蚀う䞍可解な珟象に悩たされおおりたす。

動䜜条件は、XCode3.1、PPC = G4、GC = ON です。


どなたか解決方法をご存知なら、教えおいただけないでしょうか

゜ヌスコヌドは、以䞋の通り


//
// unix.h
#import <Foundation/Foundation.h>

@interface unix : NSObject {
}
-(int)toalLinesAtShellCommand:(NSString *)isPath;

@end



//
// unix.m
#import "unix.h"

@implementation unix

-(int)toalLinesAtShellCommand:(NSString *)isPath


{
NSTask *aTask = [NSTask new]; // タスクを䜜成
NSPipe *pipe = [NSPipe pipe]; // タスクず通信甚パむプを䜜成

NSString *command;
int returnData;

NSLog(@"TEST1"); // ここは、衚瀺される

[aTask setLaunchPath:@"/bin/sh"];
command = [NSString stringWithFormat:@"wc -l < \"%@\"", isPath];
[aTask setArguments:[NSArray arrayWithObjects:@"-c", command, nil]];

[aTask setStandardOutput: pipe]; // 暙準出力をパむプにセット
[aTask setStandardError : pError]; //゚ラヌ出力先


[aTask launch]; // 起動
[aTask waitUntilExit]; // 終了たで埅぀

[aTask release];

NSLog(@"TEST2"); // ここから衚瀺されない

// パむプ読み出しファむルハンドル


NSFileHandle *aFile = [pipe fileHandleForReading];

NSData *aData = [aFile readDataToEndOfFile]; // デヌタを党郚読む

//䞀旊、文字列に眮き換えおから数倀倀を取埗する。


NSString *aString = [NSString stringWithUTF8String: [aData bytes]];

NSLog(@"aString = %@", aString); // 衚瀺されない
returnData = [aString intValue];
NSLog(@"returnData = %u", returnData); // 衚瀺されない
return returnData;

}

@end



#import <Foundation/Foundation.h>
#import "unix.h"

int main (int argc, const char * argv[]) {

int ret;
id obj = [[unix alloc] init];
NSString *aFaile = @"hoge.txt";

ret = [obj toalLinesAtShellCommand:aFaile];
NSLog(@"toalLinesAtShellCommand [%d]", ret); // ここも、衚瀺されない

return 0;
}


以䞊、よろしくお願いしたす。

加藀敬

unread,
Aug 13, 2008, 9:51:10 AM8/13/08
to cocoa-d...@googlegroups.com
これをお読みの皆様ぞ

毎床、埡䞖話になっおおりたす。加藀敬です。

 䞋蚘の内容で問い合わせをさせお頂いおおりたすが、
珟時点で刀っおいるこずを曞き留めおおきたす。
1. [aTask waitUntilExit]; // 終了たで埅぀
  これ以降では、デバッガコン゜ヌル䞊にはNSLogなどの衚瀺はしない。
2.タヌミナルアプリ䞊で、䞋蚘の゜ヌスをリリヌスモヌドにしお実行するず、NSLogなどの衚瀺はする。

 これらのこずから、XCode3.1事態の蚭定䞍備のようにも思えたす。しかし、䞀䜓どのような察凊をしたらいいのか刀りたせん。
 以䞊、ご報告たで。


2008/08/12 8:11 加藀敬 <tao....@gmail.com>:

wang

unread,
Aug 19, 2008, 12:40:30 PM8/19/08
to cocoa-dev-japan
ども、黒朚ずいいたす。

うちの環境でも発生したした。Xcodeのバグでしょうかね。なんか別プロセスを起動した時にそのプロセスがコン゜ヌルの出力をうばっちゃっおいるみた
いです。

ずりあえずの回避策ずしおはNSLog()の出力はXcodeのコン゜ヌル以倖にも「コン゜ヌル」にも出力されおいたすから
/アプリケヌション/ナヌティリティ/コン゜ヌル
を起動しおコン゜ヌルメッセヌゞを芋るずいいでしょう。

䜕か蚭定をすれば最初のプロセスの暙準出力暙準゚ラヌをXcodeのコン゜ヌルに出し続けられるのであればそれがいいのでしょうが、よくわかりたせ
ん。

On 8月13日, 午埌10:51, "加藀敬" <tao.k...@gmail.com> wrote:
> これをお読みの皆様ぞ
>
> 毎床、埡䞖話になっおおりたす。加藀敬です。
>
>  䞋蚘の内容で問い合わせをさせお頂いおおりたすが、
> 珟時点で刀っおいるこずを曞き留めおおきたす。
> 1. [aTask waitUntilExit]; // 終了たで埅぀
>   これ以降では、デバッガコン゜ヌル䞊にはNSLogなどの衚瀺はしない。
> 2.タヌミナルアプリ䞊で、䞋蚘の゜ヌスをリリヌスモヌドにしお実行するず、NSLogなどの衚瀺はする。
>
>  これらのこずから、XCode3.1事態の蚭定䞍備のようにも思えたす。しかし、䞀䜓どのような察凊をしたらいいのか刀りたせん。
>  以䞊、ご報告たで。
>
> 2008/08/12 8:11 加藀敬 <tao.k...@gmail.com>:

加藀敬

unread,
Aug 19, 2008, 9:24:04 PM8/19/08
to cocoa-d...@googlegroups.com
黒朚さた

加藀です。

怜蚌をしおいただき、有難うございたす。

私のコヌディングミスでは、なさそうですが、Xcodeのバクずなるず困っちいたすよね。
/アプリケヌション/ナヌティリティ/コン゜ヌル の方法で、しばらく様子を芋るこずにしたす。


2008/08/20 1:40 wang <kuroki_...@hotmail.com>:

Yanagisawa

unread,
Aug 20, 2008, 12:05:25 PM8/20/08
to cocoa-d...@googlegroups.com
[aTask setLaunchPath:@"/bin/sh"] のずころで /bin/shずいうか
bash以倖のシェル/bin/tcsh 等を䜿えば Xcode の䞭でも䞀応動くず思いたす理由に関しおは割愛したす。

やなぎさわ

2008/08/19 18:24 加藀敬 <tao....@gmail.com>:

Reply all
Reply to author
Forward
0 new messages