Exec - příkaz Linux - příkaz Unix

exec - vyvolání podprocesů

Synopse

exec ? přepínače ? arg ? arg ... ?

Popis

Tento příkaz zachází s jeho argumenty jako se specifikací jednoho nebo více podprocesů, které mají být provedeny. Argumenty mají formu standardního potrubí shell, kde každý arg se stává jedním slovem příkazu a každý odlišný příkaz se stává podprocesem.

Pokud počáteční argumenty začínají s - pak jsou považovány za přepínače příkazového řádku a nejsou součástí specifikace potrubí. V současné době jsou podporovány následující přepínače:

-keepnewline

Zachovává nový koncový řádek ve výstupu potrubí. Za normálních okolností bude smazán nový řádek.

-

Označuje konec přepínačů. Argument, který následuje po tomto, bude považován za první arg, i když začíná s - .

Pokud arg (nebo pár argů ) má jednu z níže popsaných formulářů, pak je používán řídícím tokem vstupů a výstupů mezi subprocesy. Tyto argumenty nebudou předány podprocesu (subprocesům). Ve formách jako `` jméno_souboru '' název_souboru může být buď v samostatném argumentu od `` <'', nebo ve stejném argumentu bez intervenčního prostoru (tj. `` FileName '').

|

Odděluje odlišné příkazy v potrubí. Standardní výstup předchozího příkazu bude přiveden do standardního vstupu dalšího příkazu.

| &

Odděluje odlišné příkazy v potrubí. Jak standardní výstup, tak standardní chyba předchozího příkazu budou pipraveny do standardního vstupu dalšího příkazu. Tato forma přesměrování přepíše podoby jako 2> a>.

< název_souboru

Soubor s názvem název_souboru se otevře a použije jako standardní vstup pro první příkaz v potrubí.

<@ souborId

FileId musí být identifikátorem otevřeného souboru, například návratovou hodnotu z předchozího volání. Používá se jako standardní vstup pro první příkaz v potrubí. FileId musí být otevřen pro čtení.

<< hodnota

Hodnota je předána prvnímu příkazu jako jeho standardní vstup.

> název_souboru

Standardní výstup z posledního příkazu je přesměrován na soubor pojmenovaný název_souboru , který přepsal jeho předchozí obsah.

2> název_souboru

Standardní chyba ze všech příkazů v potrubí je přesměrována do souboru pojmenovaného fileName , který přepsá svůj předchozí obsah.

> & název_souboru

Jak standardní výstup z posledního příkazu, tak i standardní chyba ze všech příkazů jsou přesměrovány do souboru s názvem název_souboru a přepisují jeho předchozí obsah.

>> název_souboru

Standardní výstup z posledního příkazu je přesměrován do souboru s názvem název_souboru , který se k němu připojuje a nikoliv přepisuje.

2 >> název_souboru

Standardní chyba ze všech příkazů v potrubí je přesměrována do souboru s názvem název_souboru , který se k němu připojuje a nikoli k přepisování.

>> & název_souboru

Jak standardní výstup z posledního příkazu, tak standardní chyba ze všech příkazů jsou přesměrovány do souboru s názvem název_souboru , který se k němu připojuje a nikoliv přepisuje.

> @ fileId

FileId musí být identifikátorem otevřeného souboru, například návratovou hodnotu z předchozího volání. Standardní výstup z posledního příkazu je přesměrován do souboru fileId , který musel být otevřen pro zápis.

2> @ fileId

FileId musí být identifikátorem otevřeného souboru, například návratovou hodnotu z předchozího volání. Standardní chyba ze všech příkazů v potrubí je přesměrována do souboru fileId . Soubor musí být otevřen pro psaní.

> & & fileId

FileId musí být identifikátorem otevřeného souboru, například návratovou hodnotu z předchozího volání. Standardní výstup z posledního příkazu a standardní chyba ze všech příkazů jsou přesměrovány do souboru fileId . Soubor musí být otevřen pro psaní.

Pokud standardní výstup nebyl přesměrován, pak příkaz příkaz return vrátí standardní výstup z posledního příkazu v potrubí. Pokud některý z příkazů v potrubí odchází abnormálně nebo je zabit nebo pozastaven, pak exec vrátí chybu a chybová zpráva bude obsahovat výstup potrubí následovaný chybovými zprávami popisujícími abnormální ukončení; proměnná errorCode bude obsahovat další informace o posledním abnormálním ukončení. Pokud některý z příkazů zapíše do standardního souboru chyb a standardní chyba není přesměrována, pak exec vrátí chybu; chybová zpráva bude obsahovat standardní výstup potrubí, následované zprávami o abnormálních ukončeních (pokud existují), následovaný standardním chybovým výstupem.

Pokud poslední znak výsledku nebo chybová zpráva je nový řádek, pak je tento znak normálně odstraněn z výsledku nebo chybové zprávy. To je v souladu s dalšími návratovými hodnotami Tcl, které obvykle nekončí novými řádky. Je-li zadána -keepnewline, pak zůstane zadaný nový řádek.

Pokud standardní vstup není přesměrován `` <'' nebo `` << '' nebo `` <@ '', standardní vstup pro první příkaz v potrubí je převzat z aktuálního standardního vstupu aplikace.

Pokud poslední arg je `` & '', pak bude potrubí provedeno v pozadí. V tomto případě příkaz exec vrátí seznam, jehož elementy jsou identifikátory procesu pro všechny podprocesy v potrubí. Standardní výstup z posledního příkazu v potrubí přejde na standardní výstup aplikace, pokud nebyl přesměrován, a chybový výstup ze všech příkazů v potrubí přejde do standardního souboru chyb aplikace, pokud není přesměrován.

První slovo v každém příkazu je přijato jako jméno příkazu; na něm je provedena náhrada tilde a pokud výsledek neobsahuje žádné lomítka, adresáře v proměnné prostředí PATH jsou vyhledávány spustitelným jménem. Pokud název obsahuje lomítko, musí se odkazovat na spustitelný soubor dostupný z aktuálního adresáře. Neexistuje žádná expanze typu `glob 'nebo jiné náhrady podobné shellu na argumenty k příkazům.

Problémy přenositelnosti

Windows (všechny verze)

Čtení nebo zápis do zásuvky pomocí notace `` fileId '' nefunguje. Při čtení ze soketu visí 16bitová aplikace DOS a 32bitová aplikace se okamžitě vrátí s koncem souboru. Když jeden typ aplikace zapíše do soketu, informace jsou místo toho odeslány do konzoly, pokud je přítomna, nebo je vyřazena.

Textový widget Tk konzoly neposkytuje skutečné standardní možnosti IO. Pod Tk při přesměrování ze standardního vstupu budou všem aplikacím vidět okamžitý konec souboru; informace přesměrované na standardní výstup nebo standardní chyba budou vyřazeny.

Lupy dopředu nebo dozadu jsou přijímány jako oddělovače cest pro argumenty příkazů Tcl. Při spuštění aplikace může název cesty zadaný pro aplikaci obsahovat také oddělovače směru vpřed nebo vzad. Mějte však na paměti, že většina aplikací systému Windows přijímá argumenty s lomítkem dopředu pouze jako oddělovače možností a zpětné lomítko pouze v cestách. Jakékoli argumenty pro aplikaci, která určují název cesty s lomítkem vpřed, nebudou automaticky převedeny na použití zpětného lomítka. Pokud argument obsahuje lomítka dopředu jako oddělovač cesty, může nebo nemusí být rozpoznán jako název cesty v závislosti na programu.

Při volání na 16bitovou aplikaci DOS nebo Windows 3.X musí všechny názvy cest používat krátký, tajný formát cesty (např. Pomocí `` applba ~ 1.def '' namísto `` applbakery.default '' ).

Dvě nebo více dopředu nebo dozadu v řádku v cestě odkazují na síťovou cestu. Jednoduché zřetězení kořenového adresáře c: / s podadresářem / windows / system bude mít c: // windows / system (dvě lomítka dohromady), což se týká bodu připojení nazvaného systémem v počítači nazvaném windows (a c: / ignorováno) a není ekvivalentní c: / windows / system , který popisuje adresář na aktuálním počítači. Příkaz join join by měl sloužit ke zřetězení složek cesty.

Windows NT

Při pokusu o spuštění aplikace nejprve vyhledá název podle jeho zadání. Poté jsou do příkazu .com , .exe a .bat připojeny na konec zadaného jména a vyhledá delší název. Pokud nebyl zadán název adresáře jako součást názvu aplikace, vyhledávají se následující adresáře při pokuse o nalezení aplikace:

Adresář, ze kterého byl načten Tcl spustitelný soubor.
Aktuální adresář.
Adresář 32bitového systému Windows NT.
Adresář systému Windows NT 16 bitů.
Domovský adresář systému Windows NT.
Adresáře uvedené v cestě.

Aby bylo možné provést vestavěné shell příkazy jako dir a copy , volající musí předem nastavit příkaz " cmd.exe / c " na požadovaný příkaz.

Windows 95

Při pokusu o spuštění aplikace nejprve vyhledá název podle jeho zadání. Poté jsou do příkazu .com , .exe a .bat připojeny na konec zadaného jména a vyhledá delší název. Pokud nebyl zadán název adresáře jako součást názvu aplikace, vyhledávají se následující adresáře při pokuse o nalezení aplikace:

Adresář, ze kterého byl načten Tcl spustitelný soubor.
Aktuální adresář.
Adresář systému Windows 95.
Domovský adresář systému Windows 95.
Adresáře uvedené v cestě.

Pro spuštění příkazů vestavěných do shellu, jako je dir a copy , musí volající předpřipojit command.com / c na požadovaný příkaz.

Jakmile 16bitová aplikace DOS přečte standardní vstup z konzoly a potom ukončí, všechny následně spustit 16bitové aplikace DOS uvidí standardní vstup jako již uzavřený. 32bitové aplikace nemají tento problém a budou fungovat správně i po 16bitové aplikaci DOS, která si myslí, že standardní vstup je uzavřen. V této chvíli není známo žádné řešení tohoto problému.

Přesměrování mezi zařízením NUL: a 16bitovou aplikací nefunguje vždy. Při přesměrování z NUL: Některé aplikace mohou zavěsit, jiné získají nekonečný proud `` 0x01 '' bajtů a některé skutečně správně získají okamžitý konec souboru. zdá se, že chování závisí na tom, co je kompilováno do samotné aplikace. Při přesměrování více než 4 kB nebo NUL: některé aplikace budou viset. Výše uvedené problémy se nevyskytují u 32bitových aplikací.

Všechna DOS 16bitová aplikace běží synchronně. Všechny standardní vstupy z potrubí do 16bitové aplikace DOS se shromažďují do dočasného souboru; druhý konec potrubí musí být zavřen před spuštěním aplikace 16bitové aplikace DOS. Všechny standardní výstupy nebo chyby ze 16bitové aplikace DOS na potrubí jsou shromažďovány do dočasných souborů; musí být aplikace ukončena předtím, než budou dočasné soubory přesměrovány do další fáze potrubí. To je způsobeno řešením chyby systému Windows 95 při implementaci potrubí a je to, jak standardní systém Windows 95 DOS shell zpracuje potrubí sám.

Některé aplikace, jako je command.com , by neměly být prováděny interaktivně. Aplikace, které přímo přistupují k oknu konzoly namísto čtení z jejich standardního vstupu a zápisu na standardní výstup, se mohou nezdařit, zavěsit Tcl nebo dokonce zavěsit systém, pokud jejich soukromé okno konzoly není k dispozici.

Macintosh

Příkaz exec není implementován a v systému Macintosh neexistuje.

Unix

Příkaz exec je plně funkční a pracuje tak, jak je popsáno.

Viz též

chyba (n), otevřená (n)

Klíčová slova

spustit, potrubí, přesměrování, podproces

Důležité: Použijte příkaz man ( % man ), abyste zjistili, jaký příkaz se používá v konkrétním počítači.