0

这是我的代码:

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

我很困惑....

有人可以帮我写代码吗?

谢谢,以利亚

4

2 回答 2

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),则可以将脚本文件的路径作为启动路径传递并省略参数。

于 2010-09-28T07:28:36.190 回答
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 )

于 2010-09-28T07:29:42.713 回答