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

CMake安装阶段执行Python脚本修改GNOME全局快捷键失败:Gio.Settings在root环境下行为异常

CMake安装阶段执行Python脚本修改GNOME全局快捷键失败:Gio.Settings在root环境下行为异常

我有一个CMake项目,希望在install目标执行时自动运行Python脚本,为安装后的程序配置全局键盘快捷键。

脚本在终端直接运行时完全正常,但当我将其添加到install目标中(代码如下),却突然执行失败:

install(
  CODE
  "execute_process(
    COMMAND  /usr/bin/python3 \"${CMAKE_SOURCE_DIR}/tools/enable-shutdown-menu-keybind.py\" --command \"${CMAKE_INSTALL_FULL_BINDIR}/shutdown_menu\"
    RESULT_VARIABLE _ENABLE_SHUTDOWN_MENU_KEYBIND_RESULT
  )
  if (_ENABLE_SHUTDOWN_MENU_KEYBIND_RESULT GREATER 0)
    message(FATAL_ERROR \"Enabling shutdown-menu keybinds failed with exit code ${_ENABLE_SHUTDOWN_MENU_KEYBIND_RESULT}\")
  endif()"
  CONFIGURATIONS Release RelWithDebInfo MinSizeRel
)

具体来看,失败发生在从org.gnome.settings-daemon.plugins.media-keys获取自定义快捷键列表的环节——对应终端中gsettings get org.gnome.settings-daemon.plugins.media-keys custom-keybindings的操作。

我不认为这是高权限运行CMake导致的问题,因为在终端用sudo直接运行脚本也能正常工作。

我已经尝试过的方案:

  • 将命令改为:/usr/bin/bash -c \"/usr/bin/python3 '${CMAKE_SOURCE_DIR}/tools/enable-shutdown-menu-keybind.py' --command '${CMAKE_INSTALL_FULL_BINDIR}/shutdown_menu'\"
  • 在命令前添加环境变量配置:env GNOME_SHELL_SESSION_MODE='$ENV{GNOME_SHELL_SESSION_MODE}'(已确认该变量能正确传递)

编辑1

我刚想到一个新的测试思路:临时将CMAKE_INSTALL_PREFIX设置为我自己拥有权限的目录,无需高权限运行cmake install,结果脚本完美执行成功了。

这说明问题确实和以root身份运行CMake有关。补充一下,我是通过pkexec来提升CMake权限的。

编辑2

我之前关于sudo的结论有误——用sudo在终端运行脚本同样会失败。不过在VSCode的启动配置中设置"sudo": true来运行脚本,却能正常工作。

编辑3

我把install函数调用扩展为以下形式:

install(
  CODE
  "if (DEFINED ENV{PKEXEC_UID})
    set(UID $ENV{PKEXEC_UID})
  elseif(DEFINED ENV{SUDO_UID})
    set(UID $ENV{SUDO_UID})
  else()
    message(FATAL_ERROR \"Unable to determine callee UID.\")
  endif()
  execute_process(
    COMMAND sudo -H -u \"#${UID}\" env DISPLAY=$ENV{DISPLAY} /usr/bin/python3 \"${CMAKE_SOURCE_DIR}/tools/enable-shutdown-menu-keybind.py\" --command \"${CMAKE_INSTALL_FULL_BINDIR}/shutdown_menu\"
    RESULT_VARIABLE _ENABLE_SHUTDOWN_MENU_KEYBIND_RESULT
  )
  if (_ENABLE_SHUTDOWN_MENU_KEYBIND_RESULT GREATER 0)
    message(FATAL_ERROR \"Enabling shutdown-menu keybinds failed with exit code ${_ENABLE_SHUTDOWN_MENU_KEYBIND_RESULT}\")
  endif()"
)

现在脚本会执行并提示已完成快捷键设置,但实际修改并未生效——快捷键既没有出现在dconf、GNOME设置中心,也无法通过gsettings查询到。


备注:内容来源于stack exchange,提问作者Nummer_42O

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 10:48:01