Redirecționează ieșirea către Linux. Redirecționarea intrării în scripturi. Cum să afișați informații complete despre un computer și să salvați aceste informații în html, pdf

Prin utilizarea remapării I/O, un program își poate direcționa ieșirea către intrarea altuia sau poate intercepta ieșirea altui program și o poate folosi ca intrare. Astfel, este posibil să transferați informații de la un proces la altul cu o suprasolicitare minimă pentru software. În termeni practici, aceasta înseamnă că pentru programele care utilizează dispozitive standard de intrare și ieșire, sistem de operare permite:

  • trimite mesajele programului nu către ecran (flux de ieșire standard), ci către un fișier sau către o imprimantă (redirecționare ieșire);
  • citiți datele de intrare nu de la tastatură (flux de intrare standard), ci dintr-un fișier pregătit anterior (redirecționare de intrare);
  • transmiteți mesajele ieșite de un program ca intrare către alt program (pipeline sau compunere de instrucțiuni).

Din linia de comandă, aceste caracteristici sunt implementate după cum urmează. Pentru a redirecționa mesaje text, scos prin orice comandă din linia de comandă, în fisier text, trebuie să folosiți construcția comandă > nume fișier. Dacă fișierul specificat pentru ieșire a existat deja, acesta este suprascris (conținutul vechi este pierdut); dacă nu a existat, este creat. De asemenea, nu puteți crea fișierul din nou, dar adăugați informațiile ieșite de comandă până la sfârșit fișier existent. Pentru a face acest lucru, comanda de redirecționare a ieșirii trebuie specificată astfel: comandă >> nume fișier. Folosind un simbol< можно прочитать входные данные для comanda dată nu de la tastatură, ci dintr-un anumit fișier (pregătit): comandă< имя_файла

Exemple de redirecționare I/O pe linia de comandă

Iată câteva exemple de redirecționare I/O.

1. Rezultate comenzi ping la dosar ping ya.ru > ping.txt

2. Adăugați text de ajutor pentru comenzile XCOPY la fișierul copy.txt: XCOPY /? >> copy.txt

Dacă este necesar, mesajele de eroare (fluxul de erori standard) pot fi redirecționate către un fișier text folosind comanda 2> construcție nume fișier. ieșire standard va fi afișat pe ecran. De asemenea, este posibil să scoateți mesaje de informații și mesaje de eroare în același fișier. Acest lucru se face după cum urmează: comandă > nume fișier 2 >&1

De exemplu, următoarea comandă redirecționează ieșirea standard și eroarea standard către copy.txt: XCOPY A:\1.txt C: > copy.txt 2>&1

Capacitățile de redirecționare încorporate ale Linux vă oferă o gamă largă de instrumente simplificate pentru tot felul de sarcini. Abilitatea de a gestiona diverse fluxuri I/O va crește semnificativ productivitatea, ca atunci când se dezvoltă un complex software, și atunci când gestionați fișiere folosind linia de comandă.

Fire I/O

Intrare și ieșire în Mediul Linux distribuite între trei fire:

  • Intrare standard (intrare standard, stdin, numărul firului 0)
  • Ieșire standard (stdout, numărul 1)
  • Eroare standard sau flux de diagnosticare (eroare standard, stderr, numărul 2)

Când un utilizator interacționează cu un terminal, intrarea standard este transmisă prin tastatura utilizatorului. Ieșire standard și eroare standard sunt afișate pe terminalul utilizatorului ca text. Toate aceste trei fluxuri sunt numite fluxuri standard.

Intrare standard

Fluxul de intrare standard transmite de obicei date de la utilizator către program. Programele care așteaptă intrare standard primesc de obicei intrare de la un dispozitiv (cum ar fi o tastatură). Intrarea standard se oprește când ajunge la EOF (sfârșitul fișierului). EOF indică faptul că nu mai sunt date de citit.

Pentru a vedea cum funcționează intrarea standard, rulați programul cat. Numele acestui instrument înseamnă „concatenează” (a conecta sau combina ceva). De obicei, acest instrument este folosit pentru a combina conținutul a două fișiere. Când rulează fără argumente, cat se deschide Linie de comandași acceptă conținutul intrării standard.

Acum introduceți câteva numere:

1
2
3
ctrl-d

Introducând un număr și apăsând enter, trimiteți o intrare standard programul care rulează cat, care acceptă aceste date. La rândul său, programul cat afișează intrarea primită pe ieșirea standard.

Utilizatorul poate seta EOF apăsând ctrl-d, ceea ce va determina oprirea programului cat.

Ieșire standard

Ieșirea standard înregistrează datele generate de program. Dacă ieșirea standard nu a fost redirecționată, va trimite text către terminal. Încercați să rulați următoarea comandă ca exemplu:

echo Trimis la terminal prin ieșire standard

ecou comandă fără opțiuni suplimentare afișează pe ecran toate argumentele transmise acestuia pe linia de comandă.

Acum rulați echo fără niciun argument:

Comanda va returna un șir gol.

Eroare standard

Acest flux standard înregistrează erorile, creat de program, care este în neregulă. La fel ca ieșirea standard, acest flux trimite date către terminal.

Să ne uităm la un exemplu de flux de erori de comandă ls. Comanda ls afișează conținutul directoarelor.

Fără argumente, această comandă returnează conținutul directorului curent. Dacă furnizați un nume de director ca argument pentru ls, comanda va returna conținutul său.

Deoarece directorul % nu există, comanda va returna eroarea standard:

ls: nu poate accesa %: Nu există un astfel de fișier sau director

Redirecționarea fluxului

Linux oferă echipe speciale pentru a redirecționa fiecare fir. Aceste comenzi scriu rezultate standard într-un fișier. Dacă rezultatul este redirecționat către un fișier inexistent, comanda va crea fișier nou cu acel nume și salvați rezultatul redirecționat către acesta.

Comenzile cu o paranteză unghiulară suprascriu conținutul existent al fișierului țintă:

  • > - ieșire standard
  • < — стандартный ввод
  • 2> - eroare standard

Comenzile cu paranteze unghiulare duble nu suprascriu conținutul fișierului țintă:

  • >> - ieșire standard
  • << — стандартный ввод
  • 2>> - eroare standard

Luați în considerare următorul exemplu:

pisică > scrie_către_mi.txt
A
b
c
ctrl-d

ÎN în acest exemplu comanda pisicii folosit pentru a scrie rezultate într-un fișier.

Examinați conținutul write_to_me.txt:

cat write_to_me.txt

Comanda ar trebui să returneze:

Redirecționează cat la write_to_me.txt din nou și introduceți trei numere.

pisică > scrie_către_mi.txt
1
2
3
ctrl-d

Acum verificați conținutul fișierului.

cat write_to_me.txt

Comanda ar trebui să returneze:

După cum puteți vedea, fișierul conține doar cea mai recentă ieșire, deoarece comanda care a redirecționat ieșirea a folosit un singur parantez unghiular.

Acum încercați să rulați aceeași comandă cu două paranteze unghiulare:

pisică >> scrie_mie.txt
A
b
c
ctrl-d

Deschideți write_to_me.txt:

1
2
3
A
b
c

Comenzile cu paranteze unghiulare duble nu suprascriu conținutul existent, ci se adaugă acestuia.

Transportoare

Conductele redirecționează ieșirea unei comenzi către intrarea alteia. În acest caz, datele transferate în al doilea program nu sunt afișate în terminal. Datele vor apărea pe ecran numai după procesarea de către al doilea program.

Conductele în Linux sunt reprezentate de o bară verticală.

De exemplu:

Această comandă va transmite rezultatul ls (conținutul directorului curent) la less, care va afișa datele transmise linie cu linie. De obicei, ls afișează conținutul directoarelor consecutiv, fără a le împărți în rânduri. Dacă redirecționați ieșirea ls la less, ultima comandă va împărți ieșirea în linii.

După cum puteți vedea, o conductă poate redirecționa ieșirea unei comenzi către intrarea alteia, spre deosebire de > și >>, care redirecționează doar datele către fișiere.

Filtre

Filtrele sunt comenzi care pot modifica redirecționarea și ieșirea unei conducte.

Notă: Filtrele sunt de asemenea comenzi standard Linux, care poate fi folosit fără o conductă.

  • găsi – caută un fișier după nume.
  • grep – caută text folosind un model dat.
  • tee – redirecționează intrarea standard către ieșirea standard și unul sau mai multe fișiere.
  • tr – caută și înlocuiește șiruri.
  • wc – numărarea caracterelor, rândurilor și cuvintelor.

Exemple de redirecționare I/O

Acum că sunteți familiarizat cu conceptele și mecanismele de bază ale redirecționării, să ne uităm la câteva exemple de bază ale utilizării lor.

comandă > fișier

Acest model redirecționează rezultatul standard al comenzii către un fișier.

ls ~> root_dir_contents.txt

Această comandă transmite conținutul directorului rădăcină al sistemului ca ieșire standard și scrie rezultatul în fișierul root_dir_contents. Aceasta va șterge tot conținutul anterior din fișier, deoarece comanda folosește un singur parantez unghiular.

comandă > /dev/null

/dev/null este dosar special(asa numitul " aparat gol"), care este folosit pentru a suprima ieșirea standard sau diagnosticarea pentru a evita ieșirile nedorite către consolă. Toate datele care ajung în /dev/null sunt eliminate. Redirecționarea către /dev/null este folosită în mod obișnuit în scripturile shell.

ls > /dev/null

Această comandă resetează ieșirea standard returnată de ls la /dev/null.

comanda 2 > fișier

Acest model redirecționează fluxul de erori standard al comenzii către un fișier, suprascriind conținutul său curent.

mkdir "" 2> mkdir_log.txt

Această comandă va redirecționa eroarea cauzată de un nume de director nevalid și o va scrie în log.txt. Vă rugăm să rețineți: eroarea apare în continuare în terminal.

comandă >> fișier

Acest model redirecționează ieșirea standard a unei comenzi către un fișier fără a suprascrie conținutul curent al fișierului.

echo Scris într-un fișier nou > data.txt
echo Adăugat la conținutul unui fișier existent >> data.txt

Această pereche de comenzi redirecționează mai întâi intrarea utilizatorului către un fișier nou și apoi îl lipește într-un fișier existent fără a-i suprascrie conținutul.

comanda 2>>fișier

Acest model redirecționează fluxul de erori standard al comenzii către un fișier fără a suprascrie conținutul existent al fișierului. Este potrivit pentru crearea jurnalelor de erori de program sau serviciu, deoarece conținutul jurnalului nu va fi actualizat în mod constant.

găsiți „” 2> stderr_log.txt
wc "" 2>> stderr_log.txt

Comanda de mai sus redirecționează mesajul de eroare cauzat de argumentul find invalid în fișierul stderr_log.txt și apoi adaugă mesajul de eroare cauzat de argumentul wc invalid la fișierul stderr_log.txt.

echipa | echipă

Acest model redirecționează ieșirea standard a primei comenzi către intrarea standard a celei de-a doua comenzi.

găsi /var lib | grep deb

Această comandă caută în directorul /var și subdirectoarele sale nume de fișiere și extensii deb și returnează căile fișierelor, evidențiind modelul de căutare în roșu.

echipa | dosar tee

Acest model redirecționează ieșirea standard a comenzii către un fișier și suprascrie conținutul acestuia, apoi afișează rezultatul redirecționat în terminal. Dacă fișierul specificat nu există, acesta creează un fișier nou.

ÎN acest șablon Comanda tee este de obicei folosită pentru a vizualiza rezultatul unui program și pentru a-l salva într-un fișier în același timp.

wc /etc/magic | tee magic_count.txt

Această comandă transmite numărul de caractere, rânduri și cuvinte dosar magic(Linux folosește acest lucru pentru a determina tipurile de fișiere) la comanda tee, care trimite aceste date către terminal și către fișierul magic_count.txt.

echipa | echipa | comandă >> fișier

Acest șablon redirecționează ieșirea standard a primei comenzi și o filtrează prin următoarele două comenzi, apoi adaugă rezultatul final la un fișier.

ls ~ | grep *tar | tr e E >> ls_log.txt

Această comandă trimite rezultatul lui ls pentru directorul rădăcină la grep. La rândul său, grep caută datele primite fișiere tar. După aceasta, rezultatul grep este trecut la comanda tr, care va înlocui toate caracterele e cu caracterul E. Rezultatul rezultat va fi adăugat la fișierul ls_log.txt (dacă un astfel de fișier nu există, comanda va crea este automat).

Concluzie

Funcțiile de redirecționare Linux I/O par prea complexe la început. Cu toate acestea, lucrul cu redirecționarea este una dintre cele mai importante abilități ale unui administrator de sistem.

Pentru a afla mai multe despre o anumită comandă, utilizați:

man comandă | Mai puțin

De exemplu:

Această comandă va reveni lista plina comenzi pentru tee.

Etichete:

Dacă ieșirea către consola (grafică) nu este foarte voluminoasă, puteți pur și simplu să selectați o piesă cu mouse-ul și să o introduceți în mesaj făcând clic pe butonul din mijloc. În caz contrar, puteți utiliza redirecționarea ieșirii către un fișier printr-o pâlnie, astfel:

Some_command parametri > logfile.txt

Pentru a vedea rezultatul execuției pe ecran și, în același timp, a scrie într-un fișier, puteți folosi comanda tee:

Unii_parametri de comandă | tee -a logfile.txt

Comanda setterm -dump creează un instantaneu al bufferului actual al consolei virtuale ca un simplu fișier text cu numele implicit screen.dump. Ca argument, puteți folosi numărul consolei pentru care doriți să descărcați. Și adăugarea opțiunii -file nume de fișier va redirecționa acest dump către un fișier cu numele specificat. Opțiunea -append va adăuga un nou dump la un fișier deja existent - screen.dump „implicit” sau numit cu opțiunea -file.

Acestea. după folosirea comenzii like

Setterm -dump -file /root/screenlog

respectiv în dosar /root/screenlog va fi conținutul unei pagini de consolă.

Am găsit o altă soluție pentru copierea/lipirea textului într-o consolă de text fără mouse. De asemenea, puteți copia text din memoria tampon de defilare (adică tot ce este pe ecran și deasupra ecranului). Pentru a înțelege mai bine, citiți despre manager de consolă ecran windows. De asemenea, poate fi util să măriți dimensiunea tamponului de defilare.

1) Ecran de lansare

2) Apăsați Enter. Toate. Suntem în fereastra zero a consolei.

3) Executați comenzile necesare, a căror ieșire trebuie copiată.

4) Ctrl+A, Ctrl+[ - suntem în modul copiere. Plasați cursorul la începutul selecției, apăsați bara de spațiu, apoi plasați cursorul la sfârșitul selecției, apăsați bara de spațiu. Textul a fost copiat în clipboard.

5) Ctrl+A, c - am creat o nouă fereastră primară.

6) Ctrl+A, 1 - am mers la prima fereastră.

7) Deschideți orice (?) editor de text(Am încercat în mc) și apăsați Ctrl+A, Ctrl+] - textul este inserat. Salva.

8) Ctrl+A, Ctrl+0 - reveniți la fereastra zero.

Cum să măresc tamponul de derulare înapoi?

Prima soluție ar fi să mărești dimensiunea implicită a tamponului în sursele kernelului și să o recompilezi. Permiteți-mi să presupun că sunteți la fel de contrariat față de acest lucru ca și mine și că căutați o soluție mai flexibilă.

Și există un astfel de instrument și se numește consolă framebuffer, pe scurt fbcon. Acest dispozitiv are un dosar de documentație fbcon.txt; dacă ați instalat documentația kernel-ului, atunci o aveți. Cauta-l undeva prin zona /usr/share ramuri (nu pot specifica calea exactă din cauza diferențelor de distribuții).

În acest moment, îmi cer scuze: trebuie să facem o mică digresiune și să vorbim puțin despre bufferul video ( framebuffer ).

Un buffer video este un buffer între afișaj și adaptorul video. Frumusețea sa este că poate fi manipulat: permite trucuri care nu ar funcționa dacă adaptorul ar fi conectat direct la display.

Un astfel de truc implică tamponul de defilare; se dovedește că puteți „cere” tamponul video să aloce mai multa memorie tampon de defilare. Acest lucru se realizează prin parametrii de pornire a nucleului. Mai întâi ceri framebuffer(buffer video); Apoi solicitați un tampon de defilare mai mare.

Următorul exemplu este pentru GRUB, dar poate fi ușor adaptat pentru LILO. În dosar setările GRUB - meniu.lst- găsiți linia corespunzătoare nucleului și apoi: Eliminați opțiunea vga=xxx, dacă este prezentă. Adăugați opțiunea video=vesabf sau orice se potrivește cu hardware-ul dvs. Adăugați opțiunea fbcon=scrollback:128. După această procedură, linia parametrilor nucleului ar trebui să arate cam așa:

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

Întrebarea este de ce să eliminați opțiunea vga=xxx? Din cauza posibile conflicte cu optiune video. Pe adaptorul meu ATI, nu pot schimba tamponul de defilare dacă vga=xxx este în listă. Acesta poate să nu fie cazul în cazul dvs. Dacă opțiunile de mai sus funcționează, bine; dar ce se întâmplă dacă doriți să creșteți numărul de linii sau să setați un font mai mic pe ecran? Întotdeauna ai făcut asta folosind opțiunea vga=xxx - și asta a dispărut. Nu vă faceți griji - același lucru poate fi obținut prin modificarea parametrilor fbcon așa cum este descris în fișier fbcon.txt(dar nu este descris în acest articol).

Cu opțiunea fbcon=scrollback:128, tamponul meu de defilare a crescut la 17 ecrane (de 35 de ori Shift+PgUp pe jumătate de ecran). Apropo, 128 este un kilobyte. Autorul articolului susține că este imposibil să se stabilească mai multe. Nu am încercat.

Puteți folosi scriptul.

Nume fișier script.log

când toate comenzile necesare sunt finalizate -

Totul este înregistrat în filename.log

FreeBSD are un utilitar minunat de ceas care vă permite să monitorizați terminalele, dar după cum se dovedește, în Linux îndeplinește funcții complet diferite =\ Dacă căutați acest subiect pe google, veți găsi ceva...

Redirecționarea se realizează de obicei prin inserarea caracterului special „>” între comenzi. De obicei, sintaxa arată astfel:

Command1 > file1

execută comanda 1, scriind rezultatul standard în fișierul 1.

Echipa 1< файл1

execută comanda 1 folosind fișierul 1 ca sursă de intrare (în loc de tastatură).

Echipa 1< файл1 >fisierul2

combină cele două opțiuni anterioare. Execută comanda 1 cu intrare din fișier 1 și ieșire în fișier 2

Transportoare

Conductele sunt capacitatea mai multor programe de a lucra împreună, atunci când ieșirea unui program merge direct la intrarea altuia fără utilizarea intermediarilor. fișiere temporare. Sintaxă:

echipa1 | echipa 2

Execută comanda 1 folosind fluxul său de ieșire ca flux de intrare atunci când execută comanda 2, ceea ce este echivalent cu utilizarea a două redirecționări și a unui fișier temporar:

Comanda1 > Comanda Fișier temporar2< ВременныйФайл rm ВременныйФайл

Un bun exemplu de conducte de comandă este combinarea ecou cu o altă comandă pentru a obține interactivitate în medii non-interactive, de exemplu:

echo -e „Nume utilizator\nParolă” | ftp localhost

Aceasta pornește un client care se conectează la localhost ca UserName, apasă Enter și apoi introduce parola Password.

Redirecționare către/de la descriptori de fișiere standard

ÎN shell de comandă UNIX, care a evoluat din shell-ul Bourne, poate îmbunătăți cei doi pași anteriori prin specificarea unui număr (descriptor de fișier) imediat înainte de caracterul de redirecționare. Acest număr indică ce flux este folosit pentru redirecționare. UNIX are următoarele fluxuri standard de intrare/ieșire:

De exemplu:

Command1 2 > file1

În shell-urile de comandă derivate din C Shell, conform regulilor de sintaxă, pentru a indica fluxul către care se face redirecționarea, trebuie să adăugați caracterul & după caracterul de redirecționare.

Adesea, fluxul de erori standard este combinat cu fluxul de ieșire standard, astfel încât erorile și ieșirea normală a programului pot fi gestionate împreună. De exemplu:

Găsiți / -name .profile> results.txt 2>&1

va încerca să găsească toate fișierele numite .profile. Dacă rulați această comandă fără redirecționări, va direcționa rezultatele căutării către , și mesajele de eroare (de exemplu, despre drepturi de acces insuficiente atunci când încercați să căutați în directoare protejate) către . În mod implicit, aceste roluri sunt îndeplinite de consolă. Dacă rezultatul standard este direcționat către fișierul de rezultate, erorile vor fi în continuare trimise către consolă. Pentru a vă asigura că atât erorile, cât și rezultatele căutării sunt trimise în fișierul results.txt, fluxurile standard de eroare și de ieșire sunt combinate folosind 2>&1 .

Scris 2>&1 inainte de > nu va funcționa pentru că atunci când interpretul citește 2>&1 , nu știe încă unde este redirecționat fluxul de ieșire standard, astfel încât fluxurile de eroare și de ieșire nu vor fi îmbinate.

Dacă rezultatul combinat urmează să fie transmis la intrarea unui alt program, atunci secvența 2>&1 trebuie să fie în fața indicatorului transportorului. De exemplu:

Găsiți / -nume .profil 2>&1 | Mai puțin

Formular de comandă simplificat:

Comandă>fișier2>&1

arata asa:

Comandă &> fișier

Comandă>&fișier

Lanț transportor

Comenzile de redirecționare și canalizare pot fi înlănțuite pentru a produce comenzi mai complexe, de exemplu:

ls | grep ".sh" | sort>shlist

Obține o listă a conținutului directorului curent, care este filtrată, lăsând doar linii care conțin ".SH", apoi această listă filtrată este sortată lexical și rezultatul final este pus într-un fișier shlist. Construcțiile de acest tip se găsesc adesea în scripturile shell UNIX.

Redirecționare către mai mulți pini

O comandă standard poate redirecționa ieșirea comenzii către mai multe locuri simultan. Exemplu:

Ls -lrt | dosar tee1

direcționează ieșirea standard a comenzii ls -lrt(lista de fișiere) atât în ​​consolă, cât și în fisier1.

Redirecționează cu append

În shell-ul de comandă, puteți redirecționa către un fișier și îl puteți adăuga la sfârșit. În acest caz, informațiile stocate în fișier nu vor fi șterse, ci toate informație nouă va fi adăugat la sfârșitul acestui fișier. Sintaxă:

Command1>> file1

Document încorporat

Unele shell-uri și chiar limbaje aplicate (PHP), Perl, permit sintaxa documentelor încorporate (vezi sintaxa Heredoc), ceea ce vă permite să direcționați fluxul de intrare din fișierul de program în sine, de exemplu: cat « EOF Any textul este plasat aici, inclusiv Simboluri speciale EOF

Semnătura finală a sfârșitului documentului încorporat EOF (poate fi utilizată o valoare arbitrară, dar este adesea folosită EOF - conform sensului) trebuie să înceapă la începutul rândului.

Deși programele se ocupă de obicei cu fluxuri standard pentru I/O, după cum sa menționat, shell-ul are facilități speciale pentru redirecționarea I/O.

5.5.1 Operatori >,< и >>

Simbolurile „ sunt folosite pentru a indica redirecționarea > ", "< " Și " >> ". Cea mai obișnuită utilizare este redirecționarea ieșirii comenzii către un fișier. Iată un exemplu:

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

Această comandă va salva în fișierul /home/jim/dir.txt o listă de fișiere și subdirectoare ale directorului care era curent în momentul în care comanda a fost executată ls; Mai mult, dacă fișierul specificat nu a existat, acesta va fi creat; dacă a existat, va fi suprascris; dacă doriți ca rezultatul comenzii să fie atașat la sfârșitul unui fișier existent, atunci în loc de simbolul de care aveți nevoie > utilizare >> . În acest caz, prezența spațiilor înainte sau după caractere > sau >> este imaterial și servește numai pentru confortul utilizatorului.

Puteți trimite rezultate nu numai către un fișier, ci și către intrarea unei alte comenzi sau către un dispozitiv (cum ar fi o imprimantă). Deci, pentru a număra numărul de cuvinte din fișierul /home/jim/report.txt, puteți folosi următoarea comandă:

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

și pentru a imprima fișierul, utilizați comanda:

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

După cum puteți vedea, operatorul > servește la redirecționarea fluxului de ieșire. În legătură cu fluxul de intrare, o funcție similară este îndeplinită de către operator < . Exemplul de comandă de mai sus pentru a număra numărul de cuvinte dintr-un anumit fișier poate fi rescris după cum urmează (rețineți absența comenzii pisică):

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

Această opțiune de redirecționare este adesea folosită în diferite scripturi pentru comenzi care acceptă (sau așteaptă) introducerea de la tastatură. Într-un script care automatizează unele operațiuni de rutină, puteți da comenzii informațiile necesare dintr-un fișier în care este preînregistrat ceea ce trebuie introdus pentru a executa această comandă.

Datorită faptului că simbolurile < , > Și >> acționează asupra fluxurilor standard, acestea pot fi utilizate nu numai în mod obișnuit, așa cum se face de obicei, ci și într-un mod ușor diferit. Asa de, următoarele comenzi sunt echivalente:

$ cat > fisier

$cat>fișier

$ >file cat

$ > fisier cat

Cu toate acestea, în sine (fără nicio comandă pentru care sunt definite fluxuri standard) simbolul de redirecționare nu poate fi utilizat, deci nu se poate, de exemplu, tastând

$fișier1 > fișier2

obține o copie a unui fișier. Dar acest lucru nu reduce importanța acestui mecanism, deoarece firele standard sunt definite pentru orice comandă. În acest caz, puteți redirecționa nu numai intrarea și ieșirea standard, ci și alte fluxuri. Pentru a face acest lucru, specificați numărul fluxului redirecționat înainte de simbolul de redirecționare. Stdin standard de intrare este numărul 0, standardul de ieșire stdout este numărul 1, fluxul de erori standard stderr este numărul 2. Adică format complet Comanda de redirecționare arată astfel (rețineți că spațiile de lângă > sunt opționale):

comanda N>M

Unde NȘi M— numărul de fluxuri standard (0,1,2) sau nume de fișiere. Utilizarea simbolurilor în unele cazuri < , > Și >> fără specificarea numărului canalului sau a numelui fișierului este posibilă numai pentru că 1 este înlocuit implicit cu numărul lipsă, adică ieșirea standard. Da, operator > fără a specifica un număr se interpretează ca 1 > .

Pe lângă simpla redirecționare a fluxurilor standard, este posibil nu numai să redirecționați un flux către un canal sau altul, ci și să faceți o copie a conținutului fluxului standard. Există un simbol special pentru asta & , care este plasat în fața numărului canalului către care este redirecționat fluxul:

comanda N > &M

Această comandă înseamnă că ieșirea numărului canalului N este trimis atât la ieșirea standard, cât și duplicat în numărul canalului M. De exemplu, pentru ca mesajele de eroare să fie duplicate pe ieșirea standard, trebuie să dați comanda 2>&1, in timp ce 1>&2 dublează stdout la stderr. Această caracteristică este utilă în special atunci când redirecționăm rezultatul către un fișier, deoarece apoi vedem mesajele pe ecran și le salvăm în fișier.

5.5.2 Operator |

O opțiune specială pentru redirecționarea ieșirii este organizarea canal de programe(uneori numită conductă sau transportor). Pentru a face acest lucru, două sau mai multe comenzi, astfel încât ieșirea celei anterioare să servească drept intrare pentru următoarea, sunt conectate (sau separate, dacă preferați) prin simbol linie verticala- „|”. În acest caz, fluxul de ieșire standard al comenzii situat în stânga simbolului | , este trimis la intrarea standard a programului situată în dreapta simbolului | . De exemplu:

$ cat fisierul meu | grep Linux | wc -l

Această linie înseamnă că rezultatul comenzii este pisică, adică textul din fișierul myfile, va fi trimis la intrarea comenzii grep, care va evidenția doar liniile care conțin cuvântul „Linux”. Ieșire de comandă grep va fi, la rândul său, direcționat către intrarea comenzii wc -l, care va număra numărul de astfel de linii.

Canalele de program sunt folosite pentru a combina mai multe programe mici, fiecare dintre ele efectuând doar transformări specifice fluxului său de intrare, pentru a crea o instrucțiune generalizată care are ca rezultat o transformare mai complexă.

Trebuie remarcat faptul că shell-ul solicită simultan pentru execuție toate comenzile incluse în pipeline, lansând o instanță separată a shell-ului pentru fiecare dintre comenzi, astfel încât de îndată ce primul program începe să producă ceva în fluxul său de ieșire, următoarea comandă începe să o proceseze. În același mod, fiecare comandă ulterioară efectuează propria operație, așteptând datele de la comanda anterioară și producând rezultatele acesteia ca intrare a următoarei. Dacă doriți ca o comandă să se finalizeze complet înainte de a începe următoarea, o puteți utiliza pe o linie ca simbol de conductă | , și punct și virgulă ; . Înainte de fiecare punct și virgulă, shell-ul se va opri și va aștepta ca toate comenzile anterioare incluse în pipeline să se finalizeze execuția.

Starea de ieșire (valoarea booleană returnată după finalizarea programului) din conductă este aceeași cu starea de ieșire returnată de ultima comandă din conductă. Puteți pune un simbol „!” în fața primei comenzi a conductei, apoi starea de ieșire din conductă va fi negația logică a stării de ieșire din ultima comandă. Shell-ul așteaptă finalizarea tuturor comenzilor pipeline înainte de a seta valoarea returnată.

5.5.3 Filtre

Ultimul exemplu de mai sus (cu comanda grep) poate fi folosit pentru a ilustra un alt concept important, și anume programul de filtrare. Filtrele sunt comenzi (sau programe) care preiau un flux de date de intrare, efectuează unele transformări pe acesta și scot rezultatul la ieșirea standard (de unde poate fi redirecționat în altă parte, la discreția utilizatorului). Comenzile de filtrare includ comenzile deja menționate mai sus pisică, mai mult, mai puțin, wc, cmp, dif, precum și următoarele comenzi.

Tabelul 5.1. Comenzi de filtrare

Echipă

Scurta descriere

grep, fgrep, egrep

Căutați în fișierul de intrare sau date din standard șir de intrare, care conține modelul specificat și le scoate la ieșire standard

Înlocuiește toate caracterele care apar în fluxul de intrare listat în lista dată cu caracterele corespunzătoare din a doua listă specificată

comm

Compară două fișiere linie cu linie și scoate 3 coloane la ieșirea standard: una - linii care apar doar într-un fișier, a doua - linii care apar numai în al 2-lea fișier: și a treia - linii care apar în ambele fișiere

Formatează un fișier text sau conținutul unei intrări standard pentru imprimare

sed

Un editor de șiruri folosit pentru a efectua unele transformări în fluxul de date de intrare (luat dintr-un fișier sau de la intrare standard)

Un filtru special este comanda tricou, care „împarte” fluxul de intrare, direcționându-l pe de o parte către ieșirea standard, iar pe de altă parte către un fișier (al cărui nume trebuie să-l specificați). Este ușor de observat că prin acțiunea sa comanda tricou similar cu operatorul de redirecționare 1>&file.

Capacitățile filtrelor pot fi extinse semnificativ prin utilizarea expresii obisnuite, permițându-vă să organizați, de exemplu, o căutare folosind diverse șabloane, adesea foarte complexe.

S-ar putea spune multe despre redirecționare și filtre. Dar acest material este disponibil în majoritatea cărților despre UNIX și Linux, de exemplu Petersen [P1.4] și Kelly-Bootle [P1.8]. Prin urmare, ne vom limita la ceea ce s-a spus și vom trece la luarea în considerare a așa-numitului mediu sau mediu creat de coajă.

V. Kostromin (kos la rus-linux dot net) - 5.5. Redirecționare I/O, canale și filtre