Cocoa 无法将参数传递给/bin/sh
我正在为我的一个cocoa应用程序编写命令行帮助程序。这个助手工具应该使用Cocoa 无法将参数传递给/bin/sh,cocoa,shell,unix,arguments,nstask,Cocoa,Shell,Unix,Arguments,Nstask,我正在为我的一个cocoa应用程序编写命令行帮助程序。这个助手工具应该使用NSTask执行shell(/bin/sh)的实例。大家都知道,可以利用-c执行sh,您可以将一个或多个命令作为要执行的参数传递 例如,运行/bin/sh-c“网络设置-设置WebProxyState Wi-Fi开启” 执行networksetup-setwebproxystate Wi-Fi on 现在,问题是: 当我将启动路径设置为sh([task setLaunchPath:@”/bin/sh“])时,然后设置如下参
NSTask
执行shell(/bin/sh)的实例。大家都知道,可以利用-c
执行sh
,您可以将一个或多个命令作为要执行的参数传递
例如,运行/bin/sh-c“网络设置-设置WebProxyState Wi-Fi开启”
执行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:“网络设置-设置WebProxyState 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 ];
问题在于您指定命令字符串的方式非常复杂。
NSTask不需要在参数周围加引号。您将得到包含以下内容的参数:
[0] ==> -c
[1] ==> "networksetup -setwebproxystate Wi-Fi on"
请注意双引号。
为什么不直接使用
arguments = [NSArray arrayWithObjects:
@"-c",
@"networksetup -setwebproxystate Wi-Fi on",
nil ];
问题在于您指定命令字符串的方式非常复杂。
NSTask不需要在参数周围加引号。您将得到包含以下内容的参数:
[0] ==> -c
[1] ==> "networksetup -setwebproxystate Wi-Fi on"
请注意双引号。
为什么不直接使用
arguments = [NSArray arrayWithObjects:
@"-c",
@"networksetup -setwebproxystate Wi-Fi on",
nil ];
问题在于您指定命令字符串的方式非常复杂。
NSTask不需要在参数周围加引号。您将得到包含以下内容的参数:
[0] ==> -c
[1] ==> "networksetup -setwebproxystate Wi-Fi on"
请注意双引号。
为什么不直接使用
arguments = [NSArray arrayWithObjects:
@"-c",
@"networksetup -setwebproxystate Wi-Fi on",
nil ];
在shell提示下输入命令时,双引号用于将字符串作为单个参数传递,否则它将作为多个参数传递。使用NSTask
(或exec
系列中的函数/系统调用)时,您可以单独传递每个参数,shell不需要解析命令行,因此不需要双引号。以下片段:
NSTask *task = [NSTask new];
[task setLaunchPath:@"/bin/sh"];
[task setArguments:@[@"-c", @"networksetup -setwebproxystate Wi-Fi on"]];
[task launch];
我会完成你想要的任务。这两个参数是使用文字数组表达式传递的,每个参数只是一个字符串,可能包含空格等
HTH在shell提示符下输入命令时,双引号用于将字符串作为单个参数传递,否则它将作为多个参数传递。使用NSTask
(或exec
系列中的函数/系统调用)时,您可以单独传递每个参数,shell不需要解析命令行,因此不需要双引号。以下片段:
NSTask *task = [NSTask new];
[task setLaunchPath:@"/bin/sh"];
[task setArguments:@[@"-c", @"networksetup -setwebproxystate Wi-Fi on"]];
[task launch];
我会完成你想要的任务。这两个参数是使用文字数组表达式传递的,每个参数只是一个字符串,可能包含空格等
HTH在shell提示符下输入命令时,双引号用于将字符串作为单个参数传递,否则它将作为多个参数传递。使用NSTask
(或exec
系列中的函数/系统调用)时,您可以单独传递每个参数,shell不需要解析命令行,因此不需要双引号。以下片段:
NSTask *task = [NSTask new];
[task setLaunchPath:@"/bin/sh"];
[task setArguments:@[@"-c", @"networksetup -setwebproxystate Wi-Fi on"]];
[task launch];
我会完成你想要的任务。这两个参数是使用文字数组表达式传递的,每个参数只是一个字符串,可能包含空格等
HTH在shell提示符下输入命令时,双引号用于将字符串作为单个参数传递,否则它将作为多个参数传递。使用NSTask
(或exec
系列中的函数/系统调用)时,您可以单独传递每个参数,shell不需要解析命令行,因此不需要双引号。以下片段:
NSTask *task = [NSTask new];
[task setLaunchPath:@"/bin/sh"];
[task setArguments:@[@"-c", @"networksetup -setwebproxystate Wi-Fi on"]];
[task launch];
我会完成你想要的任务。这两个参数是使用文字数组表达式传递的,每个参数只是一个字符串,可能包含空格等
HTH不需要双引号,sh-c不需要双引号。我第一次在参数中传递“
时遇到了很多问题,因为当我像\”
一样传递它时,它被忽略了,但是在解决它之前传递另一个\`
,现在我正在处理这个问题!试着用sh-c
执行命令,你会注意到我说的话。(例如,您可以组合像'sh-c“firstCommand&&secondCommand”这样的命令,因此必须存在引号);)顺便说一下,我之所以这样写cmd=…
,是因为,cmd
是从cin>
接收的值设置的,所以传递参数不像听起来那么容易:DNo,Unkn0wn,'sh-c'本身不需要双引号。您正在输入它的命令行处理器会执行此操作。“sh-c”需要的是一个参数,它是要解析和执行的整个命令。如果该命令需要自己的引号,则可以。我不明白你为什么需要这么多反斜杠-我怀疑你可能把日志机制显示的内容与变量中的实际内容混淆了…NSTask
不需要双引号,sh-c
需要双引号。我第一次在参数中传递“
时遇到了很多问题,因为当我像\”
一样传递它时,它被忽略了,但是在解决它之前传递另一个\`
,现在我正在处理这个问题!尝试使用sh执行命令