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を避ける):
も二つにそれを破るとは思いませんでした
議論それは最初の行にコンパイルされ、実質的に私が持っていたより良いです。ありがとう! –