Omleiding van invoer en uitvoer in Linux/Unix-voorbeelden

⚡ Slimme samenvatting

In Linux en Unix verandert omleiding de locatie waar een commando invoer leest of uitvoer verzendt (swap).ping Het toetsenbord en scherm voor bestanden of apparaten die gebruikmaken van operatoren zoals het groter-dan-teken, het kleiner-dan-teken en de toevoegoperator.

  • 🔀 omleiding: Omleiding wijzigt de standaardinvoer of -uitvoer van een commando van het toetsenbord en scherm naar een bestand of apparaat.
  • ➡️ Output: De operator > schrijft uitvoer naar een bestand, terwijl >> aan een bestaand bestand wordt toegevoegd zonder het te wissen.
  • ⬅️ Input: De operator < gebruikt een bestand als standaardinvoer voor een opdracht in plaats van het toetsenbord.
  • 🔢 Bestandsbeschrijvingen: Aan elk geopend bestand wordt een nummer toegekend: 0 voor stdin, 1 voor stdout en 2 voor stderr.
  • ⚠️ Fout bij omleiding: Door 2> te gebruiken, worden foutmeldingen naar een apart bestand gestuurd, zodat ze de normale uitvoer niet vervuilen.
  • 🔗 Gecombineerde streams: De syntaxis 2>&1 stuurt de standaardfout naar dezelfde bestemming als de standaarduitvoer.
  • 🤖 AI-ondersteuning: AI-assistenten en GitHub Copilot kunnen omleidingsopdrachten en shellscripts bouwen en uitleggen.

Invoer-uitvoeromleiding in Linux en Unix met voorbeelden

Doorverwijzing is een van de meest nuttige functies van de Linux en de Unix-shell, omdat je daarmee kunt bepalen waar een commando zijn invoer leest en zijn uitvoer naartoe stuurt. Deze pagina legt uitvoer-, invoer- en foutomleiding uit met uitgewerkte voorbeelden.

Wat is omleiding?

Omleiding is een functie in Linux waarmee je, tijdens het uitvoeren van een commando, de standaard invoer- en uitvoerapparaten kunt wijzigen. De basisworkflow van elke Linux-commando Het principe is dat het een invoer ontvangt en een uitvoer geeft.

  • Het standaard invoerapparaat (stdin) is het toetsenbord.
  • Het standaarduitvoerapparaat (stdout) is het scherm.

Met omleiding kunnen de bovenstaande standaardinvoer en -uitvoer worden gewijzigd.

Uitvoer omleiding

De onderstaande afbeelding markeert het begin van de voorbeelden van uitvoeromleiding.

Afbeelding van de kop van de sectie voor uitvoeromleiding

Het symbool '>' wordt gebruikt voor het omleiden van uitvoer (STDOUT).

Voorbeeld:

ls -al > listings

Hier wordt de uitvoer van het commando `ls -al` omgeleid naar het bestand "listings" in plaats van naar je scherm. De onderstaande schermafbeelding toont het resultaat.

Terminal toont de uitvoer van `ls -al`, die is omgeleid naar het bestand met de lijstweergave.

Let op: Gebruik de juiste bestandsnaam bij het omleiden van de uitvoer van een opdracht naar een bestand. Als er al een bestand met dezelfde naam bestaat, verwijdert de omgeleide opdracht de inhoud ervan en overschrijft het vervolgens.

Als u een bestand niet wilt overschrijven, maar wel inhoud aan een bestaand bestand wilt toevoegen, gebruik dan de operator '>>'. De onderstaande schermafbeelding laat zien hoe inhoud is toegevoegd met '>>'.

Terminal toont de uitvoer van een opdracht die is toegevoegd aan een bestaand bestand met de dubbele groter-dan-operator.

Je kunt de standaarduitvoer niet alleen naar bestanden, maar ook naar apparaten omleiden.

$ cat music.mp3 > /dev/audio

Het commando `cat` leest het bestand `music`.mp3 en stuurt de uitvoer naar /dev/audio, wat het audioapparaat is. Als de geluidsconfiguratie op uw pc correct is, speelt dit commando het muziekbestand af.mp3.

Invoeromleiding

De onderstaande afbeelding illustreert invoeromleiding.

Afbeelding van de sectiekop voor invoeromleiding

Het symbool '<' wordt gebruikt voor het omleiden van invoer (STDIN).

Voorbeeld: Met het mailprogramma in Linux kun je e-mails versturen vanuit de terminal.

Je kunt de inhoud van de e-mail typen met het toetsenbord, het standaard invoerapparaat. Maar als je een bestand aan de e-mail wilt toevoegen, kun je de invoeromleidingsoperator gebruiken in het volgende formaat.

mail -s "Subject" to-address < Filename

De onderstaande schermafbeelding laat zien hoe het mailcommando een bestand als invoer leest.

Een mailopdracht gebruiken om een ​​bestand aan een e-mail toe te voegen met behulp van invoeromleiding.

Hiermee wordt het bestand aan de e-mail toegevoegd en naar de ontvanger verzonden.

De bovenstaande voorbeelden waren eenvoudig. Laten we nu eens kijken naar enkele geavanceerde omleidingstechnieken die gebruikmaken van bestandsdescriptors.

Dien in Descriptoren (FD)

In Linux en Unix is ​​alles een bestand. Gewone bestanden, mappen en zelfs apparaten zijn bestanden. Elk bestand heeft een bijbehorend nummer, een zogenaamde bestandsdescriptor (FD).

Het onderstaande diagram toont de standaardstreams en hun bestandsdescriptors.

Diagram van de standaard invoer-, uitvoer- en foutstromen en hun bestandsdescriptors.

Je scherm heeft ook een bestandsdescriptor. Wanneer een programma wordt uitgevoerd, wordt de uitvoer naar de bestandsdescriptor van het scherm gestuurd en zie je de programma-uitvoer op je monitor. Als de uitvoer naar de bestandsdescriptor van de printer zou worden gestuurd, zou de programma-uitvoer worden afgedrukt.

Foutomleiding

Wanneer je een programma of commando uitvoert in de terminal, zijn er altijd drie bestanden geopend: standaardinvoer, standaarduitvoer en standaardfout.

Deze bestanden zijn altijd aanwezig wanneer een programma wordt uitgevoerd. Zoals eerder uitgelegd, is aan elk van deze bestanden een bestandsdescriptor gekoppeld.

Dien in Dien in Descriptor
Standaard invoer STDIN 0
Standaarduitvoer STDOUT 1
Standaardfout STDERR 2

Standaard wordt de foutmelding op het scherm weergegeven. Foutomleiding zorgt ervoor dat de foutmeldingen naar een ander bestand dan het scherm worden doorgestuurd.

Waarom foutomleiding?

Foutafhandeling is een van de meest populaire functies van Unix en Linux.

Ervaren Unix-gebruikers weten dat veel commando's enorme hoeveelheden foutmeldingen geven. Bijvoorbeeld, bij het zoeken naar bestanden krijg je vaak de volgende foutmelding: toestemming Foutmeldingen zoals "toegang geweigerd" helpen de persoon die naar een specifiek bestand zoekt meestal niet. Bij het uitvoeren van shellscripts wil je vaak geen foutmeldingen die de normale programma-uitvoer onoverzichtelijk maken.

De oplossing is om de foutmeldingen naar een bestand door te sturen.

Voorbeeld 1

$ myprogram 2>errorsfile

De onderstaande schermafbeelding toont dit commando in de terminal.

Terminal voert mijn programma uit, waarbij de standaardfout wordt omgeleid naar het bestand errorsfile.

Hierboven voeren we een programma uit met de naam myprogram. De bestandsdescriptor voor standaardfout is 2. Met "2>" leiden we de foutmeldingen om naar een bestand met de naam "errorsfile". Op deze manier wordt de programma-uitvoer niet overspoeld met foutmeldingen.

Voorbeeld 2

Hier is nog een voorbeeld waarin de find-opdracht wordt gebruikt.

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

Met behulp van het `find`-commando zoeken we in de huidige map "." naar een bestand waarvan de naam begint met "my", en sturen we eventuele fouten naar `error.log`.

Voorbeeld 3: Laten we eens naar een complexer voorbeeld kijken.

Serverbeheerders maken vaak een lijst van mappen en slaan zowel foutmeldingen als standaarduitvoer op in een bestand, dat later kan worden verwerkt. Hier is het commando.

ls Documents ABC> dirlist 2>&1

Het onderstaande diagram laat zien dat beide streams in één bestand worden vastgelegd.

Diagram van de standaarduitvoer en standaardfout, beide omgeleid naar de bestandsdirectory.

Hier:

  • 2>&1 betekent dat STDERR wordt omgeleid naar dezelfde bestemming als STDOUT (namelijk de bestandsdirectorylijst).
  • De foutmelding wordt omgeleid naar de standaarduitvoer, die op zijn beurt wordt omgeleid naar het bestand dirlist. Beide streams worden dus naar het bestand dirlist geschreven.

Het onderstaande diagram geeft een overzicht van hoe invoer, uitvoer en foutafhandeling op elkaar aansluiten.

Diagram dat de omleiding van invoer, uitvoer en fouten in Linux en Unix samenvat.

Veelgestelde vragen

A pijp (|) stuurt de uitvoer van een commando rechtstreeks naar een ander commando als invoer. Omleiding verbindt een commando daarentegen met een bestand of apparaat, waarbij de uitvoer ernaar wordt geschreven of de invoer ervan wordt gelezen. Pijpen verbinden commando's; omleiding verbindt een commando met een bestand.

De operator > schrijft de uitvoer van een commando naar een bestand en vervangt daarbij de bestaande inhoud. De operator >> voegt de uitvoer in plaats daarvan toe aan het einde van het bestand.ping Wat er al staat. Gebruik >> wanneer je iets aan een bestand wilt toevoegen in plaats van het te overschrijven.

/dev/null is een speciaal bestand dat alles wat erin wordt geschreven, negeert. Door 2>/dev/null aan een commando toe te voegen, worden de foutmeldingen naar dat bestand omgeleid en worden ze stilzwijgend verwijderd, zodat alleen de normale uitvoer op het scherm verschijnt. Het is een veelgebruikte manier om ongewenste foutmeldingen te verbergen.

Het `tee`-commando leest de standaardinvoer en schrijft de gegevens tegelijkertijd naar het scherm en één of meerdere bestanden, bijvoorbeeld `ls -al | tee listing.txt`. Hiermee kun je de uitvoer van een commando opslaan in een bestand terwijl je deze nog steeds op het scherm kunt bekijken.

Een here document gebruikt de << operator om meerdere regels inline tekst als invoer aan een commando te geven, eindigend bij een markeringswoord naar keuze. Dit is handig in shellscripts om invoer over meerdere regels, zoals de inhoud van een e-mail, door te geven zonder een apart bestand.

Gebruik de syntaxis 2>&1 na het omleiden van de uitvoer, zoals in `command > file 2>&1`, zodat de standaardfout na de standaarduitvoer naar het bestand wordt geschreven. In moderne Bash doet de verkorte opdracht `&> file` hetzelfde. De volgorde is belangrijk: plaats 2>&1 na de uitvoeromleiding.

AI-assistenten kunnen een eenvoudig Engels verzoek omzetten in het juiste omleidingscommando, uitleggen wat operators zoals 2>&1 of &> doen, en fouten signaleren voordat je ze uitvoert. Machine learning-tools scannen ook omgeleide log- en foutbestanden om afwijkingen op te sporen die bij handmatige controle over het hoofd zouden worden gezien.

Ja. GitHub-copiloot Kan opdrachten en scripts genereren die invoer, uitvoer en fouten omleiden op basis van een korte opmerking die het doel beschrijft, en deze aanvullen terwijl u typt. RevBekijk alle voorgestelde commando's voor uw bestanden, vooral commando's die > gebruiken en bestaande gegevens overschrijven.

Vat dit bericht samen met: