Necesitaba ejecutar comandos de shell y mantener vivo el proceso para mantener los cambios realizados en las variables env, así que hice una función que se ve así:
import { spawn } from 'child_process'; function exec(command) { const bash = spawn('/bin/bash', { detached: true }); bash.stdout.setEncoding('utf-8'); bash.stderr.setEncoding('utf-8'); return new Promise(resolve => { const result = { stdout: '', stderr: '', code: 0 }; bash.stdout.on('data', data => { // Removes the last line break (ie \n) from the data. result.stdout += data.substring(0, data.length - 1); // Gets the code by getting the number before the `:` on the last line result.code = Number(result.stdout.split('\n').pop().split(':')[0]); resolve(result); }); bash.stderr.on('data', err => { result.stderr += err; resolve(result); }); // Writes the passed command and another to check the code of the command bash.stdin.write(command + `; echo "$?:${ command }"\n`); }); }La prueba es sencilla:
it('should run a command that outputs an error', async () => { // Notice the typo in `echoo` const res = await exec('echoo test'); expect(res.code).toBe(127); }); Al ejecutar esta prueba, a veces falla y el res.code es 0 en lugar de 127 .
Cuando se prueba sin bromas, funciona perfectamente el 100% del tiempo.