简体   繁体   English

Util.spawnCommandLine 不适用于 GNOME Shell 扩展

[英]Util.spawnCommandLine does not work on GNOME Shell extension

I'm writing an extension for GNOME Shell to check whether VPN is connected with this command:我正在为 GNOME Shell 编写一个扩展来检查 VPN 是否与此命令连接:

ifconfig -a | grep tun

This is my extension.js file:这是我的 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);
}

Tried these and none of them worked:尝试了这些,但都没有奏效:

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

What should I do to execute that command and get the result?我应该怎么做才能执行该命令并获得结果?

I guess there's a couple ways you could do this.我想有几种方法可以做到这一点。 I would generally prefer GSubprocess for my subprocess spawning, but you could use GLib.spawn_command_line_sync() too:我通常更喜欢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
}

If you really want to use grep for some reason, you could do this:如果出于某种原因你真的想使用grep ,你可以这样做:

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

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

Just remember that most of these functions will return a Uint8Array .请记住,这些函数中的大多数将返回一个Uint8Array GSubprocess on the other hand has functions that can communicate in UTF-8 with a subprocess.另一方面,GSubprocess 具有可以以 UTF-8 与子进程通信的函数。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM