Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 无法将参数传递给/bin/sh_Cocoa_Shell_Unix_Arguments_Nstask - Fatal编程技术网

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

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“])时,然后设置如下参

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