可可新手警告!如何從shell命令捕獲輸出?
我發現下面的外殼命令是一個很好的方法,以確定是否一個進程正在運行(1 =運行,0 =未運行):
if [ $(ps -Ac | egrep -o 'ProcessName') ]; then echo 1; else echo 0; fi;
我可以與「系統納入可可這「命令:
system("if [ $(ps -Ac | egrep -o 'Finder') ]; then echo 1; else echo 0; fi;");
然而,輸出被定向到運行日誌,我無法弄清楚如何捕獲的結果(0或1)在我的可可代碼。
我試圖實現此與NSTask如下:
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@"/bin/sh"];
[task setArguments:[NSArray arrayWithObject:@"if [ $(ps -Ac | egrep -o 'Finder') ]; then echo 1; else echo 0; fi;"]];
NSPipe *pipe = [NSPipe pipe];
[task setStandardOutput:pipe];
[task launch];
NSData *data = [[pipe fileHandleForReading] readDataToEndOfFile];
[task waitUntilExit];
[task release];
NSString *output = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog (@"%@", output);
[output release];
然而,這會產生以下錯誤消息:
如果[$(PS -Ac | egrep的-o '搜索') ]。然後回顯1;其他回顯0; fi ;:沒有這樣的文件或目錄
你能告訴我怎樣才能正確實現這個shell命令的方式,允許我在代碼中捕獲輸出(1或0)? (我知道確定一個進程是否正在運行的其他方法,但我的問題的部分原因是要學習如何在Cocoa中實現shell腳本。)
非常感謝您對此有任何幫助問題。
看看它是如何工作的,爲什麼依靠一個相對複雜的表達式爲初學者。看看你是否可以使用echo 1來工作。同樣因爲'沒有這樣的文件或目錄'消息,系統()直接調用本地目錄,尋找一個文件名'if ...'。我猜你需要用shell和shell的'-e'(執行選項?)包裝你的'腳本',產生簡單的大小寫測試'[task setArguments:[NSArray arrayWithObject:@「/ bin/bash -e'echo 1'「]]'。爲什麼不使用你的代碼來調用保存到文件系統的腳本?祝你好運。 – shellter
Shell腳本由shell執行;從'system()'運行一個shell,你可以使用'system(「sh -c'echo moo'」)''。你最好從'system()'中獲取結果代碼而不是命令的輸出,然後你不需要'if'和'echo's:'system(「sh -c'ps -Ac | egrep -o Finder'「)'和'egrep'的退出碼將被返回,表示是否匹配。 – tripleee
沒有必要測試ps |的輸出egrep的。而是測試egrep的返回值。 IOW,只需寫「if ps -Ac | egrep -o'Finder'>/dev/null」(或者只是使用pgrep!) –