我正在为我的一个可可应用程序编写命令行助手。这个帮助工具应该使用NSTask
执行shell(/ bin / sh)的实例。众所周知,可以使用sh
执行-c
,您可以传递一个或多个命令作为要执行的参数。
例如,运行/bin/sh -c "networksetup -setwebproxystate Wi-Fi on"
执行networksetup -setwebproxystate Wi-Fi on
。
现在,问题在于:
当我将启动路径设置为sh
([task setLaunchPath:@"/bin/sh"]
),然后将Arguments设置为:
cmd = "-c,\\\"networksetup\\_-setwebproxystate\\_Wi-Fi\\_on\\\"";
stringArguments = [NSMutableString stringWithFormat:@"%s", cmd.c_str()];
stringArguments = [[stringArguments stringByReplacingOccurrencesOfString:@"_" withString:@" "] mutableCopy];
arguments = [stringArguments componentsSeparatedByString:@","];
[task setArguments:arguments];
我看到以某种方式-c
参数被跳过,因为我收到以下错误:
/bin/sh: "networksetup -setwebproxystate Wi-Fi on": command not found
那是因为"networksetup -setwebproxystate Wi-Fi on"
直接执行而不是sh -c
之后的参数。
我知道我无法以最清晰的方式解释,但希望我能实现我的意思。
我试过几乎所有事情都浮现在我脑海中,但我坚持这一点。任何建议都非常感谢。
答案 0 :(得分:2)
问题在于您以惊人的方式指定命令字符串。 NSTask不需要围绕参数引用。您最终会得到包含此参数的参数:
[0] ==> -c
[1] ==> "networksetup -setwebproxystate Wi-Fi on"
请注意双引号。 为什么不使用
arguments = [NSArray arrayWithObjects:
@"-c",
@"networksetup -setwebproxystate Wi-Fi on",
nil ];
答案 1 :(得分:1)
在shell提示符下输入命令时,双引号用于将字符串作为单个参数传递,否则它将作为多个参数传递。当使用NSTask
(或exec
系列中的函数/系统调用)时,您可以单独传递每个参数,shell不需要解析命令行,因此不需要双引号。以下片段:
NSTask *task = [NSTask new];
[task setLaunchPath:@"/bin/sh"];
[task setArguments:@[@"-c", @"networksetup -setwebproxystate Wi-Fi on"]];
[task launch];
将完成您想要的任务。这两个参数使用文字数组表达式传递,每个参数只是一个字符串,可能包含空格等。
HTH