首页 > 解决方案 > Gio.Subprocess 中的多个参数

问题描述

我目前正在开发我的第一个 gnome-shell-extension。在扩展中,我想执行一个简单的 shell 命令并在之后使用输出,为此我使用 Gio.Subprocess 就像在这个 wiki 中使用的一样:https ://wiki.gnome.org/AndyHolmes/Sandbox/SpawningProcesses

目前,我有一个带有一些参数的参数:“ProgramXYZ -a -bc”,我将其作为参数向量 argv 作为 ['ProgramXYZ','-a','-bc'] 传递。这种情况下工作正常。

因此,假设我想调用两个程序并将输出与您的方法结合起来,例如:“ProgramXYZ -a -bc && ProgramB”。我当前的输出在普通终端中是正确的,但我不确定如何将其传递给 Gio.Subprocess。['ProgramXYZ','-a','-bc','&&','ProgramB'] 之类的东西不起作用,有没有办法实现这一点,还是我必须单独拨打两个电话?

标签: javascriptlinuxgnome-shell-extensions

解决方案


抱歉,我还没有完成该页面(这就是它在我的沙箱中的原因)。

这是我们用于运行子进程的 Promise 包装器:

function execCommand(argv, input = null, cancellable = null) {
    let flags = Gio.SubprocessFlags.STDOUT_PIPE;

    if (input !== null)
        flags |= Gio.SubprocessFlags.STDIN_PIPE;

    let proc = new Gio.Subprocess({
        argv: argv,
        flags: flags
    });
    proc.init(cancellable);

    return new Promise((resolve, reject) => {
        proc.communicate_utf8_async(input, cancellable, (proc, res) => {
            try {
                resolve(proc.communicate_utf8_finish(res)[1]);
            } catch (e) {
                reject(e);
            }
        });
    });
}

现在你有两个合理的选择,因为你有一个很好的包装器。

我自己更喜欢这个选项,因为如果我正在启动顺序进程,我可能想知道哪个失败了,错误是什么等等。我真的不会担心额外的开销,因为第二个进程只有在第一个进程成功时才会执行,此时第一个进程将被垃圾收集。

async function dualCall() {
    try {
        let stdout1 = await execCommand(['ProgramXYZ', '-a', '-bc']);
        let stdout2 = await execCommand(['ProgramB']);
    } catch (e) {
        logError(e);
    }
}

另一方面,如果你真的想做 shell 的话,没有什么能阻止你启动子 shell。不过,最终您只是将相同的行为卸载到 shell:

async function shellCall() {
    try {
        let stdout = await execCommand([
            '/bin/sh',
            '-c',
            'ProgramXYZ -a -bc && ProgramB'
        ]);
    } catch (e) {
        logError(e);
    }
}

推荐阅读