Извините, мне не удалось завершить sh эту страницу (вот почему она находится в моей песочнице ?).
Вот наша оболочка 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);
}
}
С другой стороны, ничто не мешает вы от запуска суб-оболочки, если вы действительно хотите делать оболочку. В конечном итоге вы просто переносите такое же поведение в оболочку, однако:
async function shellCall() {
try {
let stdout = await execCommand([
'/bin/sh',
'-c',
'ProgramXYZ -a -bc && ProgramB'
]);
} catch (e) {
logError(e);
}
}