【发布时间】:2017-04-11 22:41:38
【问题描述】:
我正在编写一个简单的扩展来通过单击扩展按钮打开浏览器。我想知道是否有一个函数可以执行传递的 shell 命令作为参数。此外,如果任何人都可以为扩展开发提供一个很好的简单参考,那将非常有帮助。
【问题讨论】:
-
你在寻找类似this的东西
标签: javascript shell gnome gnome-shell-extensions gjs
我正在编写一个简单的扩展来通过单击扩展按钮打开浏览器。我想知道是否有一个函数可以执行传递的 shell 命令作为参数。此外,如果任何人都可以为扩展开发提供一个很好的简单参考,那将非常有帮助。
【问题讨论】:
标签: javascript shell gnome gnome-shell-extensions gjs
来自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 存储库添加书签即可。
一些快速链接:
我无法强调阅读 gnome-shell 源代码会给您带来多少好处。不幸的是,它现在被编译成一个资源文件,所以我们没有本地副本可以偶然发现。
更新(2021 年)
如果您正在阅读本文,请参阅gjs.guide 上提供的文档。特别是 Spawning Subprocesses 上的文档,其中介绍了为什么这是扩展中的一个坏主意以及如何做到这一点稍微不那么糟糕。
【讨论】:
const Util = imports.misc.util; Util.spawnCommandLine("...");
sudo怎么办?您是否在命令中包含sudo,或者 Gnome 会要求密码窗口样式?
pkexec 或gksudo。
如果您对结果不感兴趣 - 即当您想打开浏览器窗口时 - 您可以像这样使用 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
【讨论】: