我正在为我的一个可可应用程序编写一个命令行助手。这个辅助工具应该使用NSTask执行一个外壳实例( /bin/sh )。众所周知,可以利用-c来执行sh,您可以将一个或多个命令作为要执行的参数进行传递。
例如,运行/bin/sh -c "networksetup -setwebproxystate Wi-Fi on"
执行networksetup -setwebproxystate Wi-Fi on。
现在,问题来了:
当我将启动路径设置为sh ( [task setLaunchPath:@"/bin/sh"] ),然后将参数设置如下:
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之后的参数。
我知道我不能以最清晰的方式解释,但希望我能表达我的意思。
我尝试了几乎所有的想法,但我被困住了。任何建议都是非常感谢的。
发布于 2014-03-10 07:36:03
问题出在您指定命令字符串时令人惊叹的复杂方式。NSTask不需要用引号将参数括起来。您最终会得到包含以下内容的参数:
[0] ==> -c
[1] ==> "networksetup -setwebproxystate Wi-Fi on"请注意其中的双引号。为什么不直接使用
arguments = [NSArray arrayWithObjects:
@"-c",
@"networksetup -setwebproxystate Wi-Fi on",
nil ];发布于 2014-03-10 08:28:57
在shell提示符下输入命令时,使用双引号将字符串作为单个参数传递,否则字符串将作为多个参数传递。在使用NSTask (或exec系列中的函数/系统调用)时,您可以单独传递每个参数,shell不需要解析命令行,因此不需要使用双引号。以下片段:
NSTask *task = [NSTask new];
[task setLaunchPath:@"/bin/sh"];
[task setArguments:@[@"-c", @"networksetup -setwebproxystate Wi-Fi on"]];
[task launch];将会完成你想要的任务。这两个参数是使用文字数组表达式传递的,每个参数只是一个字符串,可以包含空格等。
HTH
https://stackoverflow.com/questions/22289057
复制相似问题