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

时间:2014-03-09 22:29:07

标签: cocoa shell unix arguments nstask

我正在为我的一个可可应用程序编写命令行助手。这个帮助工具应该使用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之后的参数。

我知道我无法以最清晰的方式解释,但希望我能实现我的意思。

我试过几乎所有事情都浮现在我脑海中,但我坚持这一点。任何建议都非常感谢。

2 个答案:

答案 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