【发布时间】:2011-11-16 04:55:35
【问题描述】:
可可新手警告!
我发现以下 shell 命令是确定进程是否正在运行的好方法(1 = 正在运行,0 = 未运行):
if [ $(ps -Ac | egrep -o 'ProcessName') ]; then echo 1; else echo 0; fi;
我可以使用“系统”命令将其合并到 Cocoa 中:
system("if [ $(ps -Ac | egrep -o 'Finder') ]; then echo 1; else echo 0; fi;");
但是,输出被定向到运行日志,我不知道如何在我的 Cocoa 代码中捕获结果(1 或 0)。
我尝试使用 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];
但是,这会生成以下错误消息:
if [ $(ps -Ac | egrep -o 'Finder') ];然后回显 1;否则回显0; fi;: 没有这样的文件或目录
你能告诉我如何正确地实现这个 shell 命令,让我可以捕获代码中的输出(1 或 0)吗? (我知道确定进程是否正在运行的其他方法,但我提出问题的部分原因是学习如何在 Cocoa 中实现一般的 shell 脚本。)
非常感谢您对此问题的任何帮助。
【问题讨论】:
-
看看它是如何工作的,为什么要依赖一个相对复杂的表达式作为初学者。看看你能不能让
echo 1工作。也因为`没有这样的文件或目录`消息,system() 直接调用本地目录,寻找文件名if ...。我猜你需要用shell的路径和-e(执行选项?)来包装你的“脚本”,产生简单的案例测试[task setArguments:[NSArray arrayWithObject:@"/bin/bash -e 'echo 1'"]]。为什么不直接使用您的代码调用保存到文件系统的脚本呢?祝你好运。 -
shell脚本由shell执行;要从
system()运行 shell,您可以使用system("sh -c 'echo moo'")之类的东西。你最好只捕获来自system()的结果代码而不是命令的输出,然后你不需要if和echos:system("sh -c 'ps -Ac | egrep -o Finder'")和来自egrep的退出代码将是返回,指示是否存在匹配项。 -
ps的输出不用测试 |鹭鸶改为测试 egrep 的返回值。 IOW,只需写“if ps -Ac | egrep -o 'Finder' > /dev/null”(或者只使用 pgrep!)
-
威廉,谢谢。我在下面的工作答案中纳入了您的建议。