Objective-C 以 < 开头的命令行参数
Objective-C command line arguments starting with <
我正在使用 standardUserDefaults 解析命令行参数,就像另一个问题中建议的那样,这在 99% 的情况下都有效,但是当参数以 < 开头时它会失败。
作品:
./prog -arg1 'hello<>asdf
无效:
./prog -arg1 '<hello'
当提供的参数以 < 开头时 [defaults stringForKey:key] 只是 returns NULL。基本上几乎所有东西似乎都能正常工作,除非它以 < 开头,而且我认为它与 bash/escaping/pipes 没有任何关系。
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSLog(@"arg1: %@", [defaults stringForKey:@"arg1"]);
// NSLog(@"%@", [defaults dictionaryRepresentation]);
}
return 0;
}
我猜你发现了一个错误。您报告的行为就是发生的情况,快速检查可能的其他特殊字符也会显示以破折号开头的值,例如./prog -arg1 '-fred'
,也不起作用 - 其他符号,例如“>”、“;”和'|'工作。
minimal documentation 没有提供此行为的原因。
报告错误
在您的代码中,您可以自己处理参数。如果你想使用 C 风格的字符串进行解析,你可以使用 argc
& argv
;或者 NSProcessInfo.processInfo.arguments
会给你它们作为 NSString
的 NSArray
。
HTH
我正在使用 standardUserDefaults 解析命令行参数,就像另一个问题中建议的那样,这在 99% 的情况下都有效,但是当参数以 < 开头时它会失败。
作品:
./prog -arg1 'hello<>asdf
无效:
./prog -arg1 '<hello'
当提供的参数以 < 开头时 [defaults stringForKey:key] 只是 returns NULL。基本上几乎所有东西似乎都能正常工作,除非它以 < 开头,而且我认为它与 bash/escaping/pipes 没有任何关系。
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSLog(@"arg1: %@", [defaults stringForKey:@"arg1"]);
// NSLog(@"%@", [defaults dictionaryRepresentation]);
}
return 0;
}
我猜你发现了一个错误。您报告的行为就是发生的情况,快速检查可能的其他特殊字符也会显示以破折号开头的值,例如./prog -arg1 '-fred'
,也不起作用 - 其他符号,例如“>”、“;”和'|'工作。
minimal documentation 没有提供此行为的原因。
报告错误在您的代码中,您可以自己处理参数。如果你想使用 C 风格的字符串进行解析,你可以使用 argc
& argv
;或者 NSProcessInfo.processInfo.arguments
会给你它们作为 NSString
的 NSArray
。
HTH