使用NSTask启动SH文件

时间:2010-09-27 20:09:01

标签: cocoa nstask

这是我的代码:

-(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

我很困惑....

有人可以帮我处理我的代码吗?

感谢, 利亚

2 个答案:

答案 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