[英]Strange issue of output via NSPipe when execute shell command using NSTask
這是我的代碼。 當我設置myCmd=@"cd /\\nls -l\\n"
或myCmd=@"ls -l\\n"
,這沒問題。 但是,當我設置myCmd=@"cd /\\n"
, if ((output =[[outPipe fileHandleForReading] availableData]) && [output length])
,程序死在該行中,並且沒有調試信息輸出。
我不知道"cd /"
cmd是否與其他shell命令不同。 你能給我一些建議嗎?
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);
我不知道
cd /
cmd是否與其他shell命令不同。
它與m ls -l
的不同之處在於它不寫入任何輸出。 您的程序可能在-availableData
調用中被阻止。
不幸的是,我沒有時間嘗試任何想法,但是您可以嘗試以下一些方法。
您可以嘗試啟動任務,然后將數據發送到輸入管道,然后關閉輸入管道。 當任務看到輸入結束時,它將關閉輸出管道,這意味着您對-availableData
的調用將以文件結尾返回。
您可以使用運行循環異步讀取輸出。 這樣做更加靈活,因為您不必一次發送所有命令。 完成后,您仍然需要關閉輸入。
您可以在NSOperation中讀取輸出,這可以有效地將其放在其他線程上。 同樣,完成后,您仍然需要關閉輸入管道。
順便說一句,我應該指出,將cd
作為最后一步發送到shell是沒有意義的操作。 接下來發生的事情是外殼退出並且cd
結果丟失。 如果您的目標是在當前進程中更改目錄,請查看[NSFilemanager changeCurrentDirectoryPath:]。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.