2016-11-06 2 views
0

Работа с Process() для создания задачи сетевого мониторинга.Задача() - ускользание котировок

Я пытаюсь отправить единственный аргумент, заданный в таблицу, для задачи (имя процесса для мониторинга). Это должно быть одинарным, поскольку оно может содержать пробелы. (См task.arguments .append (? "- р '! (PROCNAME)") ниже)

 task = Process() 
     pipe = Pipe() 
     task.launchPath = "/usr/bin/nettop" 

     task.arguments = ["-j time,interface,state,bytes_in,bytes_out","-k rx_dupe,rx_ooo,re-tx,rtt_avg,rcvsize,tx_win,tc_class,tc_mgt,cc_algo,P,C,R,W","-n","-L 0"] 
     var procName = currentSelection?.procname 
     if(procName != nil && procName != "") { 
      task.arguments?.append("-p '\(procName!)'") 
     } 
     task.standardOutput = pipe 
     task.launch() 

Согласно документации нет цитирование требуется, поскольку никакого расширения оболочки не происходит

https://developer.apple.com/reference/foundation/process/1408983-arguments

в частности

объект NSTask преобразует оба пути и строки в качестве аргументов соответствующих строк в стиле с (с использованием fileSystemRepresentation) перед передачей их го e через argv []. Строки в аргументах не претерпевают расширения оболочки, поэтому вам не нужно делать специальные кавычки, а переменные оболочки, такие как $ PWD, не разрешаются.

Однако, кажется, автоматическое ускользание от них и отправка этой экранированной версии в ОС как литерал. Отладчик показывает их как экранированные, независимо от того, удаляю их вручную или нет, поэтому здесь есть некоторое понимание их состояния. Я не могу получить полную командную строку для nettop для отображения в верхнем, htop или ps -f, но, в частности, когда я добавил имя procName в список аргументов задачи, команда не возвращает данные обратно, кроме обычных заголовков неттопов. Это показывает, что неттоп работает, его просто не нащупывает процесс обнюхивания.

Итак, вопрос в следующем: как я могу отправить один аргумент (например, «Google Chrome») в Process() в качестве аргумента?

ответ

1

Имя процесса должен быть принят в качестве единственного аргумента без каких-либо процитировать:

var procName = currentSelection?.procname 
if (procName != nil && procName != "") { 
    task.arguments?.append(contentsOf: ["-p", procName! ]) 
} 

или, возможно, лучше (во избежание каких-либо принудительных unwrappings):

var arguments = ["-j time,interface,state,bytes_in,bytes_out", ...] 
if let procName = currentSelection?.procname, !procName.isEmpty { 
    arguments += ["-p", procName ] 
} 
task.arguments = arguments 
+0

Я даже не думаю, чтобы разбить его на два аргументы. Он скомпилирован с первого раза и значительно приятнее, чем то, что у меня было. Благодаря! –

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