cocoa - 无法将参数传递给/bin/sh

标签 cocoa shell unix arguments nstask

我正在为我的一个 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/

相关文章:

objective-c - Objective C 访问公共(public)方法

ios - 如何将 Array<String> 转换为充满 NSString 的 NSArray

linux - shell 脚本 : how to group rows according to the first field/element in each row

c++ - 将 FILETIME 转换为可移植时间单位

C 网络编程错误,因为\n

cocoa - 打印问题: Setting Paper feed

objective-c - 在 Xcode 5 中禁用基本本地化后找不到 MainMenu.xib

shell - if [ -n "${TEMP_FILE_LIST}"] 中的 -n 有何作用?

linux - 在 Linux 中一个接一个地调度作业

c - 为什么 `struct sockaddr` 包含地址族字段?