Redirecționare intrare ieșire în exemple Linux/Unix

⚡ Rezumat inteligent

Redirecționarea în Linux și Unix modifică locul în care o comandă citește intrarea sau trimite ieșirea, swapping tastatura și ecranul pentru fișiere sau dispozitive care utilizează operatori precum semnul mai mare decât, semnul mai mic decât și operatorul de adăugare.

  • 🔀 Redirecționare: Redirecționarea modifică intrarea sau ieșirea standard a unei comenzi de la tastatură și ecran la un fișier sau dispozitiv.
  • ➡️ ieșire: Operatorul > scrie ieșirea într-un fișier, în timp ce >> adaugă un caracter la un fișier existent fără a-l șterge.
  • ⬅️ Intrare: Operatorul < introduce un fișier într-o comandă ca intrare standard în loc de tastatură.
  • 🔢 Descriptorii de fișiere: Fiecare fișier deschis primește un număr: 0 pentru stdin, 1 pentru stdout și 2 pentru stderr.
  • ⚠️ Redirecționare eroare: Utilizarea comenzii 2> trimite mesajele de eroare către un fișier separat, astfel încât acestea să nu aglomereze ieșirea normală.
  • 🔗 Fluxuri combinate: Sintaxa 2>&1 direcționează eroarea standard către aceeași țintă ca și ieșirea standard.
  • 🤖 Ajutor AI: Asistenții inteligenți artificiali și GitHub Copilot pot construi și explica comenzi de redirecționare și scripturi shell.

Redirecționare intrare-ieșire în Linux și Unix cu exemple

Redirecționarea este una dintre cele mai utile caracteristici ale Linux și shell-ul Unix, deoarece vă permite să decideți unde o comandă își citește intrarea și unde își trimite ieșirea. Această pagină explică redirecționarea ieșirii, intrării și erorilor cu exemple practice.

Ce este redirecționarea?

Redirecționarea este o caracteristică din Linux care permite, atunci când executați o comandă, să modificați dispozitivele standard de intrare și ieșire. Fluxul de lucru de bază al oricărui Comanda Linux este că primește o intrare și oferă o ieșire.

  • Dispozitivul de intrare standard (stdin) este tastatura.
  • Dispozitivul standard de ieșire (stdout) este ecranul.

Cu redirecționare, intrarea și ieșirea standard de mai sus pot fi modificate.

Redirecționare ieșire

Graficul de mai jos marchează începutul exemplelor de redirecționare a ieșirii.

Grafică a titlului secțiunii de redirecționare a ieșirii

Simbolul '>' este utilizat pentru redirecționarea ieșirii (STDOUT).

Exemplu:

ls -al > listings

Aici, rezultatul comenzii ls -al este redirecționat către fișierul „listings” în loc de ecranul dvs. Captura de ecran de mai jos prezintă rezultatul.

Terminalul care afișează listarea ls -al redirecționată către fișierul de listări

Notă: Folosiți numele de fișier corect atunci când redirecționați ieșirea comenzii către un fișier. Dacă există deja un fișier cu același nume, comanda redirecționată îi șterge conținutul și apoi îl suprascrie.

Dacă nu doriți ca un fișier să fie suprascris, dar doriți să adăugați mai mult conținut la un fișier existent, utilizați operatorul „>>”. Captura de ecran de mai jos arată conținutul căruia i s-a adăugat „>>”.

Terminal care afișează ieșirea comenzii adăugate la un fișier existent cu operatorul dublu mai mare decât

Puteți redirecționa ieșirea standard nu doar către fișiere, ci și către dispozitive.

$ cat music.mp3 > /dev/audio

Comanda cat citește fișierul music.mp3 și trimite ieșirea către /dev/audio, care este dispozitivul audio. Dacă configurația sunetului de pe PC este corectă, această comandă redă fișierul muzical.mp3.

Redirecționare de intrare

Graficul de mai jos prezintă redirecționarea inputului.

Grafică pentru titlul secțiunii de redirecționare a intrării

Simbolul „<” este utilizat pentru redirecționarea intrării (STDIN).

Exemplu: Programul de e-mail din Linux vă poate ajuta să trimiteți e-mailuri din terminal.

Puteți tasta conținutul e-mailului folosind tastatura, dispozitivul standard de introducere a datelor. Dar dacă doriți să atașați un fișier la e-mail, puteți utiliza operatorul de redirecționare a intrării în formatul următor.

mail -s "Subject" to-address < Filename

Captura de ecran de mai jos arată comanda mail citind un fișier ca intrare.

comandă mail care utilizează redirecționarea intrării pentru a atașa un fișier la un e-mail

Aceasta atașează fișierul la e-mail, iar acesta este trimis destinatarului.

Exemplele de mai sus au fost simple. Acum, să analizăm câteva tehnici avansate de redirecționare care utilizează descriptorii de fișiere.

Fișier Descriptsau (FD)

În Linux și Unix, totul este un fișier. Fișierele obișnuite, directoarele și chiar dispozitivele sunt fișiere. Fiecare fișier are un număr asociat numit descriptor de fișier (FD).

Diagrama de mai jos prezintă fluxurile standard și descriptorii lor de fișiere.

Diagrama fluxurilor standard de intrare, ieșire și eroare și a descriptorilor lor de fișiere

Ecranul are și un descriptor de fișier. Când un program este executat, ieșirea este trimisă către descriptorul de fișier al ecranului, iar rezultatul programului este afișat pe monitor. Dacă rezultatul ar fi trimis către descriptorul de fișier al imprimantei, rezultatul programului ar fi imprimat.

Redirecționare eroare

Ori de câte ori executați un program sau o comandă la terminal, trei fișiere sunt întotdeauna deschise, și anume intrarea standard, ieșirea standard și eroarea standard.

Aceste fișiere sunt întotdeauna prezente de fiecare dată când rulează un program. Așa cum s-a explicat anterior, fiecăruia dintre aceste fișiere îi este asociat un descriptor de fișier.

Fișier Fișier Descriptor
Intrare standard STDIN 0
Ieșire standard STDOUT 1
Eroare standard STDERR 2

În mod implicit, fluxul de erori este afișat pe ecran. Redirecționarea erorilor direcționează erorile către un alt fișier decât ecranul.

De ce redirecționarea erorilor?

Redirecționarea erorilor este una dintre caracteristicile foarte populare ale Unix și Linux.

Utilizatorii frecvenți de Unix știu că multe comenzi dau un număr masiv de erori. De exemplu, în timp ce cauți fișiere, de obicei primești permisiune erori refuzate, care de obicei nu ajută persoana care caută un anumit fișier. În timpul executării scripturilor shell, adesea nu doriți ca mesajele de eroare să aglomereze ieșirea normală a programului.

Soluția este redirecționarea mesajelor de eroare către un fișier.

Exemplu 1

$ myprogram 2>errorsfile

Captura de ecran de mai jos prezintă această comandă în terminal.

Terminalul care rulează myprogram cu eroarea standard redirecționat către fișierul errorsfile

Mai sus, executăm un program numit programul_myprogram. Descriptorul de fișier pentru eroarea standard este 2. Folosind „2>”, redirecționăm ieșirea erorii către un fișier numit „errorsfile”. Astfel, ieșirea programului nu este aglomerată cu erori.

Exemplu 2

Iată un alt exemplu care utilizează instrucțiunea find.

find . -name 'my*' 2>error.log

Folosind comanda find, căutăm în directorul curent „.” un fișier al cărui nume începe cu „my” și trimitem orice erori către error.log.

Exemplu 3: Să luăm în considerare un exemplu mai complex.

Administratorii de server listează frecvent directoare și stochează atât erorile, cât și ieșirea standard într-un fișier, care poate fi procesat ulterior. Iată comanda.

ls Documents ABC> dirlist 2>&1

Diagrama de mai jos arată ambele fluxuri capturate într-un singur fișier.

Diagrama ieșirii standard și a erorii standard, ambele redirecționate către fișierul dirlist

Aici:

  • 2>&1 înseamnă că STDERR este redirecționat către aceeași țintă ca și STDOUT (care este fișierul dirlist).
  • Ieșirea de eroare este redirecționată către ieșirea standard, care la rândul ei este redirecționată către fișierul dirlist. Prin urmare, ambele fluxuri sunt scrise în fișierul dirlist.

Diagrama de mai jos rezumă modul în care se potrivesc redirecționarea intrării, ieșirii și erorii.

Diagramă care rezumă intrarea, ieșirea și redirecționarea erorilor în Linux și Unix

Întrebări frecvente

A ţeavă (|) trimite ieșirea unei comenzi direct către o altă comandă ca intrare. Redirecționarea conectează în schimb o comandă la un fișier sau dispozitiv, scriind ieșirea în acesta sau citind intrarea din acesta. Prin conducte se unesc comenzile; redirecționarea unește o comandă cu un fișier.

Operatorul > scrie ieșirea unei comenzi într-un fișier, înlocuind orice conținut existent. Operatorul >> adaugă ieșirea la sfârșitul fișierului, keeping ce există deja. Folosește >> ori de câte ori dorești să adaugi ceva la un fișier, în loc să îl suprascrii.

/dev/null este un fișier special care șterge tot ce este scris în el. Adăugarea comenzii 2>/dev/null la o comandă redirecționează mesajele de eroare către fișierul respectiv, eliminându-le în mod silențios, astfel încât pe ecran să apară doar ieșirea normală. Este o modalitate obișnuită de a ascunde aglomerația de erori nedorite.

Comanda tee citește din intrarea standard și scrie datele atât pe ecran, cât și pe unul sau mai multe fișiere simultan, de exemplu ls -al | tee listing.txt. Vă permite să salvați ieșirea unei comenzi într-un fișier în timp ce o vizualizați în continuare pe ecran.

Un document `here` folosește operatorul << pentru a introduce mai multe linii de text în linie într-o comandă, terminându-se cu un cuvânt marker ales de dvs. Este util în scripturile shell pentru transmiterea de date de intrare pe mai multe linii, cum ar fi corpul unui e-mail, fără un fișier separat.

Folosește sintaxa 2>&1 după redirecționarea ieșirii, ca în comanda > fișier 2>&1, astfel încât eroarea standard urmează ieșirea standard în fișier. În Bash modern, comanda prescurtată &> fișier face același lucru. Ordinea contează: plasează 2>&1 după redirecționarea ieșirii.

Asistenții inteligenți artificiali pot transforma o solicitare scrisă în limba engleză simplă în comanda de redirecționare corectă, pot explica ce fac operatori precum 2>&1 sau &> și pot semnala greșelile înainte de a le executa. Instrumentele de învățare automată scanează, de asemenea, fișierele de jurnal și de eroare redirecționate pentru a identifica anomalii pe care revizuirea manuală le-ar rata.

Da. Copilotul GitHub poate genera comenzi și scripturi care redirecționează datele de intrare, ieșire și erori dintr-un scurt comentariu care descrie obiectivul și le completează pe măsură ce tastați. RevVizualizați orice comandă sugerată pentru fișierele dvs., în special cele care utilizează > și care suprascriu datele existente.

Rezumați această postare cu: