0

これが私のコードです。myCmd=@"cd /\nls -l\n"またはを設定するとmyCmd=@"ls -l\n"問題ありません。ただし、を設定するmyCmd=@"cd /\n"と、プログラムは行if ((output =[[outPipe fileHandleForReading] availableData]) && [output length])で停止し、デバッグ情報は何も出力されません。

"cd /"cmdが他のシェルコマンドと異なるかどうかはわかりません。アドバイスをいただけますか?

NSData *inputData = [myCmd dataUsingEncoding:NSUTF8StringEncoding];
NSPipe *inPipe = [NSPipe pipe];
NSFileHandle *fh = [inPipe fileHandleForWriting];
[fh writeData: inputData];
NSPipe *outPipe = [NSPipe pipe];
//NSPipe *errPipe = [NSPipe pipe];
NSTask *task = [[NSTask alloc] init];
[task setStandardInput:inPipe];
[task setStandardOutput:outPipe];
[task setStandardError:outPipe];
[task setLaunchPath:@"/bin/sh"];
NSArray *args = [NSArray arrayWithObject:@"-s"];
[task setArguments:args];

[task launch];

NSData *output;
NSString *string;

if ((output =[[outPipe fileHandleForReading] availableData]) && [output length]) 
{
    string = [[NSString alloc] initWithFormat:@"%.s", [output bytes]];
}
NSLog(@"%@", string);
4

1 に答える 1

1

cd /cmdが他のシェルコマンドと異なるかどうかはわかりません。

ls -l出力を書き込まないという点で、 m とは異なります。あなたのプログラムは、おそらく への呼び出しでブロックされています-availableData


残念ながら、アイデアを試す時間はありませんが、試してみてください。

  • タスクを開始してから、入力パイプにデータを送信してから、入力パイプを閉じることができます。タスクが入力の終わりを確認すると、出力パイプが閉じられます。これは、への呼び出し-availableDataがファイルの終わりで返されることを意味します。

  • 実行ループを使用して、出力を非同期的に読み取ることができます。一度にすべてのコマンドを送信する必要がないという点で、これはより柔軟です。完了したら、入力を閉じる必要があります。

  • NSOperation で出力を読み取ることができます。これにより、効果的に別のスレッドに配置されます。繰り返しますが、完了したら入力パイプを閉じる必要があります。

cdところで、最後に行うシェルへの送信は無意味な操作であることを指摘しておきます。次に起こることは、シェルが終了し、cd結果が失われることです。現在のプロセスでディレクトリを変更することが目的の場合は、[NSFilemanager changeCurrentDirectoryPath:]を参照してください。

于 2012-05-17T16:24:54.250 に答える