NSTask字符串语法问题

时间:2015-06-10 03:24:18

标签: macos swift

我试图在我的swift应用程序中按下按钮时运行以下终端命令,但似乎无法弄清楚String语法。

peerflix "magentlinkhere" --vlc

我想要磁链接,而-vlc是我可以输入NSTask的变量。

我目前拥有的功能是:

var videoPlayer = "vlc"
var torrentS = "magnetlinkhere"

func openVideo() {
    let openApp = NSTask()
    openV.launchPath = "/bin/bash"
    openV.arguments = ["peerflix "\("torrentS.stringValue")\" --"\(videoPlyer)"]
    openV.launch()
}

此代码应在终端

中执行以下操作
peerflix "magnetlinkhere" --vlc

有人可以帮我解决这里的格式吗?谢谢:))

1 个答案:

答案 0 :(得分:1)

首先,当您将整个命令字符串传递给bash(或更典型地,sh)时,您需要使用-c选项。命令字符串实际上是-c选项的一部分,而不是参数。所以,这应该是你的参数数组的第一个元素。

就引用而言,你可以试试这个:

openApp.arguments = ["-c", "peerflix \"\(torrentS)\" --\(videoPlayer)"]

然而,这很危险。 shell将解释您传递的命令字符串。如果它具有shell认为特殊的字符,它可能会执行各种操作,包括运行命令。在第一个参数周围加上引号是不够的。首先,如果您的任何一个变量包含引号,那么这将干扰您尝试执行的引用。另一方面,某些特殊字符(例如$)仍然在引号内解释。

您可以尝试改进引用并进行一些反斜杠转义,以尝试使字符串对shell解释安全。但是,更安全的选择是跳过shell并直接执行程序并提供其参数。

例如:

let task = NSTask()
task.launchPath = "peerflix" // actually need the absolute path here
task.arguments = [torrentS, "--\(videoPlayer)"]
task.launch()

唯一的复杂因素是您实际需要提供peerflix可执行文件的绝对路径。你不能依赖PATHNSTask在那里找到它。 (坦率地说,你完全不能依赖它。所以,我认为你必须将它与你的app或其他东西一起发货。在这种情况下,你应该通过在你的捆绑中查找它来获得路径。)