2016-11-06 4 views
0

프로세스()를 사용하여 네트워크 모니터링 작업을 만듭니다.작업()이 따옴표를 이스케이프 처리합니다.

작업 (모니터 할 프로세스 이름)에 작은 인용 인수를 보내려고합니다. 공백이있을 수 있으므로 작은 따옴표로 묶어야합니다. (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 개체는 path와 인수의 문자열을 적절한 C 스타일 문자열 (fileSystemRepresentation 사용)로 변환 한 다음 th로 전달합니다 argv []를 통한 작업. 인수의 문자열은 셸 확장을 거치지 않으므로 특수 인용을 할 필요가 없으며 $ PWD와 같은 셸 변수가 확인되지 않습니다.

그러나 자동으로 이스케이프 처리되고 이스케이프 처리 된 버전을 문자 그대로 OS로 전송하는 것으로 보입니다. 디버거에서는 수동으로 이스케이프 처리했는지 여부에 관계없이 이스케이프 처리 된 상태로 표시되므로 여기에 상태에 대한 인식이 있습니다. nettop이 top, htop 또는 ps -f에 표시되도록 전체 명령 줄을 가져올 수는 없지만 상황에 따라 procName을 작업 인수 목록에 추가하면 명령이 정상적인 nettop 헤더 이외의 데이터를 반환하지 않습니다. 이것은 nettop이 실행 중임을 보여 주며, 그 프로세스를 탐지하지 못하는 것입니다.

질문 : 'Google 크롬'과 같이 작은 따옴표로 묶인 인수를 프로세스()에 인수로 보내려면 어떻게해야합니까? 아마도

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

이상 (있는 강제 unwrappings을 피할 수) :

답변

1

프로세스 이름은 인용하지 않고 하나의 인자로 전달해야

+0

도 두 가지로 휴식을 생각하지 않았다

var arguments = ["-j time,interface,state,bytes_in,bytes_out", ...] if let procName = currentSelection?.procname, !procName.isEmpty { arguments += ["-p", procName ] } task.arguments = arguments 
인수. 그것은 첫 번째 컴파일에 컴파일하고 실질적으로 더 좋네. 감사! –

관련 문제