2015-06-10 3 views
0

Я пытаюсь запустить следующую команду терминала при нажатии кнопки в моем быстром приложении, но, похоже, не могу понять синтаксис String.Проблемы с синтаксисом строки NSTask

peerflix "magentlinkhere" --vlc 

Я хочу, чтобы magnetlinkhere и --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

Во-первых, когда вы передаете целую командную строку до bash (или, как правило, sh), вам необходимо использовать опцию -c. Командная строка фактически является частью опции -c, а не аргументом как таковым. Итак, это должен быть первый элемент массива аргументов.

Насколько процитировать идет, вы можете попробовать это:

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

Однако, это опасно. Оболочка интерпретирует переданную вами командную строку. Если у него есть символы, которые оболочка считает специальными, они могут выполнять различные действия, включая выполнение команд. Котировки вокруг первого аргумента на самом деле недостаточно. Во-первых, если какая-либо из ваших переменных включает кавычки, которые будут мешать цитированию, которое вы пытаетесь сделать. С другой стороны, некоторые специальные символы (например, $) все еще интерпретируются внутри кавычек.

Вы можете попытаться улучшить цитирование и немного сократить обратную косую черту, чтобы попытаться сделать строку безопасной для интерпретации оболочки. Однако более безопасным вариантом является просто пропустить оболочку и выполнить программу напрямую и предоставить свои аргументы.

Например:

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

Единственная сложность здесь в том, что вы на самом деле нужно поставить абсолютный путь к исполняемому файлу peerflix. Вы не можете полагаться на то, что он находится на PATH или на NSTask, находящемся там. (Честно говоря, вы не можете полагаться на то, что он установлен вообще. Поэтому я предполагаю, что вы должны отправить его с помощью своего приложения или что-то в этом роде. В этом случае вы должны получить путь, посмотрев его в своем комплекте.)

+0

Спасибо за объяснение, к сожалению, когда я использую второй, я получаю 'env: node: Нет такого файла или каталога', хотя я указываю абсолютный путь (я думаю)'/usr/local/lib/node_modules/peerflix/app.js' – DanTdd

+0

Вы, вероятно, не входите в путь к этому файлу 'app.js' в оболочке. Если вы можете запустить 'peerflix' в оболочке, тогда введите' which peerflix', чтобы узнать абсолютный путь к тому, что он работает. Использование этого в вашем приложении может все еще не работать, потому что оно, похоже, зависит от команды 'node', которая находится в' PATH', но приложения GUI не получают одинаковые «PATH», как использует интерактивная оболочка. Возможно, вам придется добавить соответствующие каталоги в 'PATH', унаследованные этой задачей, установив его свойство' environment'. –

+0

Однако, если вы пытаетесь написать приложение для отправки другим пользователям, это не может зависеть от таких вещей, как Node.js или peerflix, установленные в/usr/local и т. Д. Он должен отправить их. –

Смежные вопросы