es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Nodo: crear un comando y imprimir los resultados en un archivo.

Si quiero listar los archivos de un directorio y guardar los resultados en un archivo “res.txt”, puedo ejecutar el comando:

ls -l > res.txt

Ahora quisiera hacer lo mismo en un proceso que se inicie desde el proceso principal de Node.

He intentado en forma ingenua esto:

spawn(
  'ls',
  ['-l', '>', 'res.txt'],
);

pero no funciona. ¿Existe alguna forma de lograr lo que quiero?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de lograr esto. El problema con el código anterior es que la redirección > es una característica del shell, la cual no está disponible cuando se utiliza spawn() directamente. En su lugar, puedes crear el descriptor de archivo tú mismo y pasarlo como una opción a la función spawn().

    Aquí tienes un ejemplo:

    const fs = require('fs');
    const { spawn } = require('child_process');
    
    const child = spawn('ls', ['-l'], {
      stdio: ['ignore', fs.openSync('res.txt', 'w'), 'pipe'],
    });
    
    child.stdout.pipe(process.stdout);
    

    En este código, creamos un nuevo descriptor de archivo para el archivo res.txt usando fs.openSync() y lo pasamos como el segundo elemento en el array stdio. Esto le indica a spawn() que redireccione la salida del proceso hijo al descriptor de archivo en lugar del pipe por defecto.

    También establecemos el primer elemento en stdio como 'ignore' para descartar la entrada estándar del proceso hijo, ya que no la necesitamos.

    Finalmente, redireccionamos la salida estándar del proceso hijo a la salida estándar del proceso padre para poder ver la salida.

    Con estos cambios, el código anterior debería crear un archivo res.txt en el directorio actual que contiene la salida de ls -l.

Comments are closed.