Exec - comandă Linux - comandă Unix

exec - Invocarea subproceselor

Rezumat

exec ? comutatoare ? arg ? arg ... ?

Descriere

Această comandă tratează argumentele sale ca specificație a uneia sau mai multor subprocese de executat. Argumentele iau forma unei conducte standard, în care fiecare arg devine un cuvânt al unei comenzi și fiecare comandă distinctă devine o subproces.

Dacă argumentele inițiale pentru execuție încep cu - atunci acestea sunt tratate ca comutatoare de linie de comandă și nu fac parte din specificația conductei. Următoarele comutatoare sunt acceptate în prezent:

-keepnewline

Păstrează o nouă linie trasată în ieșirea conductei. În mod normal, o linie nouă va fi ștearsă.

-

Marchează sfârșitul comutatoarelor. Argumentul următor va fi tratat ca primul arg, chiar dacă acesta începe cu un - .

Dacă un arg (sau o pereche de arg ) are una din formele descrise mai jos, atunci acesta este utilizat de exec pentru a controla fluxul de intrare și ieșire între subprocesele. Astfel de argumente nu vor fi transmise subproceselor. În fișiere precum `` < fileName '' fileName poate fi fie într-un argument separat de la `` <'', fie în același argument, fără spațiu care intervine (adică `` < fileName '').

|

Separă comenzile distincte din conductă. Ieșirea standard a comenzii precedente va fi introdusă în intrarea standard a următoarei comenzi.

| &

Separă comenzile distincte din conductă. Atât outputul standard, cât și eroarea standard a comenzii precedente vor fi introduse în intrarea standard a următoarei comenzi. Această formă de redirecționare înlocuiește forme precum 2> și>.

< fileName

Fișierul numit fileName este deschis și utilizat ca intrare standard pentru prima comandă din conductă.

<@ fileId

FileId trebuie să fie identificatorul unui fișier deschis, cum ar fi valoarea returnată dintr-un apel anterior pentru a fi deschis . Se utilizează ca intrare standard pentru prima comandă din conductă. FileId trebuie să fi fost deschis pentru citire.

<< valoare

Valoarea este trecută la prima comandă ca intrare standard.

> numele fișierului

Eșantionul standard din ultima comandă este redirecționat către fișierul numit fileName , suprascriind conținutul său anterior.

2> numele fișierului

Eroare standard din toate comenzile din conductă este redirecționată către fișierul namedNameName , suprascriind conținutul anterior.

> & fileName

Ambele ieșiri standard din ultima comandă și eroarea standard din toate comenzile sunt redirecționate către fișierul numit fileName , suprascriind conținutul său anterior.

>> fileName

Ieșirea standard din ultima comandă este redirecționată către fișierul namedNameName , adăugându-se la acesta, în loc să o suprascrie.

2 >> fileName

Eroarea standard din toate comenzile din conductă este redirecționată către fișierul namedNameName , adăugându-se la acesta, în loc să o suprascrie.

>> & fileName

Ambele ieșiri standard de la ultima comandă și eroarea standard din toate comenzile sunt redirecționate către fișierul numit fileName , adăugându-se la acesta, mai degrabă decât suprascriindu-l.

> @ fileId

FileId trebuie să fie identificatorul unui fișier deschis, cum ar fi valoarea returnată dintr-un apel anterior pentru a fi deschis . Ieșirea standard din ultima comandă este redirecționată către fișierul fileId , care trebuie să fi fost deschis pentru scriere.

2> @ fileId

FileId trebuie să fie identificatorul unui fișier deschis, cum ar fi valoarea returnată dintr-un apel anterior pentru a fi deschis . Eroarea standard din toate comenzile din conductă este redirecționată către fișierul fileId . Fișierul trebuie să fi fost deschis pentru scriere.

> & @ fileId

FileId trebuie să fie identificatorul unui fișier deschis, cum ar fi valoarea returnată dintr-un apel anterior pentru a fi deschis . Atât ieșirea standard din ultima comandă cât și eroarea standard din toate comenzile sunt redirecționate către fișierul fileId . Fișierul trebuie să fi fost deschis pentru scriere.

Dacă ieșirea standard nu a fost redirecționată, atunci comanda exec întoarce ieșirea standard din ultima comandă din conductă. Dacă oricare dintre comenzile din conducte ieșesc anormal sau sunt ucise sau suspendate, atunci exec va returna o eroare și mesajul de eroare va include ieșirea conductei urmată de mesaje de eroare care descriu terminările anormale; variabila errorCode va conține informații suplimentare despre ultima terminare anormală întâlnită. Dacă oricare dintre comenzi scrie la fișierul de eroare standard și eroarea standard nu este redirecționată, exec va întoarce o eroare; mesajul de eroare va include ieșirea standard a conductei, urmată de mesaje despre terminalele anormale (dacă există), urmată de ieșirea standard a erorii.

Dacă ultimul caracter al rezultatului sau al mesajului de eroare este o linie nouă, atunci acel caracter este în mod normal șters din rezultatul mesajului de eroare. Acest lucru este în concordanță cu alte valori de întoarcere Tcl, care în mod normal nu se termină cu linii noi. Cu toate acestea, dacă este specificată -keepnewline, atunci linia nouă este reținută.

Dacă intrarea standard nu este redirecționată cu `` <'' sau `` '' sau `` <@ '' atunci intrarea standard pentru prima comandă din conductă este luată din intrarea standard curentă a aplicației.

Dacă ultimul arg este `` & '', atunci conducta va fi executată în fundal. În acest caz, comanda exec va returna o listă a cărei elemente sunt identificatorii de proces pentru toate subprocesele din conductă. Ieșirea standard din ultima comandă din conductă va merge la ieșirea standard a aplicației dacă nu a fost redirecționată, iar ieșirea de eroare de la toate comenzile din conductă va ajunge la fișierul de eroare standard al aplicației dacă nu este redirecționat.

Primul cuvânt din fiecare comandă este luat ca nume de comandă; substituția tilde se efectuează pe ea și dacă rezultatul nu conține slăburi atunci directoarele din variabila de mediu PATH sunt căutate pentru un executabil de numele dat. Dacă numele conține o slash, atunci trebuie să se refere la un executabil accesibil din directorul curent. Nu se efectuează nici o extensie globală sau alte substituții asemănătoare cu shell-urile pe argumentele comenzilor.

Probleme legate de portabilitate

Windows (toate versiunile)

Citirea de la sau scrierea într-un soclu, folosind notația `` @ fileId '', nu funcționează. Când citiți de la un soclu, o aplicație DOS pe 16 biți se va agăța și o aplicație pe 32 de biți se va întoarce imediat cu sfârșitul fișierului. Când un tip de aplicație scrie într-o socket, informațiile sunt trimise în consola, dacă este prezentă sau este aruncată.

Widget-ul de text pentru consola Tk nu oferă capabilități reale standard IO. Sub Tk, atunci când se redirecționează de la intrarea standard, toate aplicațiile vor vedea un sfârșit de fișier imediat; informațiile redirecționate la ieșirea standard sau la eroarea standard vor fi ignorate.

Fie slash-urile înainte sau înapoi sunt acceptate ca separatoare de cale pentru argumentele comenzilor Tcl. Atunci când executați o aplicație, numele căii specificat pentru aplicație poate conține, de asemenea, tăieturi înainte sau înapoi ca separatoare de traseu. Rețineți, totuși, că majoritatea aplicațiilor Windows acceptă argumente cu limite de avans doar ca delimitatoare de opțiuni și backslash-uri numai în căi. Orice argumente pentru o aplicație care specifică un nume de cale cu slash-uri înainte nu vor fi convertite automat pentru a utiliza caracterul invers. Dacă un argument conține slăbiciuni înainte ca separator de cale, acesta poate sau nu să fie recunoscut ca un nume de cale, în funcție de program.

În plus, atunci când apelați o aplicație DOS pe 16 biți sau o aplicație Windows 3.X, toate denumirile de căi trebuie să utilizeze formatul cale scurtă, criptică (de exemplu, folosind `` applba ~ 1.def '' în loc de `` applbakery.default '' ).

Două sau mai multe tălpi înainte sau înapoi într-un rând într-o cale se referă la o cale de rețea. De exemplu, o simplă concatenare a directorului rădăcină c: / cu un subdirector / windows / system va genera c: // windows / system (două tăișuri împreună), care se referă la punctul de montare numit sistem pe mașină numit ferestre (și c: / este ignorat) și nu este echivalent cu c: / windows / system , care descrie un director pe computerul curent. Comanda de îmbinare a fișierelor ar trebui folosită pentru a concatena componentele căii.

Windows NT

Atunci când încercați să executați o aplicație, exec execută mai întâi căutarea pentru numele așa cum a fost specificat. Apoi, în ordine, .com , .exe și .bat sunt atașate la sfârșitul numelui specificat și caută numele mai lung. Dacă un nume de director nu a fost specificat ca parte a numelui aplicației, următoarele directoare sunt căutate automat în ordine când încercați să localizați aplicația:

Directorul din care a fost încărcat executabilul Tcl.
Directorul curent.
Directorul de sistem pe 32 de biți Windows NT.
Directorul sistem Windows NT pe 16 biți.
Directorul de domiciliu Windows NT.
Directoarele afișate în cale.

Pentru a executa comenzile shell builtin cum ar fi dir și copy , apelantul trebuie să predea " cmd.exe / c " la comanda dorită.

Windows 95

Atunci când încercați să executați o aplicație, exec execută mai întâi căutarea pentru numele așa cum a fost specificat. Apoi, în ordine, .com , .exe și .bat sunt atașate la sfârșitul numelui specificat și caută numele mai lung. Dacă un nume de director nu a fost specificat ca parte a numelui aplicației, următoarele directoare sunt căutate automat în ordine când încercați să localizați aplicația:

Directorul din care a fost încărcat executabilul Tcl.
Directorul curent.
Directorul de sistem Windows 95.
Directorul de domiciliu Windows 95.
Directoarele afișate în cale.

Pentru a executa comenzile shell builtin cum ar fi dir și copy , apelantul trebuie să predea " command.com / c " la comanda dorită.

Odată ce o aplicație DOS pe 16 biți a citit o intrare standard de la o consolă și apoi a ieșit, toate ulterior, aplicațiile DOS de 16 biți vor vedea intrarea standard ca fiind deja închisă. Aplicațiile pe 32 de biți nu au această problemă și vor funcționa corect, chiar și după ce o aplicație DOS pe 16 biți consideră că intrarea standard este închisă. Nu există nici o soluție cunoscută pentru acest bug în acest moment.

Redirecționarea între dispozitivul NUL: și o aplicație pe 16 biți nu funcționează întotdeauna. Când se redirecționează de la NUL: unele aplicații pot să se blocheze, altele vor primi un flux infinit de octeți `` 0x01 '', iar unele vor primi, de fapt, un sfârșit de fișier imediat; comportamentul pare să depindă de ceva compilat în aplicația în sine. Când redirecționați mai mult de 4K sau mai mult la NUL: unele aplicații se vor închide. Problemele de mai sus nu se întâmplă în cazul aplicațiilor pe 32 de biți.

Toate aplicațiile DOS pe 16 biți sunt executate în mod sincron. Toate intrările standard de la o țeavă la o aplicație DOS de 16 biți sunt colectate într-un fișier temporar; celălalt capăt al țevii trebuie închis înainte ca aplicația DOS pe 16 biți să înceapă să execute. Orice ieșire standard sau eroare de la o aplicație DOS de 16 biți la o țeavă este colectată în fișiere temporare; aplicația trebuie să se termine înainte ca fișierele temporare să fie redirecționate către următoarea etapă a conductei. Acest lucru se datorează unei soluții de rezolvare a unei erori Windows 95 în implementarea țevilor și este modul în care cofrajele standard Windows 95 DOS se ocupă chiar de conductele.

Anumite aplicații, cum ar fi command.com , nu ar trebui să fie executate interactiv. Aplicațiile care accesează direct fereastra consolei, în loc să citească de la intrarea și scrierea lor standard la ieșirea lor standard, pot să nu reușească, să blocheze Tcl sau chiar să blocheze sistemul dacă fereastra consolei lor private nu le este disponibilă.

Macintosh

Comanda exec nu este implementată și nu există sub Macintosh.

Unix

Comanda exec este pe deplin funcțională și funcționează așa cum este descris.

Vezi si

eroare (n), deschisă (n)

Cuvinte cheie

execuție, conducte, redirecționare, subproces

Important: Utilizați comanda om ( % man ) pentru a vedea cum se utilizează o comandă pe computerul dvs. particular.