You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向gdbus传递'as'类型参数?CrosDisks Mount调用报错求助

问题描述

需要调用DBus上的org.chromium.CrosDisks.Mount方法,相关XML定义如下:

<method name="Mount">
  <annotation name="org.chromium.DBus.Method.Kind" value="simple" />
  <arg name="path" type="s" direction="in" />
  <arg name="filesystem_type" type="s" direction="in" />
  <arg name="options" type="as" direction="in" />
</method>

通过dbus-monitor捕获到的正确调用示例:

method call time=1675906347.661521 sender=:1.31 -> destination=org.chromium.CrosDisks serial=4557 path=/org/chromium/CrosDisks; interface=org.chromium.CrosDisks; member=Mount
   string "/sys/devices/pci0000:00/0000:00:14.0/usb3/3-2/3-2:1.0/host1/target1:0:0/1:0:0:0/block/sdb/sdb1"
   string ""
   array [
      string "rw"
      string "mountlabel=MY-STORAGE"
   ]

尝试的gdbus调用命令:

gdbus call --system --dest org.chromium.CrosDisks --object-path /org/chromium/CrosDisks --method org.chromium.CrosDisks.Mount "/sys/devices/pci0000:00/0000:00:14.0/usb3/3-2/3-2:1.0/host1/target1:0:0/1:0:0:0/block/sdb/sdb1" “” [“rw” "mountlabel=MY-STORAGE"]

执行后报错:

(gdbus call:12863): GLib-CRITICAL **: 23:37:56.454: g_variant_new_string: assertion 'g_utf8_validate (string, -1, NULL)' failed
[Invalid UTF-8] Error parsing parameter 2: expected value:
  \xe2\x80
  ^ 

(gdbus call:12863): GLib-CRITICAL **: 23:37:56.455: g_error_free: assertion 'error != NULL' failed

怀疑是type="as"数组参数的写法有误,寻求解决方法。

解决方法

错误原因

  1. 中文引号导致UTF-8解析失败:命令中空字符串用了中文引号“”,而非英文引号"",GLib无法识别为合法UTF-8字符串,直接触发参数2解析错误。
  2. 数组参数格式不符合GLib Variant规范:gdbus要求as类型(字符串数组)必须以['元素1', '元素2']或["元素1", "元素2"]的格式编写,原命令中的数组缺少逗号分隔符,且引号使用混乱。

正确调用命令

将中文引号替换为英文引号,数组参数按规范编写,同时为避免shell解析冲突,建议用单引号包裹数组部分:

gdbus call --system --dest org.chromium.CrosDisks --object-path /org/chromium/CrosDisks --method org.chromium.CrosDisks.Mount "/sys/devices/pci0000:00/0000:00:14.0/usb3/3-2/3-2:1.0/host1/target1:0:0/1:0:0:0/block/sdb/sdb1" "" "['rw', 'mountlabel=MY-STORAGE']"

若使用双引号包裹数组,需转义内部的双引号:

gdbus call --system --dest org.chromium.CrosDisks --object-path /org/chromium/CrosDisks --method org.chromium.CrosDisks.Mount "/sys/devices/pci0000:00/0000:00:14.0/usb3/3-2/3-2:1.0/host1/target1:0:0/1:0:0:0/block/sdb/sdb1" "" "[\"rw\", \"mountlabel=MY-STORAGE\"]"

注意事项

  • 所有字符串参数必须使用英文引号,禁止使用中文引号。
  • as类型数组需用方括号包裹,元素间用逗号分隔,每个元素单独加引号。
  • 数组参数整体用单引号包裹时,内部无需额外转义,是更简便的写法。

内容的提问来源于stack exchange,提问作者S-K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 05:05:20