Во-первых, когда вы передаете целую командную строку до 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
, находящемся там. (Честно говоря, вы не можете полагаться на то, что он установлен вообще. Поэтому я предполагаю, что вы должны отправить его с помощью своего приложения или что-то в этом роде. В этом случае вы должны получить путь, посмотрев его в своем комплекте.)
Спасибо за объяснение, к сожалению, когда я использую второй, я получаю 'env: node: Нет такого файла или каталога', хотя я указываю абсолютный путь (я думаю)'/usr/local/lib/node_modules/peerflix/app.js' – DanTdd
Вы, вероятно, не входите в путь к этому файлу 'app.js' в оболочке. Если вы можете запустить 'peerflix' в оболочке, тогда введите' which peerflix', чтобы узнать абсолютный путь к тому, что он работает. Использование этого в вашем приложении может все еще не работать, потому что оно, похоже, зависит от команды 'node', которая находится в' PATH', но приложения GUI не получают одинаковые «PATH», как использует интерактивная оболочка. Возможно, вам придется добавить соответствующие каталоги в 'PATH', унаследованные этой задачей, установив его свойство' environment'. –
Однако, если вы пытаетесь написать приложение для отправки другим пользователям, это не может зависеть от таких вещей, как Node.js или peerflix, установленные в/usr/local и т. Д. Он должен отправить их. –