我试图在我的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
有人可以帮我解决这里的格式吗?谢谢:))
答案 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
可执行文件的绝对路径。你不能依赖PATH
或NSTask
在那里找到它。 (坦率地说,你完全不能依赖它。所以,我认为你必须将它与你的app或其他东西一起发货。在这种情况下,你应该通过在你的捆绑中查找它来获得路径。)