Een Inleiding tot Linux I/O Omleiding

Introductie

De omleidingsmogelijkheden die zijn ingebouwd in Linux bieden u een robuuste set tools om veel workflows te optimaliseren. De “Unix-filosofie” van softwareontwikkeling was om tools te maken die elk één ding goed doen, en deze filosofie is doorgevoerd naar moderne opdrachtregelhulpprogramma’s, die elk afzonderlijk krachtig zijn, en exponentieel meer wanneer ze gecombineerd worden. Of u nu complexe software schrijft of gewoon op de opdrachtregel werkt, weten hoe u de verschillende I/O-streams in uw omgeving kunt manipuleren, zal uw productiviteit aanzienlijk verhogen.

Vereisten

Om deze handleiding te volgen, moet u toegang hebben tot een Linux-server. Als u informatie nodig heeft over hoe u voor de eerste keer verbinding kunt maken met uw server, kunt u onze handleiding volgen over het verbinden met een Linux-server via SSH.

Streams

Invoer en uitvoer in de Linux-omgeving worden verdeeld over drie streams. Deze streams zijn:

  • standaardinvoer (stdin)

  • standaarduitvoer (stdout)

  • standaardfout (stderr)

De streams zijn ook genummerd:

  • stdin (0)

  • stdout (1)

  • stderr (2)

Tijdens standaard interacties tussen de gebruiker en de terminal komt standaardinvoer van het toetsenbord van de gebruiker. Standaarduitvoer en standaardfout worden als tekst weergegeven op het terminal van de gebruiker. Gezamenlijk worden de drie streams aangeduid als de standaardstreams.

Standaardinvoer

De standaardinvoerstroom draagt typisch gegevens van een gebruiker naar een programma. Programma’s die standaardinvoer verwachten, ontvangen doorgaans invoer van een apparaat, zoals een toetsenbord. Later in deze handleiding zul je voorbeelden zien van het gebruik van de uitvoer van het ene programma als Standaardinvoer voor een ander programma.

Standaarduitvoer

Standaarduitvoer is de uitvoer die wordt gegenereerd door een programma. Wanneer de standaarduitvoerstroom niet wordt omgeleid, wordt tekst rechtstreeks naar het terminalvenster uitgevoerd. Probeer wat willekeurige tekst uit te voeren met behulp van echo:

  1. echo Sent to the terminal
Output
Sent to the terminal

Wanneer het zonder extra opties wordt gebruikt, geeft het echo-commando elk argument dat aan de opdrachtregel wordt doorgegeven weer.

Voer echo uit zonder argumenten:

  1. echo

Het zal een lege regel retourneren. Sommige programma’s doen niets zonder opgegeven argumenten.

Standaard Fout

Standaard fout bevat fouten die worden gegenereerd door een programma dat op een of andere manier is mislukt. Net als bij standaarduitvoer is het standaardbestemming voor deze stroom het terminaldisplay.

Laten we een basisvoorbeeld van standaard fouten bekijken met behulp van het ls-commando. ls geeft de inhoud van een directory weer.

Wanneer het zonder argument wordt uitgevoerd, geeft ls de inhoud weer binnen de huidige directory. Als ls met een directory als argument wordt uitgevoerd, wordt de inhoud van de opgegeven directory weergegeven.

  1. ls %

Aangezien % geen bestaande directory is, zal dit de volgende tekst naar de standaard fout sturen:

Output
ls: cannot access %: No such file or directory

A program does not have to crash or finish running in order to generate Standard Error, and whether some output is sent to either Standard Output or Standard Error is down to the behavior of the program. They are not technically different from one another in any way — just that one output stream is supposed to be reserved for error messages, and some tools will assume that Standard Error being empty means that a program ran successfully. Some programs will even output minor errors to Standard Error without crashing or failing to also produce the intended output. It is only used as a convention to separate intended output from unintended output.

Stroomomleiding

Linux bevat omleidingsopdrachten voor elk kanaal. Deze kunnen worden gebruikt om standaarduitvoer of standaardfout naar een bestand te schrijven. Als u naar een bestand schrijft dat niet bestaat, wordt er voor het schrijven een nieuw bestand met die naam aangemaakt.

Opdrachten met een enkele haak overschrijven de bestaande inhoud van de bestemming.

Overschrijven

  • > – standaarduitvoer

  • < – standaardinvoer

  • 2> – standaardfout

Opdrachten met een dubbele haak overschrijven niet de bestaande inhoud van de bestemming.

Bijvoegen

  • >> – standaarduitvoer

  • << – standaardinvoer

  • 2>> – standaardfout

Leidingen

Leidingen worden gebruikt om een stroom van het ene programma naar het andere om te leiden. Wanneer de standaarduitvoer van een programma via een pijp naar een ander programma wordt gestuurd, zal de uitvoer van het eerste programma als invoer voor het tweede worden gebruikt, in plaats van naar de terminal te worden afgedrukt. Alleen de gegevens die door het tweede programma worden geretourneerd, worden weergegeven.

De Linux pijp wordt weergegeven door een verticale balk: |

Hier is een voorbeeld van een opdracht met een pijp:

  1. ls | less

Dit neemt de uitvoer van ls, die de inhoud van uw huidige map weergeeft, en leidt het naar het programma less. Less geeft de ontvangen gegevens één regel tegelijk weer.

ls geeft normaal gesproken mapinhoud weer over meerdere rijen. Wanneer u het door less laat lopen, wordt elk item op een nieuwe regel geplaatst.

Hoewel de functionaliteit van de pijp misschien lijkt op die van > en >>, is het onderscheid dat pijpen gegevens van de ene opdracht naar de andere omleiden, terwijl > en >> exclusief worden gebruikt voor het omleiden naar bestanden.

Filters

Filters zijn een klasse van programma’s die vaak worden gebruikt met uitvoer die wordt doorgestuurd vanuit een ander programma. Velen van hen zijn ook op zichzelf nuttig, maar ze illustreren vooral goed het pijpgedrag.

  • find – retourneert bestanden met bestandsnamen die overeenkomen met het argument dat aan find is doorgegeven.

  • grep – retourneert tekst die overeenkomt met het stringpatroon dat aan grep is doorgegeven.

  • tee – leidt standaardinvoer om naar zowel standaarduitvoer als een of meer bestanden.

  • tr – vindt en vervangt een string door een andere.

  • wc – telt tekens, regels en woorden.

Voorbeelden

Nu je kennis hebt gemaakt met omleiding, pijpen en basisfilters, laten we eens kijken naar enkele veelvoorkomende omleidingspatronen en voorbeelden.

Het patroon command > file leidt de standaarduitvoer van een opdracht om naar een bestand.

  1. ls ~ > root_dir_contents.txt

De bovenstaande opdracht geeft de inhoud van je thuismap (~) door als standaarduitvoer en schrijft de uitvoer naar een bestand met de naam root_dir_contents.txt. Het zal eventuele eerdere inhoud in het bestand verwijderen, aangezien het een enkele haak-opdracht is.

Het patroon command > /dev/null leidt de standaarduitvoer naar nergens. /dev/null is een speciaal bestand dat wordt gebruikt om gegevens weg te gooien die ernaar worden omgeleid. Het wordt gebruikt om standaarduitvoer weg te gooien die niet nodig is en die anders de functionaliteit van een opdracht of script zou kunnen verstoren. Elke uitvoer die naar /dev/null wordt gestuurd, wordt verwijderd.

  1. ls > /dev/null

Deze opdracht verwerpt de standaarduitvoerstroom die wordt geretourneerd door de opdracht ls door deze naar /dev/null door te geven.

Dit patroon command 2> file leidt de standaardfoutstroom van een opdracht om naar een bestand en overschrijft bestaande inhoud.

  1. mkdir '' 2> mkdir_log.txt

Dit leidt de fout opgeworpen door de ongeldige mapnaam '' om en schrijft het naar log.txt. Let op dat de fout nog steeds naar de terminal wordt verzonden en als tekst wordt weergegeven.

Het patroon command >> file leidt de standaarduitvoer van een opdracht om naar een bestand zonder de bestaande inhoud van het bestand te overschrijven.

  1. echo Written to a new file > data.txt
  2. echo Appended content to an existing file >> data.txt

Deze reeks opdrachten leidt eerst de tekst ingevoerd door de gebruiker via echo om naar een nieuw bestand. Vervolgens voegt het de tekst toe die is ontvangen door de tweede echo-opdracht aan het bestaande bestand, zonder de inhoud ervan te overschrijven.

Het patroon command 2>> file hierboven leidt de standaardfoutstroom van een opdracht om naar een bestand zonder de bestaande inhoud van het bestand te overschrijven. Dit patroon is handig voor het maken van foutenlogs voor een programma of service, aangezien het logbestand niet telkens de vorige inhoud wordt gewist wanneer het bestand wordt beschreven.

  1. find '' 2> stderr_log.txt
  2. wc '' 2>> stderr_log.txt

De bovenstaande opdracht leidt het foutbericht veroorzaakt door een ongeldig zoekargument om naar een bestand met de naam stderr_log.txt. Het voegt vervolgens het foutbericht veroorzaakt door een ongeldig wc-argument toe aan hetzelfde bestand.

Het patroon command | command leidt de standaarduitvoer van de eerste opdracht om naar de standaardinvoer van de tweede opdracht.

  1. find /var lib | grep deb

Deze opdracht zoekt door /var en zijn submappen naar bestandsnamen en extensies die overeenkomen met de string deb, en retourneert de bestandspaden voor de bestanden, waarbij het overeenkomende deel in elk pad rood wordt gemarkeerd.

Het patroon command | tee file (waarin de tee-opdracht is opgenomen) leidt de standaarduitvoer van de opdracht om naar een bestand en overschrijft de inhoud ervan. Vervolgens wordt de omgeleide uitvoer weergegeven in de terminal. Er wordt een nieuw bestand gemaakt als het bestand nog niet bestaat.

In de context van dit patroon wordt tee typisch gebruikt om de uitvoer van een programma te bekijken terwijl deze tegelijkertijd wordt opgeslagen in een bestand.

  1. wc /etc/magic | tee magic_count.txt

Dit leidt de tellingen voor tekens, regels en woorden in het bestand /etc/magic (gebruikt door de Linux-shell om bestandstypen te bepalen) naar het tee-commando, dat vervolgens de uitvoer van wc in twee richtingen splitst en deze naar het terminalvenster en het bestand magic_count.txt stuurt. Voor het tee-commando kun je je de letter T voorstellen. Het onderste deel van de letter is de oorspronkelijke data, en het bovenste deel is de data die in twee verschillende richtingen wordt gesplitst (standaarduitvoer en het terminalvenster).

Er kunnen meerdere pipes worden gebruikt om de uitvoer naar meerdere commando’s en/of filters te leiden.

Conclusie

Het leren gebruiken van de omleidingsmogelijkheden die zijn ingebouwd in de Linux-opdrachtregel is een cruciale vaardigheid. Nu je de basisprincipes van omleidingen en pipes hebt gezien, kun je beginnen aan je reis in de wereld van shell-scripting, die veel gebruikmaakt van de programma’s en patronen die in deze handleiding worden benadrukt.

Het zoeken naar specifieke opdrachten, of naar iets dat je wilt doen in de opdrachtregel (bijv. “alle bestanden in een map verwijderen die beginnen met een hoofdletter”) kan ook nuttig zijn wanneer je een specifieke taak moet uitvoeren met behulp van de opdrachtregel.

Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-linux-i-o-redirection