簡體   English   中英

使用NSTask執行shell命令時,通過NSPipe輸出的奇怪問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM