首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Gio.Subprocess中的多个参数

Gio.Subprocess中的多个参数
EN

Stack Overflow用户
提问于 2020-04-11 03:20:27
回答 1查看 148关注 0票数 1

我目前正在开发我的第一个gnome-shell-extension。在这个扩展中,我想执行一个简单的外壳命令,然后使用输出,对于这个命令,我使用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”这样的东西不能工作,有没有办法做到这一点,或者我必须进行两个单独的调用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-11 08:37:34

对不起,我还没有完成那个页面(这就是为什么它在我的沙箱?中)。

下面是运行子流程的Promise包装器:

代码语言:javascript
复制
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);
            }
        });
    });
}

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

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

代码语言:javascript
复制
async function dualCall() {
    try {
        let stdout1 = await execCommand(['ProgramXYZ', '-a', '-bc']);
        let stdout2 = await execCommand(['ProgramB']);
    } catch (e) {
        logError(e);
    }
}

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

代码语言:javascript
复制
async function shellCall() {
    try {
        let stdout = await execCommand([
            '/bin/sh',
            '-c',
            'ProgramXYZ -a -bc && ProgramB'
        ]);
    } catch (e) {
        logError(e);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61147229

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档