【问题标题】:Run NSTask from .command从 .command 运行 NSTask
【发布时间】:2014-12-17 04:40:12
【问题描述】:

抱歉,英语不是我的第一语言,而且我的语法能力很差。

您好,我是一名对 Objective-C 非常陌生的开发人员,我在使用 NSTask 时遇到了一些问题。我有一个要在这个可可应用程序中执行的 .command 文件,但是如果我使用 NSTask 的“打开”命令来执行该文件,它会启动终端。有没有办法像典型的 NSTask 一样只执行它而不启动它?或者我可以只拥有一个包含要执行的命令的文本文件吗?谢谢。

这是我的代码...

NSString *pathtorb = [[NSBundle mainBundle] pathForResource:@"rightSpace" ofType:@"command"];

NSTask *DfileBlankSpace = [[NSTask alloc]init];
DfileBlankSpace.launchPath = @"/usr/bin/open";
DfileBlankSpace.arguments = @[pathtorb];
[DfileBlankSpace launch];
[DfileBlankSpace waitUntilExit];

NSTask *killDock = [[NSTask alloc]init];
killDock.launchPath = @"/usr/bin/killall";
killDock.arguments = @[@"Dock"];
[killDock launch];
[killDock waitUntilExit];

【问题讨论】:

  • 您正在运行一个名为“open”的命令应用程序来打开 pathtorb 中的文件。

标签: objective-c nstask


【解决方案1】:

.command 只是一个 shell 脚本,而不是使用 open - 将这些文件与终端相关联 - 运行 sh 传递它 -c 和文件路径名作为参数:

DfileBlankSpace.launchPath = @"/bin/sh";
DfileBlankSpace.arguments = @[@"-c", pathtorb];

HTH

附录

正如 cmets 中所指出的 @KenThomases,如果您没有转义 pathorb 以使其成为有效的 bash 路径名,那么您应该省略 @"-c" 参数。这使得 shell 从文件中读取 并解析其文件名,就像在命令行上键入一样。

【讨论】:

  • 最好不要使用-c,只需将文件路径作为要运行的脚本传递。例如,该文件可能不是可执行文件或可能不是以 shebang (#!) 行开头,在这种情况下,它不是 -c 选项的正确命令。
  • 再想一想,我将把关于-c的警告升级为:你真的不能使用它。如果没有-c,该参数将被明确解释为从中读取命令的文件的路径。使用-c,参数被解释为命令,就好像它是在shell 中键入的一样。这意味着它将在空格处分解为“单词”,这可能意味着它无法运行指定的文件。它甚至可能意味着它运行不同的文件。更糟糕的是,像$ 这样的特殊字符将被解释。如果路径是/tmp/foo$(rm -rf ~)bar,则删除主目录。
  • @KenThomases - 我想过这样的事情,但是 OP 使用的是来自他们自己的包中的路径,而不是用户输入或任何被认为会使问题复杂化的东西。应用程序作者在这里不能做任何他们不能直接在应用程序中做的“棘手”事情。但是,正如您所说,省略 -c 应该可以避免这个问题,所以这是一个更好的方法。
  • 这与应用作者做一些棘手的事情无关。这是关于一场事故。例如,应用程序包可以(由用户)放置在名称中带有空格或美元符号的文件夹中。这意味着捆绑中任何项目的路径都包含在路径中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
  • 1970-01-01
  • 2012-11-26
  • 2011-10-17
相关资源
最近更新 更多