C2110 Operační systém UNIX a základy programování U09: Přesměrování a proudy -1C2110 Operační systém UNIX a základy programování Petr Kulhánek kulhanek@chemi.muni.cz Národní centrum pro výzkum biomolekul, Přírodovědecká fakulta Masarykova univerzita, Kamenice 5, CZ-62500 Brno U09: Přesměrování a roury PS/2022 Prezenční forma výuky: Rev5 C2110 Operační systém UNIX a základy programování U09: Přesměrování a proudy -2Proudy, přesměrování, roury C2110 Operační systém UNIX a základy programování U09: Přesměrování a proudy -3Komunikace procesu s okolím Proces Proces může komunikovat s okolím celou řadou způsobů: • GUI (Graphical User Interface = použitím příslušného API) • signály, sdílená paměť, MPI (Message Passing Interface), atd. • standardní proudy Jednou z možností je načítaní vstupních dat ze standardního vstupního proudu, výpis výstupních dat do standardního výstupního či chybového proudu. C2110 Operační systém UNIX a základy programování U09: Přesměrování a proudy -4Standardní proudy process (příkaz, program)standardní vstupní proud (klávesnice) standardní výstupní proud (obrazovka terminálu) standardní chybový proud (obrazovka terminálu) Vstupně-výstupní proudy slouží procesu ke komunikaci se svým okolím. Každý proces otevírá tři standardní proudy: C2110 Operační systém UNIX a základy programování U09: Přesměrování a proudy -5- Přesměrování process (příkaz, program)standardní vstupní proud (klávesnice) standardní výstupní proud (obrazovka terminálu) standardní chybový proud (obrazovka terminálu) Vstupně-výstupní proudy lze přesměrovat tak, aby používaly soubory místo klávesnice či obrazovky. C2110 Operační systém UNIX a základy programování U09: Přesměrování a proudy -6Přesměrování a ukončení vstupu Přesměrování standardního vstupu programu my_command ze souboru input.txt. $ my_command < input.txt Přesměrování standardního vstupu programu my_command ze souboru skriptu. ....... ./my_command << EOF prvni radka textu druha radka textu treti radka textu EOF ...... značka určující konec vstupu (volí uživatel) konec vstupu, značku nesmí obklopovat mezery text, který tvoří načítaný vstup Tento způsob přesměrování je obzvláště výhodné používat ve skriptech, nicméně funguje i v příkazové řádce. Výhodou je expanze proměnných v načítaném textu. Terminál (užitečné klávesové zkratky): Ctrl+D zavře vstupní proud spuštěného procesu C2110 Operační systém UNIX a základy programování U09: Přesměrování a proudy -7Přesměrování výstupu Přesměrování standardního výstupu programu my_command do souboru output.txt. (Soubor output.txt je vytvořen. Pokud již existuje, je jeho původní obsah smazán.) $ my_command > output.txt Přesměrování standardního výstupu programu my_command do souboru output.txt. (Soubor output.txt je vytvořen. Pokud již existuje, je výstup programu my_command připojen na jeho konec.) $ my_command >> output.txt Podobná pravidla platí pro standardní chybový výstup, v tomto případě se používají následující operátory: $ my_command 2> errors.txt $ my_command 2>> errors.txt C2110 Operační systém UNIX a základy programování U09: Přesměrování a proudy -8Spojování výstupních proudů Standardní výstup a standardní chybový výstup programu my_command lze současně přesměrovat do souboru output.txt. $ my_command &> output.txt $ my_command &>> output.txt Alternativní řešení pro &>>: Nejdříve je nutné přesměrovat standardní výstup a poté spojit standardní chybový výstup s výstupem standardním. $ my_command >> output.txt 2>&1 $ my_command 2>&1 >> output.txt nefunguje pořadí je důležité! funguje v nových verzích bash C2110 Operační systém UNIX a základy programování U09: Přesměrování a proudy -9Roury (pípy) Roury slouží ke spojování standardního výstupu jednoho procesu se standardním vstupem jiného procesu. process 1 process 2 vstup výstup | vstup výstup chybový výstup chybový výstup $ command_1 | command_2 Použití: C2110 Operační systém UNIX a základy programování U09: Přesměrování a proudy -10Roury a chybový proud Přenos standardního chybového výstupu přes rouru je možné provést po jeho spojení se standardním výstupem. process 1 process 2 vstup výstup | vstup výstup chybový výstup chybový výstup $ command_1 2>&1 | command_2 Použití: 2>&1 C2110 Operační systém UNIX a základy programování U09: Přesměrování a proudy -11Příkazy pro cvičení Ukázky použití: $ cat soubor1.txt soubor2.txt $ paste soubor1.txt soubor2.txt $ wc soubor.txt $ head -15 soubor.txt $ tail -6 soubor.txt spojí obsah souborů soubor1.txt a soubor2.txt za sebe a výsledek vypíše na obrazovku spojí obsah souborů soubor1.txt a soubor2.txt vedle sebe a výsledek vypíše na obrazovku vypíše počet řádků, slov a znaků, které obsahuje soubor soubor.txt vypíše prvních 15 řádků ze souboru soubor.txt vypíše posledních 6 řádků ze souboru soubor.txt cat spojí obsah více souborů do jednoho (za sebe), případně vypíše obsah jednoho souboru paste spojí obsah více souborů do jednoho (vedle sebe) wc informace o souboru (počet řádků, slov a znaků) head vypíše úvodní část souboru tail vypíše koncovou část souboru C2110 Operační systém UNIX a základy programování U09: Přesměrování a proudy -12Příkazy pro cvičení ... Příkaz tr slouží k transformaci nebo mazání znaků ze standardního vstupu. Výsledek je zasílán do standardního výstupu. Příklady: $ cat soubor.txt | tr --delete "qwe" $ cat soubor.txt | tr --delete "[:space:]" $ echo $PATH | tr ":" "\n" z obsahu souboru soubor.txt odstraní znaky "q", "w" a "e" z obsahu souboru soubor.txt odstraní všechny bílé znaky v textu zaslaného příkazem echo budou nahrazeny znaky ":" znakem nového řádku "\n" C2110 Operační systém UNIX a základy programování U09: Přesměrování a proudy -13Cvičení 1 1. Nalezněte všechny soubory s koncovkou .f90, které obsahuje adresář /home/kulhanek/Documents/C2110/01.UNIX/U09 pomocí příkazu find. Seznam souborů uložte do souboru ~/Procesy/seznam.txt 2. Kolik řádků obsahuje soubor seznam.txt? 3. Vypište první dva řádky ze souboru seznam.txt nejdříve na obrazovku a poté do souboru dva_radky.txt 4. Vypište pouze třetí řádek ze souboru seznam.txt 5. V adresáři /proc nalezněte všechny soubory, které začínají písmeny cpu. Z výpisu odstraňte informace o nepovoleném přístupu přesměrováním chybového proudu do /dev/null 6. Vypište názvy adresářů obsažené v proměnné PATH, každý na jeden řádek.