2016-11-06 69 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

甚至没有想到把它分成两个参数。它在第一时间编译并且比我所拥有的要好得多。谢谢! –