首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法将参数传递给/bin/sh

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

Stack Overflow用户
提问于 2014-03-10 06:29:07
回答 2查看 568关注 0票数 0

我正在为我的一个可可应用程序编写一个命令行助手。这个辅助工具应该使用NSTask执行一个外壳实例( /bin/sh )。众所周知,可以利用-c来执行sh,您可以将一个或多个命令作为要执行的参数进行传递。

例如,运行/bin/sh -c "networksetup -setwebproxystate Wi-Fi on"

执行networksetup -setwebproxystate Wi-Fi on

现在,问题来了:

当我将启动路径设置为sh ( [task setLaunchPath:@"/bin/sh"] ),然后将参数设置如下:

代码语言:javascript
复制
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之后的参数。

我知道我不能以最清晰的方式解释,但希望我能表达我的意思。

我尝试了几乎所有的想法,但我被困住了。任何建议都是非常感谢的。

EN

回答 2

Stack Overflow用户

发布于 2014-03-10 07:36:03

问题出在您指定命令字符串时令人惊叹的复杂方式。NSTask不需要用引号将参数括起来。您最终会得到包含以下内容的参数:

代码语言:javascript
复制
[0] ==> -c

[1] ==> "networksetup -setwebproxystate Wi-Fi on"

请注意其中的双引号。为什么不直接使用

代码语言:javascript
复制
 arguments = [NSArray arrayWithObjects:
    @"-c",
    @"networksetup -setwebproxystate Wi-Fi on",
    nil ];
票数 2
EN

Stack Overflow用户

发布于 2014-03-10 08:28:57

在shell提示符下输入命令时,使用双引号将字符串作为单个参数传递,否则字符串将作为多个参数传递。在使用NSTask (或exec系列中的函数/系统调用)时,您可以单独传递每个参数,shell不需要解析命令行,因此不需要使用双引号。以下片段:

代码语言:javascript
复制
NSTask *task = [NSTask new];

[task setLaunchPath:@"/bin/sh"];

[task setArguments:@[@"-c", @"networksetup -setwebproxystate Wi-Fi on"]];

[task launch];

将会完成你想要的任务。这两个参数是使用文字数组表达式传递的,每个参数只是一个字符串,可以包含空格等。

HTH

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22289057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档