这是我的代码:
-(void)startTask{
NSString * cmd = @"/bin/sh";
pty_ = [[PseudoTTY alloc] init];
NSTask * task = [[NSTask alloc] init];
[task setStandardInput:[pty_ slaveFileHandle]];
[task setStandardOutput:[pty_ slaveFileHandle]];
[task setStandardError:[pty_ slaveFileHandle]];
[task setCurrentDirectoryPath:[@"~" stringByExpandingTildeInPath]];
[task setLaunchPath:@"/bin/sh /applications/jarvis/brain/server.sh"];
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(didRead:)
name:NSFileHandleReadCompletionNotification
object:[pty_ masterFileHandle]];
[[pty_ masterFileHandle] readInBackgroundAndNotify];
[task launch];
[self insertText:
[NSString stringWithFormat:@"Started %@ on terminal %@", cmd, [pty_ name]]];
}
但是,不是这样,我需要它来启动一个SH文件:/applications/brain/server.sh
我很困惑....
有人可以帮我处理我的代码吗?
感谢, 利亚
答案 0 :(得分:0)
[task setCurrentDirectoryPath:[@"~" stringByExpandingTildeInPath]];
您只需拨打NSHomeDirectory
即可获取主目录路径。
[task setLaunchPath:@"/bin/sh /applications/jarvis/brain/server.sh"];
此文件不存在。 / bin目录中没有名为“sh”的目录;因此,其中没有“applications”子目录,其中没有“jarvis”子目录,其中没有“brain”子目录,并且没有“server.sh”文件。
请记住,NSTask不是shell。壳牌技巧不起作用;它不解析参数,插入环境变量或〜(注意你必须明确地这样做),或shell所做的任何事情。您只能使用与任何其他程序相同的shell。
您需要将启动路径设置为shell的路径,并将路径作为第一个参数传递给shell脚本。或者,如果您知道shell脚本文件是可执行的(并且其中包含正确的shebang),则可以将路径作为启动路径传递给脚本文件,并省略参数。
答案 1 :(得分:0)
尝试:
// make sure server.sh begins with #!/bin/sh
NSString * cmd = @"/applications/brain/server.sh";
// ...
[task setLaunchPath:cmd];
(原始代码来自:http://amath.colorado.edu/pub/mac/programs/PseudoTTY.zip)