Spuštění příkazu systému a předání dat


Funkce system()

Funkce system vykoná příkaz uvedený v závorkách. Příkaz bude zpracován pomocí shellu /bin/sh, v unixu se pro každý shell zakládá vlastní proces. Parametrem může být cokoli, co je možné zadat shellu /bin/sh ke zpracování. Příklad:
system("ls");
system("ls > x.txt") && die "nelze vytvorit soubor x.txt";
$adr = system("ls > x.txt");

První příkaz vypíše na standardní výstup obsah adresáře,
druhý příkaz zapíše obsah adresáře do souboru x.txt,
třetí příkaz zapíše obsah adresáře do souboru x.txt a do proměnné $adr uloží výsledkový kód příkazu (0 pokud příkaz proběhl úspěšně).
Všimněte si, že standardní výstup zdědí proces zpracovávající příkaz ls z perlového scriptu.

Více příkazů v parametru se oddělí středníkem nebo znakem pro konec řádku. Např:

system("ls > x.txt; cat x.txt; who");
Funkce system() může mít také více parametrů , které se uvání oddělené čárkou. První parametr je interpretován jako příkaz a tedy spuštěn. Další parametry jsou interpretovány jako parametry spuštěného příkazu. Příklad:
system "cat","x.txt","a.txt";
Provede příkaz cat, kterému jako parametry předá soubor x.txt a a.txt.


Zpětné apostrofy

Další způsob jak spustit proces k vykonání nějakého příkazu je umístit příkazovou řádku shellu /bin/sh do zpětných apostrofů. Příklad:
$datum = "dnes je ".`date`;
$uz = "seznam uzivatelu\n".`who`;
print $datum;
print $uz;
Toto spuštění příkazu vrací hodnotu ve tvaru řetězce, který je potřeba uložit do proměnné, neposílá nic na standardní výstup. Použijeme-li toto volání v kontextu pole (např. spolu s funkcí foreach) vrací víceřádkový výsledek příkazu jako seznam řetězců (řádek). Příklad:
foreach $rad (`who`) {
$rad =~ /(\S+)\s+(\S+)\s+(.*)/;
print "kdo $1 kde $2 kdy $3\n";
} 


Spuštění příkazu pomocí log. jména

Funkce open je běžně používaná k otevření vstupního nebo výstupního souboru. Pokud jméno souboru začíná znakem "|", je jméno souboru interpretováno jako příkaz operačního systému, kterému má být vstup předán. Pokud jméno končí znakem "|", je jméno souboru interpretováno jako příkaz, který předává vstup.

Příklad:
Obsah adresáře můžeme předat k dalšímu zpracování příkazem:

open(ADR,"ls |") || die "chyba\n";

kde: ls je příkaz unixu pro výpis adresáře, příkaz die vypíše na standardní výstup uvedenou zprávu, pokud není možné provést open.

E-mail můžeme ze scriptu výhodně poslat např.

open(ZPRAVA,"| mailx Zprava $adr);

kde: mailx je unixový program pro e-mail, Zprava je subject mailu a $adr je proměnná obsahující adresáta.


Cvičení


Příklad č.7:
Uložte první věty ze všech textových souborů, jejichž jméno začíná písmenem a do souboru prvety.txt. Větu opište i na obrazovku. Pokud existuje soubor, jehož jméno začíná na a, který není textový, vypište o tom zprávu na obrazovku. Jedno z řešení příkladu.


Další kapitola | Předchozí kapitola | Obsah