Util.spawnCommandLine 不适用于 GNOME Shell 扩展

Util.spawnCommandLine does not work on GNOME Shell extension

我正在为 GNOME 写一个扩展 Shell 以检查 VPN 是否与此命令连接:

ifconfig -a | grep tun

这是我的 extension.js 文件:

const St = imports.gi.St;
const Main = imports.ui.main;
const Mainloop = imports.mainloop;

let panelOutput, panelOutputText, timeout;

function panelOutputGenerator(){

    // I want to execute this command here and get the result:
    // 'ifconfig -a | grep tun'
    let commandResult = 'string of result that terminal is returned';       

    let connectionStatus = (commandResult!='')? 'VPN is Enabled' : 'Normal';

    panelOutputText.set_text(connectionStatus);

    return true;
}

function init(){

    panelOutput = new St.Bin({
        style_class: 'panel-button',
        reactive: true,
        can_focus: false,
        x_fill: true,
        y_fill: false,
        track_hover: false
    });
    panelOutputText = new St.Label({
        text: 'Normal',
        style_class: 'iceLabel'
    });
    panelOutput.set_child(panelOutputText);
}

function enable(){

    Main.panel._rightBox.insert_child_at_index(panelOutput,0);
    timeout = Mainloop.timeout_add_seconds(1.0,panelOutputGenerator);
}

function disable() {

    Mainloop.source_remove(timeout);
    Main.panel._rightBox.remove_child(panelOutput);
}

尝试了这些并且 none 成功了:

const Util = imports.misc.util;
let commandResult = Util.spawn(['/bin/bash', '-c', "ifconfig -a | grep tun"]);
const Util = imports.misc.util;
let commandResult = Util.spawnCommandLine('ifconfig -a | grep tun');
const GLib = imports.gi.GLib;
let [res, out] = GLib.spawn_sync(null,['ifconfig','-a','|','grep','tun'],null,null,null);
et commandResult = res.toString();

我应该怎么做才能执行该命令并获得结果?

我想有几种方法可以做到这一点。我通常更喜欢 GSubprocess 作为我的子进程生成,但你也可以使用 GLib.spawn_command_line_sync()

const ByteArray = imports.byteArray;
const GLib = imports.gi.GLib;

let [ok, out, err, exit] = GLib.spawn_command_line_sync('ifconfig -a');

if (ByteArray.toString(out).includes('tun')) {
    // Do stuff
}

如果出于某种原因你真的想使用 grep,你可以这样做:

let [ok, out, err, exit] = GLib.spawn_command_line_sync('/bin/bash -c "ifconfig -a | grep"');

if (out.length > 0) {
    // Do stuff
}

请记住,这些函数中的大多数都会 return 一个 Uint8Array。另一方面,GSubprocess 具有可以使用 UTF-8 与子进程进行通信的功能。