Presmerovanie I/O v Linuxe. Linux: presmerovanie

  • 28.08.2019

Ak výstup do (grafickej) konzoly nie je príliš veľký, môžete jednoducho vybrať kus myšou a vložiť ho do správy kliknutím na stredné tlačidlo. V opačnom prípade môžete použiť presmerovanie výstupu do súboru cez „lievik“, ako je tento:

Parametre niektorých_príkazov > logfile.txt

Ak chcete vidieť výsledok vykonania na obrazovke a súčasne zapisovať do súboru, môžete použiť príkaz tee:

Parametre niektorých_príkazov | tee -a logfile.txt

Príkaz setterm -dump vytvorí snímku aktuálnej vyrovnávacej pamäte virtuálnej konzoly ako obyčajný textový súbor s predvoleným názvom screen.dump. Ako argument môžete použiť číslo konzoly, pre ktorú chcete výpis. A pridaním voľby -file filename sa tento výpis presmeruje na súbor so zadaným názvom. Voľba -append pripojí nový výpis k existujúcemu súboru - k "predvolenému" screen.dump alebo k súboru s názvom -file.

Tie. po použití príkazu ako

Setterm -dump -file /root/screenlog

respektíve v súbore /root/screenlog bude obsahom jednej konzolovej stránky.

Našlo sa ďalšie riešenie na kopírovanie/vkladanie textu v textovej konzole bez myši. Môžete tiež kopírovať text z vyrovnávacej pamäte posúvania (t. j. všetko na obrazovke a nad obrazovkou). Pre lepšie pochopenie si prečítajte o obrazovke správcu okien v konzole. Môže byť tiež užitočné zväčšiť veľkosť vyrovnávacej pamäte rolovania.

1) Spustiť obrazovku

2) Stlačte Enter. Všetko. Sme v okne nulovej konzoly.

3) Vykonáme potrebné príkazy, ktorých výstup je potrebné skopírovať.

4) Ctrl+A, Ctrl+[ - sme v režime kopírovania. Kurzor dáme na začiatok výberu, stlačíme medzerník, potom umiestnime kurzor na koniec výberu, stlačíme medzerník. Text bol skopírovaný do schránky.

5) Ctrl+A, c - vytvorili sme nové 1. okno.

6) Ctrl+A, 1 - prešli sme do 1. okna.

7) Otvorte ľubovoľný (?) textový editor (skúšal som v mc) a stlačte Ctrl + A, Ctrl +] - text sa vloží. Ušetríme.

8) Ctrl+A, Ctrl+0 - návrat do nulového okna.

Ako zvýšiť vyrovnávaciu pamäť posúvania?

Prvým riešením je zvýšiť predvolenú (predvolenú) veľkosť vyrovnávacej pamäte v zdrojoch jadra a prekompilovať ju. Dovoľte mi predpokladať, že sa zdráhate urobiť to rovnako ako ja a hľadáte flexibilnejšie médium.

A taký nástroj existuje, ale volá sa framebuffer console , skrátene fbcon. Toto zariadenie má dokumentačný súbor fbcon.txt; ak ste si nainštalovali dokumentáciu k jadru, tak ju máte. Hľadaj to niekde v okolí /usr/share vetvy (nemôžem uviesť presnú cestu kvôli rozdielom v distribúcii).

V tomto bode sa ospravedlňujem: musíme trochu odbočiť a porozprávať sa trochu o vyrovnávacej pamäti videa ( framebuffer ).

Video buffer je vyrovnávacia pamäť medzi displejom a video adaptérom. Jeho krása je v tom, že sa s ním dá manipulovať: umožňuje triky, ktoré by nefungovali, ak by bol adaptér pripojený priamo k displeju.

Jeden taký trik súvisí s vyrovnávacou pamäťou posúvania; Ukázalo sa, že môžete "požiadať" video buffer, aby pridelil viac pamäte do vyrovnávacej pamäte. To je dosiahnuté prostredníctvom zavádzacích parametrov jadra. Najprv vyžadujete framebuffer(video buffer); Potom požiadate o väčšiu vyrovnávaciu pamäť posúvania.

Nasledujúci príklad je pre GRUB, ale dá sa ľahko prispôsobiť LILO. V konfiguračnom súbore GRUB - menu.lst- nájdite riadok zodpovedajúci jadru a potom: Odstráňte možnosť vga=xxx, ak existuje. Pridajte možnosť video=vesabf alebo čokoľvek, čo zodpovedá vášmu hardvéru. Pridajte možnosť fbcon=scrollback:128 . Po tomto postupe by riadok parametrov jadra mal vyzerať takto:

Kernel /vmlinuz root=/dev/sdb5 video=radeonfb fbcon=scrollback:128

Otázkou je, prečo odstrániť možnosť vga=xxx? Kvôli možným konfliktom s možnosťou videa. Na mojom adaptéri ATI nemôžem zmeniť vyrovnávaciu pamäť posúvania, ak je uvedené vga=xxx. Možno vo vašom prípade to tak nie je. Ak vyššie uvedené možnosti fungujú - dobre; ale čo ak chcete zvýšiť počet riadkov alebo nastaviť menšie písmo na obrazovke? Vždy ste to robili s možnosťou vga=xxx a to zmizlo. Nebojte sa – to isté možno dosiahnuť zmenou parametrov fbcon, ako je popísané v súbore fbcon.txt(ale nie je popísané v tomto článku).

S voľbou fbcon=scrollback:128 sa moja vyrovnávacia pamäť posúvania zväčšila na 17 obrazoviek (35-krát Shift+PgUp polovica obrazovky). Mimochodom, 128 je kilobajt. Autor článku tvrdí, že viac sa zistiť nedá. neskúšal som.

Môžete použiť skript.

Názov skriptu.log

keď sú vykonané všetky požadované príkazy -

Všetko sa zapíše do súboru filename.log

FreeBSD má úžasný nástroj na sledovanie, ktorý vám umožňuje monitorovať terminály, ale ako sa ukázalo, v Linuxe vykonáva úplne iné funkcie =\ Oplatí sa googliť na túto tému, existuje niečo ...

Ak chcete zapisovať údaje do súbor alebo si ich odtiaľ prečítať, proces musí najprv otvoriť tento súbor (pri otváraní na zápis ho možno budete musieť najskôr vytvoriť). Toto dáva proces deskriptor(deskriptor) otvoreného súboru - číslo jedinečné pre tento proces, ktoré bude používať pri všetkých operáciách zápisu. Prvý otvorený súbor dostane popisovač, druhý dostane 1 atď. Po dokončení so súborom proces zatvára kým je rukoväť uvoľnená a môže byť znovu použitá. Ak sa proces ukončí bez zatvorenia súborov, systém to urobí zaň. Presne povedané, iba pri operácii otvorenia deskriptora sa uvádza, ktorý súbor sa použije. Ako "súbor" sa používajú bežné pilníky aj dierové pilníky (najčastejšie terminály). kanály popísané v Pipeline..Pipeline. Ďalšie operácie - čítanie, písanie a zatváranie, práca s deskriptorom, ako s dátový tok, ale je jedno, kam presne tento potok vedie.

Každý proces Linuxu dostane pri spustení tri„súbor“, ktorý mu systém otvoril. Prvá (rukoväť) je otvorená čítanie, toto štandardný vstup proces. So štandardným vstupom fungujú všetky operácie čítania, ak nešpecifikujú deskriptor súboru. Druhý (deskriptor 1) je otvorený na zápis, tento štandardný výstup proces. Pracujú s ním všetky operácie zápisu, ak v nich nie je explicitne uvedený deskriptor súboru. Napokon tretí dátový tok (deskriptor 2) je určený na zobrazovanie diagnostických správ, tzv štandardný chybový výstup. Pretože tieto tri popisovače súborov sú už pri spustení procesu otvorené, prvý súbor otvorený samotným procesom bude mať s najväčšou pravdepodobnosťou popisovač súboru 3 .

Handle Rukoväť dátového toku, ktorý proces otvoril. Deskriptory sú číslované od. Keď sa otvorí nový dátový tok, jeho rukoväti sa pridelí najmenšie z aktuálne nepoužívaných čísel. Tri vopred otvorené deskriptory: štandardný vstup (), štandardný výstup(1) a štandardný chybový výstup(2) dané procesu pri spustení.

Kopírovací mechanizmus životné prostredie, popísaný v prednáške, zahŕňa okrem iného skopírovanie všetkých otvorených kľučiek rodičovského procesu na dieťa. Výsledkom je, že nadradený aj podriadený proces majú rovnaké dátové toky pod rovnakými rukoväťami. Keď to začne štart shell, sú s ním spojené všetky tri vopred otvorené deskriptory terminál(presnejšie s príslušným súborom dier typu tty): používateľ zadáva príkazy z klávesnice a zobrazuje správy na obrazovke. Preto sa každý príkaz spustený z shellu zobrazí na rovnakom termináli a každý príkaz sa spustí interaktívne(nie na pozadí) - vstúpte odtiaľ.

štandardný výstup

Už Metod sa stretol s tým, že niektoré programy vedia vypísať nielen na terminál, ale aj do súboru, napríklad info pri zadávaní parametrický kľúč" -o " nasledované názvom súboru vypíše text manuálu do súboru namiesto jeho zobrazenia na monitore. Aj keď vývojári programu takýto kľúč neposkytujú, Metod pozná aj iný spôsob, ako uložiť výstup programu do súboru namiesto zobrazenia na monitore: umiestniť znak „>“ a zadať názov súboru za to. Metod už teda vytvoril krátke textové súbory (skriptá) pomocou utility cat (pozri prednášku Sprístupňovanie procesov k súborom a adresárom).

$ cat > textfile Toto je príklad súboru. ^D $ ls -l textový súbor -rw-r--r-- 1 metodická metóda 23. novembra 15 16:06 textový súbor

Príklad 2. Presmerovanie štandardného výstupu do súboru

Možnosti samotnej pomôcky pre mačky sa samozrejme nerozšírili z použitia symbolu „\u003e“. Navyše mačka v tomto príklade nedostala od príkazový shellžiadne možnosti: žiadny znak ">", žiadny nasledujúci názov súboru. V tomto prípade mačka pracovala ako obvykle, nevedela (a ani ju to nezaujímalo!) Kde výstup skončí: na obrazovke monitora, v súbore alebo niekde inde. Namiesto toho, aby sa starala o doručenie výstupu na konečné miesto určenia (či už je to osoba alebo súbor), mačka posiela všetky údaje štandardný výstup(skrátene stdout).

Nahradenie štandardného výstupu je úlohou shellu. V tomto príklade shell vytvorí prázdny súbor, ktorého názov je zadaný za znakom „>“ a deskriptor súboru tohto súboru sa odovzdá programu cat s číslom 1 ( štandardný výstup). Toto sa robí veľmi jednoducho. V prednáške Prístup k procesom k súborom a adresárom sme hovorili o tom, ako sa príkazy spúšťajú z shellu. Najmä po vykonaní fork() sa objavia dva rovnaké procesy, z ktorých jeden - dieťa - musí spustiť príkaz namiesto seba (exec()). Takže predtým on zatváraštandardný výstup (deskriptor 1 je uvoľnený) a otvára súbor (spojený s najprv voľný deskriptor, t.j. 1), a spúšťaný príkaz nemusí nič vedieť: jeho štandardný výstup už bol nahradený. Táto operácia sa nazýva presmerovaťštandardný výstup. V prípade, že súbor už existuje, shell ho prepíše a úplne zničí všetko, čo predtým obsahoval. Preto, aby mohol Metod pokračovať v zapisovaní údajov do textového súboru , bude potrebovať ďalšiu operáciu - ">>".

$ cat >> textfile Príklad 1. ^D $ cat textfile Toto je vzorový súbor. Príklad 1. $

Príklad 3. Nedeštruktívne stdout presmerovanie

Metod dostal presne taký výsledok, aký potreboval: na koniec existujúceho súboru pridal údaje zo štandardného výstupu nasledujúceho príkazu.

štandardný výstup Dátový tok otvorený systémom pre každý proces v čase jeho spustenia a určený na výstup dát procesom.

štandardný vstup

Podobne je možné použiť na odovzdanie údajov na vstup programu štandardný vstup(skrátene stdin). Pri práci s príkazovým riadkom sú štandardným vstupom znaky, ktoré používateľ zadáva z klávesnice. Štandardný vstup je možné presmerovať pomocou príkazového shellu tak, že sa doňho vložia údaje z nejakého súboru. symbol "< » служит для перенаправления содержимого файла на стандартный ввод программе. Например, если вызвать утилиту sort без параметра, она будет читать строки со стандартного ввода. Команда « sort < имя_файла” poskytne vstupné triediace údaje zo súboru.

$triediť< textfile Пример 1. Это файл для примеров. $

Príklad 4. Presmerovanie štandardného vstupu zo súboru

Výsledok tohto príkazu je úplne rovnaký ako príkaz sort textfile, rozdiel je v tom, že keď "< », sort получает данные со стандартного ввода, ничего не зная о файле « textfile », откуда они поступают. Механизм работы shell в данном случае тот же, что и при перенаправлении вывода: shell читает данные из файла « textfile », запускает утилиту sort и передаёт ей на стандартный ввод содержимое файла.

Je potrebné pripomenúť, že operácia "\u003e" deštruktívne: vždy vytvorí súbor s nulovou dĺžkou. Preto napríklad triedenie dát v súbore musí byť aplikované sekvenčne triediť < файл >nový_súbor a mv new_file file. Príkaz Zobraziť príkaz< файл >rovnaký_súbor stačí skrátiť na nulovú dĺžku!

Štandardný vstup Dátový tok otvorený systémom pre každý proces v čase jeho spustenia a určený na vstup.

Štandardný chybový výstup

Ako prvý príklad a cvičenie v presmerovaní sa Metod rozhodol napísať príručku pre mačku do svojho súboru cat.info:

$ info cat > cat.info info: Zadanie uzla (coreutils.info.bz2)vyvolanie mačky... info: Dokončené. $ head -1 cat.info Súbor: coreutils.info, Uzol: vyvolanie mačiek, Ďalej: vyvolanie tac, Hore: Výstup celých súborov $

Príklad 5. Štandardný chybový výstup

Prekvapený Metod zistil, že napriek jeho pokynom ísť do súboru, dva riadky vytlačené príkazom info stále prenikli do terminálu. Očividne sa tieto riadky nedostali ďalej štandardný výstup pretože priamo nesúvisia s príručkou, ktorú by mal program vydávať, informujú používateľa o postupe práce: zápis príručky do súboru. Pre tento druh diagnostické správy, ako aj pre chybové hlásenia, ktoré sa vyskytli počas vykonávania programu, poskytuje Linux štandardný chybový výstup(skrátene stderr).

štandardný chybový výstup Dátový tok otvorený systémom pre každý proces v čase jeho spustenia a určený pre diagnostické správy výstupom procesu.

Použitie štandardnej chyby spolu so štandardným výstupom vám umožňuje oddeliť skutočný výsledok programu od rôznych sprievodných informácií, napríklad ich odoslaním do rôznych súborov. Štandardný chybový výstup je možné presmerovať rovnakým spôsobom ako štandardný vstup/výstup pomocou kombinácie znakov „2“.

$ info cat > cat.info 2> cat.stderr $ cat cat.stderr info: Zadanie uzla (coreutils.info.bz2)vyvolanie mačky... info: Dokončené. $

Príklad 6. Štandardná chyba presmerovania

Tentoraz sa do terminálu nič nedostalo, štandardný výstup išiel do súboru cat.info , štandardný chybový výstup išiel do cat.stderr . Namiesto ">" a "2" mohol Metod napísať "1>" a "2>". Čísla v tomto prípade označujú počty deskriptorov otvorené súbory. Ak nejaký nástroj očakáva príjem otvorené deskriptor s číslom, povedzme 4 , a potom ho spustiť nevyhnutne budete musieť použiť kombináciu "4>".

Niekedy však chcete stdout a stderr skombinovať do toho istého súboru, a nie ich oddeliť. Bash shell má na to špeciálnu sekvenciu " 2>&1 ". To znamená „štandardná chyba potrubia na rovnaké miesto ako štandardný výstup“:

$ info cat > cat.info 2>&1 $ head -3 cat.info info: Napíšte uzol (coreutils.info.bz2)cat vyvolávanie... info: Dokončené. Súbor: coreutils.info, Uzol: vyvolanie mačiek, Ďalej: vyvolanie tac, Hore: Výstup celých súborov $

Príklad 7. Kombinácia štandardného výstupu a štandardného chybového výstupu

V tomto príklade je dôležité poradie presmerovaní: Metod na príkazovom riadku najskôr určil, kam má presmerovať štandardný výstup (" > cat.info ") a až potom prikázal presmerovať štandardný chybový výstup tam. Urobte to naopak (“ 2>&1 > cat.info ”), výsledok by bol neočakávaný: do súboru by sa dostal iba štandardný výstup a na termináli by sa objavili diagnostické správy. Logika je tu však pevná: v čase operácie „2>&1“ bol štandardný výstup pripojený k terminálu, čo znamená, že po pri jeho vykonaní bude s terminálom spojený aj štandardný chybový výstup. A následné presmerovanie štandardného výstupu do súboru, samozrejme, nijako neovplyvní štandardnú chybu. Číslo v konštrukcii &number je číslo otvorené deskriptor. Ak by vyššie uvedený nástroj, ktorý zapisuje do štvrtého deskriptora, bol napísaný v shelli, použil by presmerovania " >&4 ". Aby sa vyhlo zadávaniu ťažkopádnej konštrukcie „> file 2>&1“, bash používa skratky: „ &> file “ alebo ekvivalentne „>& file “.

Presmerovanie nikam

Niekedy je známe, že výstup niektorých údajov programom nebude potrebný. Napríklad varovania zo štandardného chybového výstupu. V tomto prípade môžete štandardný chybový výstup presmerovať na dierový pilník, špeciálne navrhnutý na zničenie dát - /dev/null . Všetko zapísané do tohto súboru sa jednoducho zahodí a nikde neuložené.

$ info cat > cat.info 2 > /dev/null $

Príklad 8. Presmerujte na /dev/null

Rovnakým spôsobom sa môžete zbaviť štandardného výstupu jeho odoslaním do /dev/null .

Tri smery I/O sú vyhradené – štandardný vstup, výstup a chybový tok ( stdin, stdout, stderr ). Štandardne sú všetky tri vlákna priradené (priradené) k terminálu. V tomto prípade program zobrazí všetky svoje hlásenia, vrátane tých o chybách, na termináli. Shell umožňuje presmerovať tieto štandardné toky, nastaviť I/O a združovanie tokov.

Presmerovanie I/O streamov.

> súbor Presmerovanie štandardného výstupu do súboru súbor

>> súbor -Presmerovanie štandardného výstupu do súboru súbor pripojený na koniec súboru.

- získanie štandardného vstupu zo súboru súbor.

prog1 | prog2 -Odovzdanie výstupného prúdu programu prog1 do vstupného prúdu programu prog2.

n>súbor súbor.

n>>súbor -Presmerujte štandardný tok s deskriptorom n do súboru súbor pripojený na koniec súboru.

n>&m -Kombinovanie vlákien s deskriptormi n A m .

$ prog1 >/dev/null 2>&1

/dev/null je pseudozariadenie, ktoré ničí prúd naň smerovaný.

Odovzdávanie výstupného toku jedného programu do vstupného toku iného je bežnou praxou. Napríklad:

$ gzip -d archive.tar.gz | decht -xf

Tu sa súbor rozbalí. archive.tar.gz , zabalený s dvoma archivátormi. Výstupný tok z pomôcky gzip odovzdaný do vstupného toku obslužnému programu decht . Podobne je možné rovnakú operáciu vykonať iným spôsobom:

$ gzip -d archive.tar.gz

$ tar -xf archive.tar

Pretože jazyk Bourne Shell je procedurálny programovací jazyk, rovnako ako iné podobné jazyky má operátory, ktoré vám umožňujú riadiť postupnosť vykonávania príkazov. Nevyhnutným operátorom je kontrola určitej podmienky, v závislosti od ktorej splnenia sa určuje ďalší priebeh programu. Tento operátor je príkaz test. Tento príkaz kontroluje určitú podmienku. tím test Existujú dve možnosti hovoru:

skúšobná podmienka

[podmienka]

Treba poznamenať, že medzi zátvorkou a podmienkou musia byť medzery, inak Shell nebude schopný rozpoznať "[" ako príkaz test . Po úspešnom dokončení test sa vracia "0" .

Podmienky kontroly súborov:

-f súbor Súbor "súbor" je bežný súbor.

-d súbor súbor " súbor" je adresár.
-c súbor Súbor "súbor" je špeciálny súbor.
-r súbor Súbor "súbor" má povolenie na čítanie.

-w súbor Súbor "súbor" má povolenie na zápis.

-x súbor Súbor "súbor" má povolenie na vykonanie.

-s súbor Súbor "súbor" nie prázdny.

Podmienky overenia riadkov:

reťazec1=reťazec2 Struny reťazec1 A reťazec2 zápas.

reťazec1!=reťazec2 Struny reťazec1 A reťazec2 nezhodujú.

-n reťazec1 Linka reťazec1 existuje.

-z reťazec1 Linka reťazec1 neexistuje.

Podmienky pre operácie s celými číslami:

x -ekv y x sa rovná y

x -ne y x sa nerovná y

x -gt y x je väčšie ako y

x-gey x je väčšie alebo rovné y

x -lt y x je menšie ako y

x-ley x je menšie alebo rovné y

V tomto prípade príkaz test zaobchádza s reťazcami ako s celými číslami. Prázdnemu reťazcu zodpovedá aj hodnota null.

Booleovské operácie v kontexte test

! (nie) logické "NIE"

-o (alebo) logické "ALEBO"

-a (a) Logika "A"

Podmienený operátor "ak"

Všeobecná forma použitia podmieneného príkazu if je nasledovná:

ak<условие>

potom<список команд>

[elif<условие>

potom<список> ]

Výrazy v hranatých zátvorkách sú voliteľné. Tie. vieme si predstaviť najbežnejšiu „seknutú“ modifikáciu podmieneného operátora:

ak<условие>

potom<список команд>

V tomto prípade, ak <условие> dokončené (kód dokončenia 0) a potom vykonané <список команд>. Inak <список команд> preskočené.

Vyberte vyhlásenie prípad

Vo všeobecnosti syntax operátora prípad nasledovne:

prípad<строка>v

Šablóna 1)

........

Šablóna2)

........

........

Význam <строка> sa porovnáva so vzormi v poradí. Ak sa nájde zhoda, vykonajú sa príkazy zodpovedajúcej sekcie. Treba poznamenať, že šablóny umožňujú použitie masiek. Ak sa nenašla žiadna zhoda, vykonajú sa príkazy zo sekcie so vzorom „*“ (podobne predvolená selektor prepínač v OD ).

Tu je napríklad časť inicializačného skriptu BSD UNIX . Tu sú premenné (inetd_enable a inetd_flags) boli získané z iného súboru ( rc.conf).

. /etc/rc.conf

prípad ($inetd_enable) v

)

if [ -x /usr/sbin/inetd ]; potom

/usr/sbin/inetd $inetd_flags

fi

;;

esac

Príkaz enumeračnej slučky pre

Syntax operátora pre

pre<имя>

<список команд>

Fragment v hranatých zátvorkách môže chýbať. Operátor pre zabezpečí, že sa cyklus vykoná toľkokrát, koľko slov je v zozname hodnôt. Zároveň premenná <имя> preberá hodnoty slov zo zoznamu postupne. Samotný zoznam môže byť vytvorený z výstupu iných príkazov. Ak zoznam chýba, potom <имя> akceptuje hodnoty odovzdané ako parametre pozičného skriptu.

Príkaz slučky s pravdivou podmienkou zatiaľ čo

Syntax operátora zatiaľ čo má vo všeobecnosti nasledujúcu štruktúru:

zatiaľ čo<условие>

<список команд>

Operátor zatiaľ čo preferované, keď zoznam hodnôt parametrov nie je vopred známy. Zoznam príkazov sa bude vykonávať v slučke, pokiaľ je podmienka pravdivá. Pri prvom vstupe do slučky musí byť splnená podmienka.

Príkaz slučky s nepravdivou podmienkou kým

Syntax operátora kým má vo všeobecnosti nasledujúcu štruktúru:

kým<условие>

<список команд>

Zoznam príkazov sa bude vykonávať v slučke, pokiaľ je podmienka nepravdivá. Keď prvýkrát vstúpite do cyklu, podmienka nesmie byť pravdivá. Je potrebné poznamenať, že podmienka slučky sa kontroluje na nepravdivosť po každom, vrátane. a prvý vykonaný príkaz v slučke.

Základné príkazy OS UNIX pracovať so súbormi

1. Tím pwd.

Syntax: pwd .

Popis: Príkaz zobrazí názov aktuálneho adresára pre spustený shell.

Cvičenie 1.

Na určenie domovského adresára použite príkaz pwd.

Premietnite príkaz a výsledok jeho práce do správy.

2. Tím muž.

Syntax: muž názov.

Názov je názov príkazu, pomôcky, systémového volania, funkcie knižnice, súboru, o ktorý máme záujem.

Popis : UNIX MANUÁL - manuál operačného systému UNIX. Informácie odtiaľ sú dostupné online pomocou nástroja muž .

Úloha 2.

Na zobrazenie informácií o príkaze pwd použite pomocný program man.

Zapíšte si krátke informácie o tíme do správy (v ruštine).

3. Tím cd.

Syntax: cd názov_adresára.

Popis: Toto je príkaz na zmenu aktuálneho adresára. DirectoryName je úplný alebo relatívny názov adresára, ktorý chcete zmeniť na aktuálny.

cd bez volieb aktuálny vytvorí váš domovský adresár.

Úloha 3.

Posuňte aktuálny adresár o úroveň vyššie. Skontrolujte to a potom sa vráťte do svojho domovského adresára. Skontrolujte zmenu adresára.

Zaznamenajte vykonanie vykonaných príkazov do správy.

4. Tím ls.

Syntax: ls názov_adresára

Popis: príkaz na zobrazenie obsahu zadaného adresára.

ls bez parametrov vypíše zoznam súborov z aktuálneho adresára.

Výsledný zoznam nebude obsahovať súbory, ktorých názvy začínajú symbolom „ . ” - súbory vytvorené rôznymi systémovými programami na ich vlastné účely. Úplný zoznam súborov môžete zobraziť zadaním v príkaze ls kľúč "-a",

tie. ls -a názov_adresára

Povolenia súboru

S každým vloženým súborom OS UNIX spojené s 12-bitovým slovom nazývaným "oprávnenia" pre súbor.

Spodných 9 bitov tohto slova je kombinovaných do troch skupín po troch bitoch; každá skupina nastavuje prístupové práva pre vlastníka súboru, pre jeho skupinu a pre všetkých ostatných používateľov. Tri bity v každej skupine sú zodpovedné za právo čítať, požadovať a používať súbor.

Ak chcete zistiť prístupové práva ku konkrétnemu súboru, môžete použiť príkaz

, napríklad:

> ls -l /bin/kat

Skupina znakov na začiatku riadku -rwxr-xr-x zobrazuje typ súboru (prvý znak; mínus znamená, že máme čo do činenia s obyčajným súborom, písmenom d by znamenalo adresár atď.) a oprávnenia pre vlastníka (v tomto prípade rwx , t.j. čítať, zapisovať a spúšťať), zoskupovať a všetky ostatné (v tomto prípade r-x , t.j. žiadne oprávnenia na zápis). Teda súbor /bin/kat dostupné každému používateľovi na čítanie a spustenie, ale iba používateľ ho môže upravovať koreň (t.j. správca).

Slovo prístupových práv k súboru môžete napísať ako osmičkové číslo (3 číslice - osmičková číslica), trojmiestne (vlastník, skupina, ostatní používatelia) každý znak v tomto trojcifernom osmičkovom čísle je vytvorený ako súčet práv: 4 - práva na čítanie, 2 - práva na záznam, 1 - na použitie (z binárnej triády): (111) 2 =2 0 +2 1 +2 2 =(1+2+4) 10 .

Napríklad, 7 = 1 + 2 + 4 Þ vpravo rwx

4 2 1

6 = 0 + 2+ 4 Þ práva rw- -

4 2 0

V trojcifernom počte práv na postúpenie: 744 všetky práva sú definované pre vlastníka, iba na čítanie pre skupinu, iba na čítanie pre ostatných používateľov.

Ak chcete použiť povolenia súboru, použite príkaz chmod , ktorý vám umožňuje nastaviť nové povolenia ako osmičkové číslo, napríklad:

$ chmod 744 filel.c.

Úloha 4.

a) Úplné informácie o príkaze ls získate pomocou pomocného programu man. Presmerujte výstup príkazu do nejakého textového súboru.

b) Pozrite si celý obsah aktuálneho adresára a presmerujte aj tento výstup do textového súboru.

c) S príkazom ls-l<имя_файла> vypíšte informácie o prístupových právach do textového súboru, s ktorým ste pracovali v kroku 4b, a potom tieto informácie presmerujte do rovnakého textového súboru. Vysvetlite svoj záver.

5. Tým kat.

I/O presmerovanie.

Na zobrazenie obsahu malého textového súboru na obrazovke môžete použiť príkaz:

kat Názov súboru

Pozor! Nepokúšajte sa prezerať obsah adresára a binárnych súborov týmto spôsobom.

Veľký testovací súbor si tím pohodlne prezerá viac (popis použitia nájdete v UNIX MANUÁL ). Prečo je tu príkaz nepohodlný kat ?

V tíme kat je možné zadať viacero názvov súborov:

mačka súbor1 súbor 2 ... súbor N

obsah všetkých súborov v rade sa zobrazí na obrazovke.

Výstup môžete presmerovať do nejakého súboru:

cat file 1 file 2 > result_file

Presmerovanie výstupu zo štandardného výstupu (obrazovky) do súboru je štandardom pre všetky príkazy. Môžete presmerovať štandardný vstup (z klávesnice), napríklad prevziať údaje pre program zo súboru pomocou „<”.

mačka > new_file - vytvorí nový textový súbor s obsahom, ktorý zadáte z klávesnice.

Zrušte proces zadávania údajov -

Úloha 5.

Vytvorte nový textový súbor s mačkou a zobrazte jeho obsah. Presmerujte výstup zo štandardného streamu do iného súboru, ktorého názov zadáte z klávesnice, a uistite sa, že operácia je správna.

6. Najjednoduchšie príkazy na prácu so súbormi : cp, rm, mkdir, mv

Ak chcete vytvoriť nový adresár, použite príkaz:

mkdir názov_adresára

Ak chcete skopírovať obsah jedného súboru do druhého, použite príkaz:

cp zdrojový_súbor cieľový_súbor.

Príkaz

cp súbor 1 súbor 2 .... súbor N cieľový adresár

sa používa na kopírovanie súboru alebo súborov do už existujúceho adresára s názvom cieľový_adresár pod ich vlastnými menami. Namiesto názvov skopírovaných súborov môžete použiť ich šablóny. Vzory sú špecifikované pomocou metaznakov:

* - vyhovuje všetkým reťazcom znakov vrátane prázdneho.

Všetky jednotlivé písmená

[ ...] - zhoduje sa s ľubovoľným znakom v zátvorkách. Dvojica znakov oddelená mínusom definuje rozsah znakov.

Príkaz

cp-r source_dir destination_dir

slúži na rekurzívne kopírovanie jedného adresára (source_dir) do nového adresára (destination_dir).

Namiesto mien v príkazoch na kopírovanie je možné použiť ich šablóny.

Príkaz

rm súbor 1 súbor 2 .... súbor N

umožňuje odstrániť 1 alebo viac bežných súborov z aktuálneho adresára.

Namiesto mien je možné použiť šablóny. Ak chcete odstrániť jeden alebo viac adresárov spolu s ich obsahom (rekurzívne odstránenie) v príkaze rm použite kľúč -r

Rm-r smer 1 smer 2

Premenovať príkaz:

mv source_name destination_name

Súbor s názvom source_name sa premenuje na súbor s názvom destination_name. V tomto prípade pred vykonaním príkazu súbor s názvom názov_destinácie nesmie existovať.

Úloha 6.

Vytvorte nový adresár vo svojom domovskom adresári. Usporiadajte tam malý testovací súbor s dvoma riadkami obsahu:

„Študujem prácu v OS UNIX

Usporiadajte scenár.

Skopírujte obsah tohto súboru do iného súboru s rovnakým názvom, ale v adresári /home. Ak bola kópia úspešná, odstráňte pôvodne vytvorený súbor z adresára. Skontrolujte obsah použitých adresárov a súborov.

Úloha 7.

jeden). Keď ste si osvojili interaktívnu prácu s najjednoduchšími príkazmi OS UNIX, použite editor Kwriter na vytvorenie skriptu so skriptom zodpovedajúcim sekvenčnému vykonávaniu:

Úloha 3,

Úloha 4B, 4C,

Úloha 5,

Úloha 6.

V úlohe 6 nezabudnite skontrolovať, či program úspešne skopíroval súbor s výstupom textových správ a obsahom príslušných adresárov na obrazovke.

Je potrebné, aby v dávkovom súbore bolo kompetentné vydávanie požiadaviek na zadávanie údajov z klávesnice organizované pomocou príkazu: $ echo - n „text dotazu“.

2). Uložte skript s názvom Myscript1, spustite ho príkazom

sh Myscript1

zadajte požadované údaje a skontrolujte výsledky.

3). Pripravte správu o dokončenom laboratóriu, ktorá by mala odrážať vašu prácu v interaktívnom režime a so skriptom, vrátane textu skriptu (s komentárom) a výsledkov získaných na obrazovke av súboroch.

Systémové volania getuid a getpid

Zistite identifikátor používateľa, ktorý spustil program na spustenie - UID a ID skupiny, do ktorej patrí ,-GID možno vykonať pomocou systémových volaní getuid() a getpid() ich aplikovaním v rámci tohto programu.

Prototypy systémových volaní:

#include

#include

uid_t getuid(void);

gid_t getgid(void);

Úloha 8.

Napíšte, skompilujte a spustite program, ktorý vypíše ID používateľa spusteného programom a ID skupiny používateľa.

Zahrňte program s výsledkami do správy.

testovacie otázky

1. Pojem súboru v OS UNIX . Čo je domovský adresár?

2. Aké sú prostriedky na zoskupovanie príkazov Shell -tlmočník? uveďte príklady použitia.

3. Ako prebieha presmerovanie I/O?

4. Čo je to príkazový kanál? uveďte príklad.

5. Ako to znamená Shell vykonávať aritmetické operácie Shell - premenlivý?

6. Aké sú pravidlá pre generovanie názvov súborov?

7. Ako sa vykonáva nahradenie výsledkov vykonania príkazov?

8. Ako interpretovať reťazec cmd1&cmd2& ?

9. Ako interpretovať reťazec cmd1 && cmd2& ?

10. Ako interpretovať reťazec cmd1 || cmd2 & ?

11. Ako v UNIX definované oprávnenia k súborom? Ktorý príkaz je možné použiť na ich zobrazenie pre konkrétny súbor?

12. Ako zistiť identifikátor používateľa, ktorý spustil program a identifikátor jeho skupiny?

Laboratórna práca číslo 3.

Procesy v operačnom systéme UNIX.

Cieľ

Naučte sa vytvárať procesy a naučte sa, ako zmeniť používateľský kontext procesov pomocou systémových volaní používaných v programoch v danom jazyku OD, v OS UNIX.

1. Preštudujte si organizáciu procesov v UNIX Kľúčové slová: koncepcia procesu, kontext procesu, životný cyklus procesu, identifikácia procesu, hierarchická štruktúra procesu. Písať OD a odlaďte program v súlade s úlohou 1.

2. Oboznámte sa s tvorbou procesu v UNIX , s organizáciou ukončenia procesu. Napíšte a odlaďte program (jazyk OD ) v súlade s úlohou 2 zaradiť do správy.

3. Preskúmajte parametre funkcie hlavné() v jazyku OD , premenné prostredia a argumenty príkazového riadku. Napíšte program v jazyku OD v súlade s úlohou 3 ho odlaďte a zahrňte do správy spolu s výsledkami.

4. Preštudujte si rodinu funkcií na organizáciu systémového volania exec().

5. Napíšte program v jazyku OD v súlade s verziou úlohy 4 vydanej učiteľom odlaďte program a predveďte výsledky učiteľovi. Zahrnúť program s výsledkami do správy.

6. Chráňte prácu učiteľa zodpovedaním kontrolných otázok.

Už ste oboznámení s dvoma spôsobmi, ako sa vysporiadať s výstupom skriptov príkazového riadka:

  • Zobrazenie výstupných údajov na obrazovke.
  • Presmerovanie výstupu do súboru.
Niekedy potrebujete niečo ukázať na obrazovke a niečo zapísať do súboru, takže musíte pochopiť, ako Linux spracováva vstup a výstup, čo znamená naučiť sa posielať výsledky skriptov tam, kam potrebujete. Začnime hovorením o štandardných deskriptoroch súborov.

Štandardné deskriptory súborov

Všetko v Linuxe sú súbory, vrátane vstupu a výstupu. Operačný systém identifikuje súbory pomocou úchytov.

Každý proces má povolených až deväť otvorených deskriptorov súborov. Shell bash rezervuje prvé tri deskriptory s ID 0, 1 a 2. Tu je to, čo znamenajú.

  • 0 , STDIN - štandardný vstupný tok.
  • 1 , STDOUT - štandardný výstupný tok.
  • 2, STDERR - tok štandardných chýb.
Tieto tri špeciálne rukoväte spracovávajú vstup a výstup údajov v skripte.
Musíte správne porozumieť štandardným tokom. Možno ich prirovnať k základu, na ktorom skripty interagujú s vonkajším svetom. Pozrime sa na podrobnosti o nich.

STDIN

STDIN je štandardný vstupný tok shellu. Pre terminál je štandardným vstupom klávesnica. Keď skripty používajú znak presmerovania vstupu -< , Linux заменяет дескриптор файла стандартного ввода на тот, который указан в команде. Система читает файл и обрабатывает данные так, будто они введены с клавиатуры.

Mnoho bash príkazov akceptuje vstup zo STDIN, ak v príkazovom riadku nie je zadaný žiadny súbor, z ktorého sa má vstup prevziať. Platí to napríklad pre príkaz mačka.

Keď zadáte príkaz cat na príkazovom riadku bez možností, prevezme vstup z STDIN . Keď zadáte ďalší riadok, mačka ho jednoducho vytlačí na obrazovku.

STDOUT

STDOUT je štandardný výstupný tok shellu. V predvolenom nastavení je to obrazovka. Väčšina bash príkazov vystupuje na STDOUT , čo spôsobí, že sa objaví v konzole. Údaje je možné presmerovať do súboru ich pripojením k jeho obsahu pomocou príkazu >>.

Takže máme nejaký dátový súbor, do ktorého môžeme pridať ďalšie dáta pomocou tohto príkazu:

Pwd >> myfile
Aké výstupy pwd sa pridajú do súboru myfile , pričom údaje, ktoré už v ňom sú, zostanú nedotknuté.

Presmerovanie výstupu príkazu do súboru

Zatiaľ je to v poriadku, ale čo keď sa pokúsite urobiť niečo ako nasledovné, pristúpite k neexistujúcemu xfile , mysliac si, že je to všetko o vložení chybového hlásenia do myfile .

ls –l xfile > myfile
Po vykonaní tohto príkazu sa na obrazovke zobrazia chybové hlásenia.


Pokus o prístup k neexistujúcemu súboru

Pokus o prístup k neexistujúcemu súboru vygeneruje chybu, ale shell nepresmeroval chybové hlásenia do súboru ich vytlačením na obrazovku. Chceli sme však, aby sa chybové hlásenia dostali do súboru. Čo robiť? Odpoveď je jednoduchá – použite tretí štandardný deskriptor.

STDERR

STDERR je štandardný chybový tok shellu. V predvolenom nastavení tento popisovač ukazuje na to isté, na čo ukazuje STDOUT, a preto sa na obrazovke zobrazuje správa, keď sa vyskytne chyba.

Povedzme teda, že chceme presmerovať chybové správy, povedzme, do súboru denníka alebo niekde inde, namiesto toho, aby sme ich zobrazovali na obrazovke.

▍Chyba presmerovania streamu

Ako už viete, deskriptor súboru STDERR je 2. Chyby môžeme presmerovať umiestnením tohto deskriptora pred príkaz redirect:

ls -l xfile 2>myfile cat ./myfile
Chybové hlásenie teraz prejde do myfile .


Presmerovanie chybového hlásenia do súboru

▍Chyba presmerovania a výstupné prúdy

Pri písaní skriptov príkazového riadka môže nastať situácia, keď budete musieť zorganizovať presmerovanie chybových hlásení aj štandardné presmerovanie výstupu. Aby ste to dosiahli, musíte použiť príkazy na presmerovanie pre príslušné deskriptory, špecifikujúce súbory, kam by sa mali dostať chyby a štandardný výstup:

ls -l môj súbor xsúbor inýsúbor 2> chybový obsah 1> správny obsah

Chyby presmerovania a štandardný výstup

Shell presmeruje to, čo príkaz ls normálne posiela do STDOUT, na správny súbor obsahu vďaka konštrukcii 1>. Chybové hlásenia, ktoré by zasiahli STDERR, skončia v súbore errorcontent kvôli príkazu 2> redirect.

V prípade potreby je možné STDERR aj STDOUT presmerovať na rovnaký súbor pomocou príkazu &>:


Presmerovanie STDERR a STDOUT do rovnakého súboru

Po vykonaní príkazu to, čo je určené pre STDERR a STDOUT, skončí v súbore s obsahom.

Presmerovanie výstupu v skriptoch

Existujú dva spôsoby presmerovania výstupu v skriptoch príkazového riadku:
  • Dočasné presmerovanie alebo jednoriadkové presmerovanie výstupu.
  • Trvalé presmerovanie alebo presmerovanie celého výstupu v skripte alebo v niektorej jeho časti.

▍Dočasné presmerovanie výstupu

V skripte môžete presmerovať výstup jedného riadku na STDERR . Na to stačí použiť príkaz na presmerovanie, ktorý špecifikuje STDERR deskriptor, pričom pred číslo deskriptora uvedie znak ampersand (&):

#!/bin/bash echo "Toto je chyba" >&2 echo "Toto je normálny výstup"
Ak spustíte skript, oba riadky prejdú na obrazovku, pretože, ako už viete, chyby sa štandardne zobrazujú na rovnakom mieste ako bežné údaje.


Dočasné presmerovanie

Spustite skript tak, aby výstup STDERR skončil v súbore.

./myscript 2> myfile
Ako vidíte, teraz sa obvyklý výstup vykonáva do konzoly a chybové hlásenia idú do súboru.


Chybové hlásenia sa zapisujú do súboru

▍Trvalé presmerovanie výstupu

Ak skript potrebuje presmerovať veľa výstupov na obrazovku, pridávanie príslušného príkazu do každého volania echo je nepohodlné. Namiesto toho môžete nastaviť presmerovanie výstupu na konkrétny deskriptor počas trvania skriptu pomocou príkazu exec:

#!/bin/bash exec 1>outfile echo "Toto je test presmerovania celého výstupu" echo "z shell skriptu do iného súboru." echo "bez toho, aby ste museli presmerovať každý riadok"
Spustíme skript.


Presmerovanie celého výstupu do súboru

Ak sa pozriete na súbor zadaný v príkaze presmerovanie výstupu, ukáže sa, že všetko, čo bolo na výstupe príkazov echo, skončilo v tomto súbore.

Príkaz exec je možné použiť nielen na začiatku skriptu, ale aj na iných miestach:

#!/bin/bash exec 2>myerror echo "Toto je začiatok skriptu" echo "teraz sa všetok výstup presmeruje na iné miesto" exec 1>myfile echo "Toto by malo ísť do súboru myfile" echo "a toto by malo ísť do súboru myerror" >&2
Tu je to, čo sa stane po spustení skriptu a pohľade na súbory, na ktoré sme presmerovali výstup.


Presmerovanie výstupu do rôznych súborov

Príkaz exec najskôr presmeruje výstup zo STDERR do súboru myerror . Výstup niekoľkých príkazov odozvy sa potom odošle do STDOUT a vytlačí sa na obrazovku. Potom príkaz exec odošle to, čo je na STDOUT, do myfile a nakoniec v príkaze echo použijeme presmerovanie na príkaz STDERR, čo spôsobí zapísanie príslušného riadku do súboru myerror.

Keď si to osvojíte, budete môcť presmerovať výstup tam, kam chcete. Teraz si povedzme o presmerovaní vstupu.

Presmerovanie vstupu v skriptoch

Na presmerovanie vstupu môžete použiť rovnakú techniku, akú sme použili na presmerovanie výstupu. Napríklad príkaz exec vám umožňuje vytvoriť súbor ako zdroj údajov pre STDIN:

Exec 0< myfile
Tento príkaz hovorí shellu, že vstupom by mal byť súbor myfile, a nie obyčajný STDIN. Pozrime sa na presmerovanie vstupu v akcii:

#!/bin/bash exec 0< testfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done
To je to, čo sa objaví na obrazovke po spustení skriptu.


Presmerovanie vstupu

V predchádzajúcom príspevku ste sa naučili používať príkaz read na čítanie vstupu používateľa z klávesnice. Ak presmerujete vstup tak, že zo zdroja údajov urobíte súbor, potom príkaz read pri pokuse o načítanie údajov zo STDIN ich prečíta zo súboru a nie z klávesnice.

Niektorí správcovia systému Linux používajú tento prístup na čítanie a následné spracovanie súborov denníka.

Vytvorenie vlastného presmerovania výstupu

Presmerovaním vstupu a výstupu v skriptoch nie ste obmedzený na tri štandardné deskriptory súborov. Ako už bolo spomenuté, otvorených rukovätí môžete mať až deväť. Zvyšných šesť, očíslovaných 3 až 8, možno použiť na presmerovanie vstupu alebo výstupu. Ktorýkoľvek z nich môže byť priradený k súboru a použitý v kóde skriptu.

Výstupným údajom môžete priradiť popisovač pomocou príkazu exec:

#!/bin/bash exec 3>myfile echo "Toto by sa malo zobraziť na obrazovke" echo "a toto by malo byť uložené v súbore" >&3 echo "A toto by sa malo vrátiť späť na obrazovku"
Po spustení skriptu sa časť výstupu dostane na obrazovku a časť do súboru s deskriptorom 3 .


Presmerovanie výstupu pomocou vlastnej rukoväte

Vytváranie deskriptorov súborov pre vstup

Vstup v skripte môžete presmerovať rovnakým spôsobom ako výstup. Pred presmerovaním vstupu uložte STDIN do iného deskriptora.

Po dokončení čítania súboru môžete STDIN obnoviť a použiť ho ako zvyčajne:

#!/bin/bash exec 6<&0 exec 0< myfile count=1 while read line do echo "Line #$count: $line" count=$(($count + 1)) done exec 0<&6 read -p "Are you done now? " answer case $answer in y) echo "Goodbye";; n) echo "Sorry, this is the end.";; esac
Poďme otestovať scenár.


Presmerovanie vstupu

V tomto príklade bol deskriptor súboru 6 použitý na uloženie odkazu na STDIN . Potom sa vykonalo presmerovanie vstupu, súbor sa stal zdrojom údajov pre STDIN. Potom vstup do príkazu read prišiel z presmerovaného STDIN , teda zo súboru.

Po prečítaní súboru STDIN resetujeme do pôvodného stavu jeho presmerovaním na deskriptor 6 . Teraz, aby sa skontrolovalo, či všetko funguje správne, skript položí používateľovi otázku, čaká na vstup z klávesnice a spracuje zadané údaje.

Zatváranie deskriptorov súborov

Po ukončení skriptu shell automaticky zatvorí deskriptory súborov. V niektorých prípadoch je však potrebné pred dokončením skriptu zatvoriť rukoväte ručne. Aby bolo možné zatvoriť rukoväť, musí byť presmerovaná na &-. Vyzerá to takto:

#!/bin/bash exec 3> myfile echo "Toto je testovací riadok údajov" >&3 exec 3>&- echo "Toto nebude fungovať" >&3
Po vykonaní skriptu dostaneme chybové hlásenie.


Uskutočnil sa pokus o prístup k deskriptoru uzavretého súboru

Ide o to, že sme sa pokúsili odkázať na neexistujúci deskriptor.

Buďte opatrní pri zatváraní deskriptorov súborov v skriptoch. Ak ste odoslali údaje do súboru, potom zatvorili rukoväť a potom ju znova otvorili, shell nahradí existujúci súbor novým. To znamená, že všetko, čo bolo do tohto súboru zapísané skôr, sa stratí.

Získanie informácií o otvorených rukovätiach

Ak chcete získať zoznam všetkých otvorených úchytov v systéme Linux, môžete použiť príkaz lsof. Mnoho distribúcií, ako napríklad Fedora, má nástroj lsof v /usr/sbin . Tento príkaz je celkom užitočný, pretože vytlačí informácie o každom držadle, ktoré je v systéme otvorené. To zahŕňa to, čo otvárajú procesy bežiace na pozadí a čo otvárajú prihlásení používatelia.

Tento príkaz má veľa kláves, pozrime sa na tie najdôležitejšie.

  • -p Umožňuje zadať ID procesu.
  • -d Umožňuje zadať číslo deskriptora, o ktorom chcete získať informácie.
Na zistenie PID aktuálneho procesu môžete použiť špeciálnu premennú prostredia $$ , do ktorej shell zapíše aktuálny PID .

Voľba -a sa používa na vykonanie logickej operácie AND s výsledkami vrátenými pomocou ďalších dvoch volieb:

lsof -a -p $$ -d 0,1,2

Zobrazenie informácií o otvorených rukovätiach

Typ súborov spojených s STDIN , STDOUT a STDERR je CHR (režim znakov). Keďže všetky ukazujú na terminál, názov súboru sa zhoduje s názvom zariadenia priradeného k terminálu. Všetky tri štandardné súbory sú k dispozícii na čítanie aj zápis.

Pozrime sa na volanie príkazu lsof zo skriptu, ktorý má okrem štandardných otvorené aj ďalšie rukoväte:

#!/bin/bash exec 3> myfile1 exec 6> myfile2 exec 7< myfile3 lsof -a -p $$ -d 0,1,2,3,6,7
Tu je to, čo sa stane, keď spustíte tento skript.


Zobrazenie deskriptorov súborov otvorených skriptom

Skript otvoril dve rukoväte pre výstup (3 a 6) a jednu pre vstup (7). Zobrazia sa tu aj cesty k súborom, ktoré sa používajú na konfiguráciu deskriptorov.

Potlačenie výstupu

Niekedy sa treba uistiť, že príkazy v skripte, ktoré sa napríklad dajú spustiť ako proces na pozadí, nič nezobrazujú na obrazovke. Ak to chcete urobiť, môžete presmerovať výstup do /dev/null . Je to niečo ako „čierna diera“.

Tu je napríklad postup, ako potlačiť chybové hlásenia:

ls -al badfile otherfile 2> /dev/null
Rovnaký prístup sa používa, ak napríklad chcete vymazať súbor bez toho, aby ste ho odstránili:

Cat /dev/null > myfile

Výsledky

Dnes ste sa dozvedeli, ako funguje vstup a výstup v skriptoch príkazového riadku. Teraz viete, ako zaobchádzať s deskriptormi súborov, ako ich vytvárať, prezerať a zatvárať, viete o vstupe, výstupe a presmerovaní chýb. Toto všetko je veľmi dôležité pri vývoji bash skriptov.

Nabudúce si povieme o signáloch Linuxu, o tom, ako ich zvládnuť v skriptoch, o spúšťaní úloh podľa plánu a o úlohách na pozadí.

Vážení čitatelia! V tomto materiáli sú uvedené základy práce so vstupnými, výstupnými a chybovými prúdmi. Sme si istí, že sú medzi vami profesionáli, ktorí o tom všetkom vedia povedať len skúsenosti. Ak áno, odovzdáme slovo vám.

Zatiaľ čo normálne, ako už bolo spomenuté, program I/O je viazaný na štandardné toky, v shellu sú špeciálne zariadenia na presmerovanie I/O.

5.5.1 Operátori >,< и >>

Symboly " sa používajú na označenie presmerovania. > ", "< "A" >> ". Najbežnejšie použitie je presmerovanie výstupu príkazu do súboru. Tu je relevantný príklad:

$ ls -l > /home/jim/dir.txt

Tento príkaz uloží zoznam súborov a podadresárov adresára, ktorý bol aktuálny v čase vykonania príkazu, do súboru /home/jim/dir.txt ls; zároveň, ak zadaný súbor neexistoval, vytvorí sa; ak existoval, bude prepísaný; ak chcete, aby bol výstup príkazu pripojený na koniec existujúceho súboru, potom namiesto symbolu > použitie >> . V tomto prípade prítomnosť medzier pred alebo za znakmi > alebo >> je nepodstatné a slúži len pre pohodlie používateľa.

Výstup môžete nasmerovať nielen do súboru, ale aj na vstup iného príkazu alebo do zariadenia (napríklad tlačiarne). Ak chcete napríklad spočítať počet slov v súbore /home/jim/report.txt, môžete použiť nasledujúci príkaz:

$ cat /home/jim/report.txt > wc -w

a na tlač súboru - príkaz:

$ cat /home/jim/report.txt > lpr

Ako vidíte, operátor > slúži na presmerovanie výstupného toku. Vo vzťahu k vstupnému toku podobnú funkciu vykonáva operátor < . Vyššie uvedený príklad príkazu na počítanie počtu slov v konkrétnom súbore možno prepísať nasledovne (všimnite si absenciu príkazu kat):

$ wc -w< /home/jim/report.txt

Tento variant presmerovania sa často používa v rôznych skriptoch pre príkazy, ktoré bežne prijímajú (alebo očakávajú vstup od) klávesnice. V skripte, ktorý automatizuje niektoré rutinné operácie, môžete príkazu poskytnúť potrebné informácie zo súboru, ktorý obsahuje to, čo musíte zadať na vykonanie tohto príkazu.

Pretože symboly < , > A >> pôsobia na štandardné prúdy, možno ich použiť nielen bežným spôsobom, ako sa to bežne robí, ale aj trochu iným spôsobom. Takže nasledujúce príkazy sú ekvivalentné:

$ mačka > súbor

$cat>súbor

$ > súbor kat

$ > súbor kat

Avšak sám o sebe (bez akéhokoľvek príkazu, pre ktorý sú definované štandardné streamy) nie je možné použiť znak presmerovania, takže nemožno napr. napísať do príkazového riadku

$ súbor1 > súbor2

získať kópiu nejakého súboru. To však neznižuje hodnotu tohto mechanizmu, pretože pre každý príkaz sú definované štandardné toky. V tomto prípade môžete presmerovať nielen štandardný vstup a výstup, ale aj iné streamy. Ak to chcete urobiť, pred symbolom presmerovania musíte zadať číslo streamu, ktorý sa má presmerovať. Štandardný vstupný stdin je číslo 0, štandardný výstup stdout je číslo 1, štandardný tok chybových hlásení stderr je číslo 2. To znamená, že úplný formát príkazu presmerovania je (pripomeňme, že medzery vedľa > nie sú potrebné):

príkaz N > M

kde N A M— čísla štandardných tokov (0,1,2) alebo názvy súborov. Použitie symbolov v niektorých prípadoch < , > A >> bez zadania čísla kanála alebo názvu súboru je to možné len preto, že namiesto chýbajúceho čísla sa štandardne nahrádza 1, t.j. štandardný výstup. Áno, operátor > bez čísla sa interpretuje ako 1 > .

Okrem jednoduchého presmerovania štandardných streamov existuje aj možnosť nielen presmerovať stream na konkrétny kanál, ale vytvoriť kópiu obsahu štandardného streamu. Na to je špeciálny znak. & , ktoré je umiestnené pred číslom kanála, na ktorý je stream presmerovaný:

príkaz N > &M

Tento príkaz znamená, že výstup kanála s číslom N sa odosiela na štandardný výstup a je duplikovaný v potrubí s číslom M. Napríklad, aby sa chybové hlásenia duplikovali na štandardný výstup, musíte zadať príkaz 2>&1, zatiaľ čo 1>&2 duplikuje stdout na stderr. Táto funkcia je užitočná najmä pri presmerovaní výstupu do súboru, pretože potom vidíme správy na obrazovke a ukladáme ich do súboru.

5.5.2 Prevádzkovateľ |

Špeciálnym variantom presmerovania výstupu je organizácia programového kanála (niekedy nazývaného pipeline alebo pipeline). Na tento účel sú dva alebo viac príkazov, takže výstup predchádzajúceho slúži ako vstup pre nasledujúci, spojené (alebo oddelené, ak chcete) symbolom zvislej čiary - "|". V tomto prípade je štandardný výstupný tok príkazu umiestnený naľavo od symbolu | , smeruje na štandardný vstup programu umiestnený napravo od znaku | . Napríklad:

$ cat myfile | grep Linux | wc -l

Tento riadok znamená, že výstup príkazu kat, teda text zo súboru myfile, bude presmerovaný na vstup príkazu grep, ktorý vyberie iba riadky obsahujúce slovo „Linux“. výstup príkazu grep bude následne presmerovaný na vstup príkazu wc -l, ktorý spočíta počet takýchto riadkov.

Programové potrubia sa používajú na spojenie niekoľkých malých programov, z ktorých každý vykonáva len určité transformácie na svojom vstupnom toku, na vytvorenie zovšeobecneného príkazu, ktorého výsledkom je nejaká zložitejšia transformácia.

Je potrebné poznamenať, že shell súčasne vyvoláva všetky príkazy zahrnuté v potrubí, pričom spúšťa samostatnú inštanciu shellu pre každý z príkazov, takže akonáhle prvý program začne vydávať niečo do svojho výstupného prúdu, nasledujúci príkaz začne ho spracovávať. Rovnakým spôsobom každý nasledujúci príkaz vykoná svoju operáciu, čaká na údaje z predchádzajúceho príkazu a svoje výsledky dáva ako vstup pre nasledujúci príkaz. Ak chcete, aby sa jeden príkaz úplne dokončil predtým, ako sa začne vykonávať ďalší, môžete ho použiť na rovnakom riadku ako symbol potrubia | a bodkočiarkou ; . Pred každou bodkočiarkou sa shell zastaví a počká, kým sa neskončia všetky predchádzajúce príkazy zahrnuté v potrubí.

Stav ukončenia (logická hodnota vrátená po ukončení programu) z kanála je rovnaký ako stav ukončenia vrátený posledným príkazom v potrubí. Pred prvým príkazom potrubia môžete vložiť symbol "!", potom bude stav výstupu z potrubia logickou negáciou stavu výstupu z posledného príkazu. Shell čaká na dokončenie všetkých príkazov potrubia pred nastavením návratovej hodnoty.

5.5.3 Filtre

Posledný z vyššie uvedených príkladov (s príkazom grep) možno použiť na ilustráciu ďalšieho dôležitého konceptu, a to filtračného programu. Filtre sú príkazy (alebo programy), ktoré akceptujú vstupný dátový tok, vykonajú na ňom nejaké transformácie a výsledok vyvedú na štandardný výstup (odkiaľ ho možno na žiadosť používateľa presmerovať niekam inam). Príkazy filtra zahŕňajú už spomenuté príkazy. mačka, viac, menej, wc, cmp, dif, ako aj nasledujúce príkazy.

Tabuľka 5.1. Príkazy filtra

Príkaz

Stručný opis

grep, fgrep, egrep

Vyhľadajte vo vstupnom súbore alebo štandardnom vstupe riadky obsahujúce zadaný vzor a zapíšte ich na štandardný výstup

Nahradí vo vstupnom toku všetky výskyty znakov uvedených v zadanom zozname zodpovedajúcimi znakmi z druhého určeného zoznamu

comm

Porovná dva súbory riadok po riadku a zapíše 3 stĺpce do stdout: jeden obsahuje riadky, ktoré sa vyskytujú iba v súbore 1, druhý obsahuje riadky, ktoré sa vyskytujú iba v súbore 2: a tretí obsahuje riadky, ktoré sa vyskytujú v oboch súboroch

Formátuje textový súbor alebo obsah štandardného vstupu na tlač.

sed

Riadkový editor používaný na vykonanie určitej transformácie na vstupnom toku (prevzatý zo súboru alebo štandardného vstupu)

Špeciálnym filtrom je príkaz tričko, ktorý "zdvojnásobuje" vstupný tok, na jednej strane ho nasmeruje na štandardný výstup a na druhej strane do súboru (ktorého názov musíte zadať). Je ľahké vidieť, že vo svojej činnosti príkaz tričko podobne ako operátor presmerovania 1>&súbor.

Možnosti filtrov je možné výrazne rozšíriť pomocou regulárnych výrazov, ktoré umožňujú napríklad organizovať vyhľadávanie pomocou rôznych, často veľmi zložitých vzorov.

O presmerovaní a filtroch by sa dalo povedať veľa. Ale tento materiál sa nachádza vo väčšine kníh pre UNIX a Linux, ako napríklad Petersen [A1.4] a Kelly-Bootle [A1.8]. Preto sa obmedzíme na to, čo bolo povedané, a pristúpime k zváženiu takzvaného prostredia alebo prostredia vytvoreného škrupinou.

V. Kostromin (kos at rus-linux dot net) - 5.5. Presmerovanie I/O, kanály a filtre