我正在为我的一个 cocoa 应用程序编写一个命令行助手。该辅助工具应该使用 NSTask
执行 shell 实例 (/bin/sh )。众所周知,可以利用 -c
来执行 sh
,您可以传递一个或多个命令作为要执行的参数。
例如运行 /bin/sh -c "networksetup -setwebproxystate Wi-Fi on"
在 Wi-Fi 上执行networksetup -setwebproxystate
。
现在,问题是:
当我将启动路径设置为 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 打开”:找不到命令
这是因为 "networksetup -setwebproxystate Wi-Fi on"
是直接执行的,而不是作为 sh -c
之后的参数。
我知道我无法以最清晰的方式解释,但希望我能表达我的意思。
我几乎尝试了所有想到的事情,但我坚持这个。任何建议都非常感激。
最佳答案
问题在于您指定命令字符串的方式极其复杂。 NSTask 不需要在参数周围加上引号。您最终会得到包含以下内容的参数:
[0] ==> -c
[1] ==> "networksetup -setwebproxystate Wi-Fi on"
注意双引号。 为什么不直接使用
arguments = [NSArray arrayWithObjects:
@"-c",
@"networksetup -setwebproxystate Wi-Fi on",
nil ];
关于cocoa - 无法将参数传递给/bin/sh,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22289057/