Shell實(shí)際上是一個(gè)命令解釋器,它解釋由用戶輸入的命令并且把它們送到內(nèi)核。
簡單介紹一下Mac系統(tǒng)下如何使用Shell命令開發(fā)終端軟件,首先簡單寫一個(gè)界面,頂部的文本框輸入待執(zhí)行的Shell命令,選擇;選擇默認(rèn)目錄按鈕表示Shell命令執(zhí)行的目錄,點(diǎn)擊Shell命令即可執(zhí)行命令。效果如下,我們選擇了Desktop,然后執(zhí)行了ls,在底部的文本框內(nèi)顯示了桌面所有的文件(不包括隱藏的文件)

181538893679_.pic_hd.jpg
選擇目錄的代碼如下,選擇完成后,記錄當(dāng)前選擇的path
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
openPanel.canChooseDirectories = YES;
NSInteger result = [openPanel runModal];
if(result == NSModalResponseOK) {
_currentUrl = openPanel.URL;
}
NSTask執(zhí)行Shell命令
self.task = [[NSTask alloc] init];
self.task.arguments =@[@"-l", @"-c", self.shellTextview.stringValue];
self.task.launchPath = @"/bin/bash";
self.task.currentDirectoryURL = _currentUrl;
然后創(chuàng)建NSPip接收NSTask的輸入,同時(shí)接收異常輸出
NSPipe *outPip = [[NSPipe alloc] init];
[self.task setStandardOutput:outPip];
NSPipe *errorPip = [[NSPipe alloc] init];
[self.task setStandardError:errorPip];
[self.task launch];
[self.task waitUntilExit];
將輸入結(jié)果轉(zhuǎn)換成NSString顯示
NSData *outData = [[outPip fileHandleForReading] availableData];
[outPip.fileHandleForReading readInBackgroundAndNotify];
NSData *errorData = [[errorPip fileHandleForReading] availableData];
[errorPip.fileHandleForReading readInBackgroundAndNotify];
NSString *outString = [[NSString alloc] initWithData:outData encoding:NSUTF8StringEncoding];
NSString *errorString = [[NSString alloc] initWithData:errorData encoding:NSUTF8StringEncoding];
if(outString.length > 0) {
self.resultTextView.textColor = [NSColor blackColor];
self.resultTextView.string = outString;
}
效果如下:

Screen Shot 2018-10-07 at 2.37.37 PM.png