2016-11-06 12 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オブジェクトは、pathと引数の文字列を適切なCスタイルの文字列(fileSystemRepresentationを使用)に変換してからthに渡しますargv []を介してタスクを実行します。引数の中の文字列はシェル展開を行わないので、特別な引用をする必要はなく、$ PWDなどのシェル変数は解決されません。

しかし、自動的にそれらをエスケープし、そのエスケープされたバージョンをリテラルとしてOSに送信しているようです。デバッガは、私が手動でエスケープしているかどうかにかかわらず、エスケープされていることを示しています。 nettopがトップ、htop、またはps -fで表示される完全なコマンドラインを得ることはできませんが、状況によっては、タスク引数リストにprocNameを追加すると、通常のネットトップヘッダー以外のデータが返されません。これは、nettopが動作していることを示しています。

質問:「Google Chrome」などの単一引用符で囲まれた引数をProcess()に引数として送信するにはどうすればよいですか。おそらく

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

以上を(任意の強制unwrappingsを避ける):

答えて

1

プロセス名は任意の引用せずに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 
議論それは最初の行にコンパイルされ、実質的に私が持っていたより良いです。ありがとう! –