【问题标题】:Gnome Extensions - Run shell commandGnome 扩展 - 运行 shell 命令
【发布时间】:2017-04-11 22:41:38
【问题描述】:

我正在编写一个简单的扩展来通过单击扩展按钮打开浏览器。我想知道是否有一个函数可以执行传递的 shell 命令作为参数。此外,如果任何人都可以为扩展开发提供一个很好的简单参考,那将非常有帮助。

【问题讨论】:

  • 你在寻找类似this的东西

标签: javascript shell gnome gnome-shell-extensions gjs


【解决方案1】:

来自https://github.com/GNOME/gnome-shell/blob/master/js/misc/util.js:

// Runs @command_line in the background, handling any errors that
// occur when trying to parse or start the program.
function spawnCommandLine(command_line) {
    try {
        let [success, argv] = GLib.shell_parse_argv(command_line);
        trySpawn(argv);
    } catch (err) {
        _handleSpawnError(command_line, err);
    }
}

该方法有一些变化。为自己省去很多麻烦,只需为 GitHub 存储库添加书签即可。

一些快速链接:

  • popupMenu.js: 使用弹出菜单
  • panel.js:实现“托盘”图标的好读物
  • modalDialog.js: 一些 UI 元素是为了复用而设计的,runDialog.js 以这个为例
  • mpris.js:也有在gjs中使用DBus等框架的好例子

我无法强调阅读 gnome-shell 源代码会给您带来多少好处。不幸的是,它现在被编译成一个资源文件,所以我们没有本地副本可以偶然发现。

更新(2021 年)

如果您正在阅读本文,请参阅gjs.guide 上提供的文档。特别是 Spawning Subprocesses 上的文档,其中介绍了为什么这是扩展中的一个坏主意以及如何做到这一点稍微不那么糟糕。

【讨论】:

  • 我错过了在我的扩展程序中使用这些功能而无需复制和粘贴的方法。有吗?
  • 您只需将它们作为模块导入,然后实例化或子类化类并调用函数:const Util = imports.misc.util; Util.spawnCommandLine("...");
  • 命令需要sudo怎么办?您是否在命令中包含sudo,或者 Gnome 会要求密码窗口样式?
  • 如果不是 GUI 程序本身可以请求权限,您应该首先检查这是否是一个好主意,因为您的用户可能没有对结果的反馈。但如果您确定这是个好主意,您可能不得不使用pkexec 或gksudo。
  • @kartheek7895 改用 Gio.Subprocess:andyholmes.github.io/articles/…
【解决方案2】:

如果您对结果不感兴趣 - 即当您想打开浏览器窗口时 - 您可以像这样使用 GLib.spawn_command_line_async:

const GLib = imports.gi.GLib;
...
(this._menuEntries[i]).connect('activate', () => {
       GLib.spawn_command_line_async('firefox http://example.com?p='+ my_params[i]);
});

如果您需要同步结果,请阅读https://gjs.guide/guides/gio/subprocesses.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-01
    • 2019-11-03
    • 2021-12-24
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    相关资源
    最近更新 更多