dbus-send 和 bash 语法中 uint32:0 的含义

dbus-send 和 bash 语法中 uint32:0 的含义
dbus-send --system --print-reply           \
   --dest=org.freedesktop.DBus             \
   /org/freedesktop/DBus                   \
   org.freedesktop.DBus.StartServiceByName \
   string:org.freedesktop.login1 uint32:0  \
   2>&1 > /dev/null

我看到这个dbus命令用于启动已登录

问题:

  1. 为什么dbus 发送有这个词吗uint32:0?它有什么作用? :0 是什么意思?
  2. 应该2>&1 > /dev/null重写为1> /dev/null给定前者的目的是只显示错误消息?

答案1

从手册页(D-Bus 1.14.6):

NAME
       dbus-send - Send a message to a message bus

SYNOPSIS
       dbus-send [--system | --session | --bus=ADDRESS | --peer=ADDRESS] [--sender=NAME] [--dest=NAME] [--print-reply [=literal]] [--reply-timeout=MSEC]
                 [--type=TYPE] OBJECT_PATH INTERFACE.MEMBER [CONTENTS...]

所以分解你的命令:

  • --system:使用系统总线(而不是会话总线)
  • --dest=org.freedesktop.DBus:发送到已注册该名称的总线上的服务org.freedesktop.DBus
  • /org/freedesktop/DBus( OBJECT_PATH):在服务中将 DBus 消息定向到何处
  • org.freedesktop.DBus.StartServiceByName( INTERFACE.MEMBER):StartServiceByName从接口调用该函数org.freedesktop.DBus
  • string:org.freedesktop.login1uint32:0[CONTENTS...]

再次从手册页:

[The message contents] are given as type-specified values and may include containers (arrays, dicts, and variants) as described below.

   <contents>   ::= <item> | <container> [ <item> | <container>...]
   <item>       ::= <type>:<value>
   <container>  ::= <array> | <dict> | <variant>
   <array>      ::= array:<type>:<value>[,<value>...]
   <dict>       ::= dict:<type>:<type>:<key>,<value>[,<key>,<value>...]
   <variant>    ::= variant:<type>:<value>
   <type>       ::= string | int16 | uint16 | int32 | uint32 | int64 | uint64 | double | byte | boolean | objpath

所以两者的形式都是<item><type>:<value>具体来说:

  • string:org.freedesktop.login1: 字符串"org.freedesktop.login1"
  • uint32:0:32 位无符号整数0

现在要了解这些含义,您应该参考StartServiceByName 上的 freedesktop 规范

尝试作为显式请求启动与名称关联的可执行文件(服务激活)。这是依赖自动启动的替代方案。有关如何激活服​​务以及自动启动和显式激活之间的区别的更多信息,请参阅“消息总线启动服务(激活)”部分。

它还详细说明了论点:

消息参数:

争论 类型 描述
0 细绳 要启动的服务名称
1 UINT32 标志(目前未使用)

所以这个dbus-send命令是请求启动服务login1uint32:0意味着没有设置标志,但目前没有定义标志,所以它没有任何意义。

至于2>&1 > /dev/null,简短的回答是它不能被&> /dev/null重写1> /dev/null。它指定将 stderr 重定向到与 stdout ( ) 相同的流,2>&1并将 stdout 重定向到/dev/null( ,与)> /dev/null相同,因此1>/dev/null两个流都被丢弃。有关重定向的更多信息,您可能应该查看bash 中的重定向,有关重定向的 bash 手册页。

相关内容