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 -cdin 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
exitCodediferit 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.