如何向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"数组参数的写法有误,寻求解决方法。
解决方法
错误原因
- 中文引号导致UTF-8解析失败:命令中空字符串用了中文引号
“”,而非英文引号"",GLib无法识别为合法UTF-8字符串,直接触发参数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
相关产品推荐
相关产品推荐

