gpt4 book ai didi

swift - Task() 正在转义引号

转载 作者:搜寻专家 更新时间:2023-11-01 07:18:30 24 4
gpt4 key购买 nike

使用 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()

根据文档,不需要引用,因为没有发生 shell 扩展

https://developer.apple.com/reference/foundation/process/1408983-arguments

特别是

NSTask 对象将路径和参数中的字符串转换为适当的 C 风格字符串(使用 fileSystemRepresentation),然后通过 argv[] 将它们传递给任务。 arguments 中的字符串不进行 shell 扩展,因此不需要进行特殊引用,并且不解析 shell 变量,例如 $PWD。

但是,它似乎是自动转义它们并将转义后的版本作为文字发送给操作系统。调试器将它们显示为已转义,无论我是否手动转义它们,以便在这里了解它们的状态。我无法让 nettop 的完整命令行显示在 top、htop 或 ps -f 中,但间接地,当我将 procName 添加到任务参数列表时,除了正常的 nettop header 之外,该命令没有返回任何数据。这表明 nettop 正在运行,只是没有找到要嗅探的进程。

因此,问题是:如何将单引号参数(如“Google Chrome”)作为参数发送到 Process()?

最佳答案

进程名称必须作为单个参数传递,不带任何引号:

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

或者更好(避免任何强制展开):

var arguments = ["-j time,interface,state,bytes_in,bytes_out", ...]
if let procName = currentSelection?.procname, !procName.isEmpty {
arguments += ["-p", procName ]
}
task.arguments = arguments

关于swift - Task() 正在转义引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40447775/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com