child_process.execFile în Node.js

Sistem, procese și fire Node.js 0.1.91; execFileSync din 0.12

Rulează direct un program cu argumente separate, fără shell, și primește ieșirea la final. Varianta sigură a lui exec.

Sintaxă
import { execFile, execFileSync } from "node:child_process";
execFile(fișier, [argumente], [opțiuni], (eroare, stdout, stderr) => { ... })

Ce face child_process.execFile

execFile este între exec și spawn: pornește programul direct, fără shell (ca spawn), dar strânge toată ieșirea și ți-o dă la final (ca exec). Fiindcă argumentele sunt trimise ca tablou, caracterele speciale (;, $, spații) nu sunt interpretate: este alegerea sigură când argumentele vin de la utilizator.

Fără shell nu ai pipe-uri, * sau &&. Cu util.promisify(execFile) primești o promisiune care se rezolvă cu { stdout, stderr } sau este respinsă cu o eroare care are code (codul de ieșire), stdout și stderr.

Parametri

Parametru Descriere
fișier Programul de rulat.
argumente Tablou de șiruri.
opțiuni Ca la exec: cwd, env, timeout, maxBuffer, encoding.

Ce returnează

Un obiect ChildProcess; execFileSync întoarce ieșirea.

Exemple

Exemplul 1: Argumente care ar păcăli un shell

Numele fișierului conține ; și spații. Cu execFile ajunge întreg la program, ca un singur argument.

import { execFile } from "node:child_process";
import { promisify } from "node:util";
import { writeFileSync } from "node:fs";

const execFileAsync = promisify(execFile);
const nume = "note; rm -rf ~.txt";
writeFileSync(nume, "Ana 10\nIon 9\n");

const { stdout } = await execFileAsync("wc", ["-l", nume]);
console.log(stdout.trim());

Rezultat

2 note; rm -rf ~.txt

Exemplul 2: Cod de ieșire diferit de zero

import { execFile } from "node:child_process";
import { promisify } from "node:util";

const execFileAsync = promisify(execFile);

try {
  await execFileAsync(process.execPath, ["-e", "console.log('lucrez'); process.exit(2)"]);
} catch (eroare) {
  console.log("cod:", eroare.code, "| stdout:", eroare.stdout.trim());
}

Rezultat

cod: 2 | stdout: lucrez

Greșeli frecvente

  • Dai lui execFile un șablon de shell ("ls *.txt"): fără shell, * nu este extins. Folosește fs.glob pentru tipare.
  • Pe Windows încerci execFile("npm", ...): npm este un fișier .cmd, care nu poate rula fără shell. Acolo folosește exec sau spawn cu shell: true, cu argumente fixe.

Comenzi înrudite

  • child_process.exec: Rulează o comandă în shell (ca în terminal) și primește la final tot textul afișat de ea.
  • child_process.spawn: Pornește un program ca proces copil și citește ieșirea lui pe măsură ce apare (stream), fără shell.
  • util.promisify: Transformă o funcție cu callback în stil Node.js (eroare, rezultat) într-o funcție care întoarce o promisiune.