我正在编写一个简单的扩展,通过单击扩展按钮来打开浏览器。我想知道是否有一个函数可以执行传递的 shell 命令作为参数。此外,如果有人能为扩展开发提出一个很好的简单参考,那将非常有帮助。
来自 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 存储库添加书签即可。
一些快速链接:
- 弹出菜单.js:使用弹出菜单
- 面板.js:实现"托盘"图标的好读物
- modalDialog.js:一些UI元素被重用,runDialog.js例如使用它
- mpris.js:在 GJS 中使用 DBus 等框架也有很好的例子
我怎么强调都不为过,你会从阅读侏儒外壳源代码中得到多少。不幸的是,它现在已编译为资源文件,因此我们没有本地副本可以偶然发现。
更新 (2021)
如果您正在阅读本文,请参阅gjs.guide上提供的文档。特别是关于生成子进程的文档,它涵盖了为什么这在扩展中是一个坏主意以及如何做一些稍微不那么糟糕的事情。
如果您对结果不感兴趣 - 即当您想打开浏览器窗口时 - 您可以使用这样的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