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
execFileun șablon de shell ("ls *.txt"): fără shell,*nu este extins. Foloseștefs.globpentru tipare. - Pe Windows încerci
execFile("npm", ...):npmeste un fișier.cmd, care nu poate rula fără shell. Acolo foloseșteexecsauspawncushell: 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.