Util.spawnCommandLine在GNOME Shell扩展上不起作用

问题描述 投票:0回答:1

我正在为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);
}

尝试过这些,但没有一个起作用:

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();

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

javascript linux gnome gnome-shell-extensions
1个回答
0
投票

我想您可以通过几种方法来做到这一点。通常,我更喜欢GSubprocess作为我的子进程生成,但是您也可以使用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 } 。另一方面,GSubprocess具有可以在UTF-8中与子流程进行通信的功能。

© www.soinside.com 2019 - 2024. All rights reserved.