Расширения Gnome — запустить команду оболочки

Я пишу простое расширение для открытия браузера, нажав кнопку расширения. Я хотел бы знать, есть ли функция, которая может выполнять переданную команду оболочки в качестве аргумента. Кроме того, было бы очень полезно, если бы кто-нибудь мог предложить хороший простой справочник по разработке расширений.


person Sam Fischer    schedule 11.04.2017    source источник
comment
Вы ищете что-то вроде этого?   -  person Venkat Ramana    schedule 12.04.2017


Ответы (2)


Из 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: некоторые элементы пользовательского интерфейса были сделано для повторного использования, например, runDialog.js использует это
  • mpris.js: есть также хорошие примеры использования фреймворков вроде DBus в gjs

Я не могу не подчеркнуть, сколько вы получите от чтения исходного кода gnome-shell. К сожалению, сейчас он скомпилирован в файл ресурсов, поэтому у нас нет локальных копий, на которые можно было бы наткнуться.

ОБНОВЛЕНИЕ (2021 г.)

Если вы читаете это, посмотрите документацию, доступную на gjs.guide. В частности, документация по Создание подпроцессов, в которой объясняется, почему это плохая идея в расширениях и как сделать это чуть менее плохо.

person andy.holmes    schedule 14.06.2017
comment
Мне не хватает способа использовать эти функции в моем расширении без копирования и вставки. Есть ли? - person raphinesse; 06.02.2018
comment
Вы просто импортируете их как модули, затем создаете экземпляры или подклассы классов и вызываете функции: const Util = imports.misc.util; Util.spawnCommandLine("..."); - person andy.holmes; 06.02.2018
comment
Что делать, если команда требует sudo? Включите ли вы sudo в свою команду, или Gnome будет запрашивать пароль в стиле окна? - person Stewart; 13.10.2018
comment
Если это не программа с графическим интерфейсом, которая может сама запрашивать разрешения, вы должны сначала проверить, является ли это хорошей идеей, поскольку ваш пользователь может не получить отзыв о результатах. Но если вы уверены, что это хорошая идея, вам, вероятно, придется использовать pkexec или, может быть, gksudo. - person andy.holmes; 15.10.2018
comment
@ andy.holmes есть идеи, как получить вывод созданной нами команды bash? - person kartheek7895; 13.06.2020
comment
@kartheek7895 Вместо этого используйте Gio.Subprocess: andyholmes.github. ио/статьи/ - person andy.holmes; 13.06.2020
comment
Это именно то, что я искал, communicate_utf8(stdin_buf, cancellable) сделает всю работу за меня. - person kartheek7895; 14.06.2020
comment
Я думаю, вам следует добавить информацию об использовании (импорт + вызов функций Utils) в ответ, так как не очевидно, что эти функции следует просто импортировать, не читая комментарии. - person Didier L; 11.05.2021

Если вас не интересует результат, то есть когда вы хотите открыть окно браузера, вы можете просто использовать 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

person Rainer Feike    schedule 10.07.2021