En este artículo, veremos cómo puede ejecutar un archivo por lotes con entrada y obtener un archivo de salida en Node.js. Un archivo por lotes es un archivo de secuencia de comandos que almacena el comando que se ejecutará en un orden en serie.
Node.js es de naturaleza asíncrona, no espera a que el archivo por lotes finalice su ejecución. En cambio, llama a funciones que definen cuándo se ejecuta el archivo por lotes y, por lo tanto, intenta imprimir los datos incluso cuando aún no los recupera.
Solución: La solución es usar un módulo de Node.js llamado Child Process. Child Process contiene un método ‘spawn’ que genera el proceso secundario de forma asincrónica, sin bloquear Node.js.
Veamos el proceso completo paso a paso.
Paso 1: Cree una carpeta, dentro de esta carpeta cree el archivo app.js, el archivo input.txt y el archivo bash.sh. Dentro del archivo input.txt y el archivo bash.sh, escriba el código que se proporciona a continuación.
entrada.txt
Hello Geeks!
bash.sh
#!/bin/bash input=`cat -` echo "Input: $input"
Paso 2: Ubique esta carpeta en la terminal y escriba el comando
npm init -y
Inicializa nuestra aplicación node.js.
Paso 3: Instale los módulos Child Process dentro del proyecto usando el siguiente comando
node install child_process
Paso 4: dentro del archivo ‘app.js’ , requiere el módulo Child Process y crea una constante ‘bash_run’ para ejecutar el archivo bash.
const childProcess = require("child_process"); const bash_run = childProcess.spawn( '/bin/bash',["test.sh"],{env: process.env});
Paso 5 : Ahora, usemos el método ‘stdout’ para imprimir el resultado y ‘stderr’ para imprimir el error.
bash_run.stdout.on('data', function (data) { console.log('stdout: ' + data); }); bash_run.stderr.on('data', function (data) { console.log('stderr: ' + data); });
Paso 6: Ahora, use el Módulo del sistema de archivos para crear un flujo de lectura y escritura para los archivos de entrada y salida, respectivamente. Después de eso, enviaremos el resultado obtenido del archivo de texto de entrada al archivo de texto de salida utilizando el método bash_run que creamos anteriormente.
const fs = require("fs"); const input = fs.createReadStream("input.txt"); const output = fs.createWriteStream("output.txt"); bash_run.stdout.pipe(output); input.pipe(bash_run.stdin);
Código completo:
app.js
const childProcess = require("child_process"); const bash_run = childProcess.spawn('/bin/bash', ["bash.sh"], { env: process.env }); bash_run.stdout.on('data', function (data) { console.log('stdout: ' + data); }); bash_run.stderr.on('data', function (data) { console.log('stderr: ' + data); }); const fs = require("fs"); const output = fs.createWriteStream("output.txt"); const input = fs.createReadStream("input.txt"); bash_run.stdout.pipe(output); input.pipe(bash_run.stdin);
Paso para ejecutar la aplicación: Abra la terminal y escriba el siguiente comando.
node app.js
Producción: