Я пишу простое расширение для открытия браузера, нажав кнопку расширения. Я хотел бы знать, есть ли функция, которая может выполнять переданную команду оболочки в качестве аргумента. Кроме того, было бы очень полезно, если бы кто-нибудь мог предложить хороший простой справочник по разработке расширений.
Расширения Gnome — запустить команду оболочки
Ответы (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. В частности, документация по Создание подпроцессов, в которой объясняется, почему это плохая идея в расширениях и как сделать это чуть менее плохо.
const Util = imports.misc.util; Util.spawnCommandLine("...");
- person andy.holmes; 06.02.2018
sudo
? Включите ли вы sudo
в свою команду, или Gnome будет запрашивать пароль в стиле окна?
- person Stewart; 13.10.2018
pkexec
или, может быть, gksudo
.
- person andy.holmes; 15.10.2018
communicate_utf8(stdin_buf, cancellable)
сделает всю работу за меня.
- person kartheek7895; 14.06.2020
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