在 Objective-C 中使用带有 NSTask 参数的相对路径

Use a relative path with NSTask Arguments in Objective-C

除了 shell 脚本编写之外,我几乎没有任何编程经验,但我处于需要使用 launchd 调用二进制文件的情况,并且由于 Catilina 中的安全更改,它看起来好像不能AppleScript .app、Automator .app 或 Platypus .app。这三个 ose 都调用某种 GUI 元素,none 将在启动时正常工作。

我拼凑了一段代码,可以编译并调用我需要的脚本。我已将其捆绑为一个 .app,对其进行签名,然后它就可以运行了。但我非常想调用相对于二进制文件的脚本。

如何调用等价于

[task setArguments:@[ @"../Resources/script" ]];

而不是

[task setArguments:@[ @"/Full/Path/To/script" ]];

以下是main.m

的全部内容
#import <Foundation/Foundation.h>
enter code here
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
       NSTask *task = [[NSTask alloc] init];
        [task setLaunchPath:@"/bin/zsh"];
        [task setArguments:@[ @"/Full/Path/To/script" ]];
        [task launch];
    }
    return 0;
}

顺便说一句,我知道有很多更好的方法可以做到这一点,但我的目标 os 不是拥有一个屡获殊荣的应用程序,而是简单地解决一个特定的问题。非常感谢。

您使用 NSFileManager

获取当前目录
NSString* path = [[NSFileManager defaultManager] currentDirectoryPath];

argv 中的第一个参数是二进制文件的路径

任一

NSString *path = [NSString stringWithUTF8String:argv[0]];

NSString *path = [[NSProcessInfo processInfo] arguments][0];

您应该为此使用 NSBundle。特别是,您应该使用:

[[NSBundle mainBundle] pathForResource:@"script" ofType:nil]

如:

[task setArguments:@[ [[NSBundle mainBundle] pathForResource:@"script" ofType:nil] ]];