Process.run în Dart

Pornește alt program, așteaptă să se termine și returnează ce a scris (stdout, stderr) și codul de ieșire.

Sintaxă
static Future<ProcessResult> run(String executable, List<String> arguments,
    {String? workingDirectory, Map<String, String>? environment,
     bool runInShell = false, Encoding? stdoutEncoding = systemEncoding, ...})
static ProcessResult runSync(String executable, List<String> arguments, {...})

Ce face Process.run

Process.run('git', ['status']) pornește programul git cu argumentele date, așteaptă să se termine și returnează un ProcessResult cu tot textul scris de el și cu codul de ieșire. Process.runSync face același lucru, dar blochează programul Dart până la final și returnează direct rezultatul.

Argumentele se dau ca listă, fiecare separat: ['-l', 'note.txt'], nu '-l note.txt'. Programul nu este pornit printr-un shell, deci *, | sau > nu au sens special. Când ai nevoie de ele, apelezi explicit shell-ul (Process.run('sh', ['-c', 'ls | wc -l'])) sau dai runInShell: true.

workingDirectory alege directorul în care rulează programul, iar environment adaugă variabile de mediu. Dacă programul nu există, se aruncă ProcessException. Pentru programe care rulează mult timp sau cu care comunici în timp ce rulează, folosește Process.start.

Parametri

Parametru Descriere
executable Numele sau calea programului (căutat în PATH).
arguments Lista argumentelor, câte unul pe element.
workingDirectory Opțional. Directorul în care pornește programul.
environment Opțional. Variabile de mediu adăugate celor moștenite.
runInShell Opțional. Dacă este true, pornește programul prin shell (/bin/sh sau cmd.exe).

Ce returnează

Un Future<ProcessResult> (la runSync, direct ProcessResult) cu stdout, stderr, exitCode și pid.

Exemple

Exemplul 1: Rularea unei comenzi și citirea rezultatului

Exemplele de pe această pagină folosesc comenzi din macOS și Linux (echo, ls, sh).

import 'dart:io';

Future<void> main() async {
  final rezultat = await Process.run('echo', ['Bună', 'ziua,', 'Ana!']);
  print('Cod de ieșire: ${rezultat.exitCode}');
  print('A scris: ${(rezultat.stdout as String).trim()}');
}

Rezultat

Cod de ieșire: 0
A scris: Bună ziua, Ana!

Exemplul 2: runSync într-un director ales

import 'dart:io';

void main() {
  Directory('teme').createSync();
  for (final nume in ['romana.txt', 'mate.txt', 'fizica.txt']) {
    File('teme/$nume').writeAsStringSync('de făcut');
  }
  final rezultat = Process.runSync('ls', [], workingDirectory: 'teme');
  print(rezultat.stdout);
}

Rezultat

fizica.txt
mate.txt
romana.txt

Exemplul 3: Shell pentru pipe-uri și programe care lipsesc

import 'dart:io';

Future<void> main() async {
  File('elevi.txt').writeAsStringSync('Ana\nIon\nMaria\nRadu\n');
  final numar = await Process.run('sh', ['-c', 'cat elevi.txt | wc -l']);
  print('Elevi: ${(numar.stdout as String).trim()}');

  try {
    await Process.run('program_care_nu_exista', ['--ajutor']);
  } on ProcessException catch (eroare) {
    print('Nu pot porni ${eroare.executable}: ${eroare.message}');
  }
}

Rezultat

Elevi: 4
Nu pot porni program_care_nu_exista: No such file or directory

Greșeli frecvente

  • Dai toate argumentele într-un singur șir: Process.run('ls', ['-l teme']) trimite un singur argument, "-l teme", și comanda eșuează. Pune fiecare argument separat.
  • Construiești comanda pentru sh -c din text primit de la utilizator: cineva poate adăuga ; rm -rf ~. Dă datele ca argumente separate, fără shell.
  • Verifici doar că nu s-a aruncat excepție: un program care pornește, dar eșuează, returnează normal, cu exitCode diferit de 0. Verifică exitCode.

Comenzi înrudite

  • ProcessResult: Rezultatul lui Process.run: codul de ieșire și tot ce a scris programul în stdout și în stderr.
  • Process.start: Pornește un program și returnează imediat un obiect Process, prin care îi trimiți date și îi citești ieșirea în timp ce rulează.
  • Platform.environment: Platform.environment este un Map, doar pentru citire, cu variabilele de mediu ale procesului (PATH, HOME, chei de configurare).
  • exit: Oprește imediat programul cu codul de ieșire dat: 0 pentru succes, altă valoare pentru eroare.