使用NSTask調用shell


- (NSString *)cmd:(NSString *)cmd
{
    // 初始化並設置shell路徑
    NSTask *task = [[NSTask alloc] init];
    [task setLaunchPath: @"/bin/bash"];
    // -c 用來執行string-commands(命令字符串),也就說不管后面的字符串里是什么都會被當做shellcode來執行
    NSArray *arguments = [NSArray arrayWithObjects: @"-c", cmd, nil];
    [task setArguments: arguments];
    
    // 新建輸出管道作為Task的輸出
    NSPipe *pipe = [NSPipe pipe];
    [task setStandardOutput: pipe];
    
    // 開始task
    NSFileHandle *file = [pipe fileHandleForReading];
    [task launch];
    
    // 獲取運行結果
    NSData *data = [file readDataToEndOfFile];
    return [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
}

該方法傳入一個NSString類型的命令字符串,返回運行結果。但是使用這種方法沒法記憶上一次操作,沒法做到像在終端中執行多次命令那樣自如。

例如:先cd到桌面,然后在桌面新建文件夾,在終端中我們是這么實現的:

JanaChen'sMac:~ JanaChen$ cd Desktop
JanaChen'sMac:~ JanaChen$ mkdir helloWorld

使用NSTask調用:

// 這種調用方式結果是錯誤的,因為一條命令執行完Task就會銷毀,相當於輸入完終端關閉,再打開再輸出,這時執行第二條語句時第一條語句已經不起作用了
[self cmd:@"cd Desktop"];
[self cmd:@"mkdir helloWorld"];

// 應使用下面這種方式實現
[self cmd:@"cd Desktop; mkdir helloWorld"];

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM