2016-11-06 41 views
0

使用Process()創建網絡監視任務。任務()正在轉義報價

我想發送一個單引號的參數任務(進程名稱監視)。這需要單引號,因爲它可以有空格。 (見task.arguments .append(? 「 - P '!(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對象傳遞他們TH之前兩個路徑和參數適當的C風格的字符串(使用fileSystemRepresentation)字符串轉換e任務通過argv []。參數中的字符串不會進行外殼擴展,因此您不需要執行特殊引號,並且不會解析shell變量(例如$ PWD)。

但是,它似乎在自動轉義它們並將該轉義版本作爲文字發送到操作系統。調試器將它們顯示爲已轉義,無論我是否手動將其轉義,以便在此處瞭解其狀態。我無法得到一個完整的命令行,讓nettop顯示在top,htop或ps -f中,但是,當我將procName添加到任務參數列表時,該命令沒有獲得任何數據,除了正常的nettop標題。這表明nettop正在運行,它只是沒有找到它的過程嗅探。

所以,問題是:如何將單引號參數(如'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

甚至沒有想到把它分成兩個參數。它在第一時間編譯並且比我所擁有的要好得多。謝謝! –