Omleiding (informatica) - Redirection (computing)

Image
De standaard streams voor invoer, uitvoer en fouten

In informatica is omleiding een vorm van communicatie tussen processen en een functie die de meeste opdrachtregelinterpreters gemeen hebben , inclusief de verschillende Unix-shells die standaardstreams kunnen omleiden naar door de gebruiker gespecificeerde locaties.

In Unix-achtige besturingssystemen doen programma's omleiding met de dup2 (2) systeemaanroep , of zijn minder flexibele maar hogere stdio- analogen, freopen (3) en popen (3) .

Standaardinvoer en standaarduitvoer omleiden

Omleiding wordt meestal geïmplementeerd door bepaalde tekens tussen opdrachten te plaatsen .

Basis

Doorgaans is de syntaxis van deze tekens als volgt, waarbij <de invoer wordt >omgeleid en de uitvoer wordt omgeleid. command > file1voert command1 uit , waarbij de uitvoer in file1 wordt geplaatst , in plaats van deze op de terminal weer te geven, wat de gebruikelijke bestemming is voor standaarduitvoer. Dit zal afranselen alle bestaande data in file1 .

Gebruik command < file1voert command1 uit , met file1 als invoerbron, in tegenstelling tot het toetsenbord , dat de gebruikelijke bron is voor standaardinvoer.

command < infile > outfilecombineert de twee mogelijkheden: command1 leest van infile en schrijft naar outfile

varianten

Om uitvoer aan het einde van het bestand toe te voegen, in plaats van het te verprutsen, wordt de >>operator gebruikt: command1 >> file1.

Om uit een letterlijke stroom te lezen (een inline-bestand, doorgegeven aan de standaardinvoer), kan men een here document gebruiken , met behulp van de <<operator:

$ tr a-z A-Z << END_TEXT
> one two three
> uno dos tres
> END_TEXT
ONE TWO THREE
UNO DOS TRES

Om uit een string te lezen, kan men een here string gebruiken , met de <<<operator: , of: tr a-z A-Z <<< "one two three"

$ NUMBERS="one two three"
$ tr a-z A-Z <<< "$NUMBERS"
ONE TWO THREE

Leidingen

Image
Een pijplijn van drie programma's draait op een tekstterminal

Programma's kunnen zo samen worden uitgevoerd dat het ene programma de uitvoer van het andere leest zonder dat een expliciet tussenbestand nodig is. voert command1 uit , waarbij de uitvoer wordt gebruikt als invoer voor command2 (gewoonlijk piping genoemd , waarbij het " "-teken bekend staat als de "pipe"). command1 | command2|

De twee programma's die de commando's uitvoeren, kunnen parallel lopen, waarbij de enige opslagruimte de werkbuffers zijn (Linux staat tot 64K voor elke buffer toe) plus de werkruimte die de verwerking van elk commando nodig heeft. Een "sorteer"-opdracht kan bijvoorbeeld geen uitvoer produceren totdat alle invoerrecords zijn gelezen, omdat de allerlaatste record die is ontvangen misschien als eerste in gesorteerde volgorde blijkt te zijn. Het experimentele besturingssysteem van Dr. Alexia Massalin, Synthesis , zou de prioriteit van elke taak aanpassen terwijl ze werden uitgevoerd volgens de volheid van hun invoer- en uitvoerbuffers.

Dit levert hetzelfde eindresultaat op als het gebruik van twee omleidingen en een tijdelijk bestand, zoals in:

$ command1 > tempfile
$ command2 < tempfile
$ rm tempfile

Maar hier begint command2 pas met uitvoeren als command1 klaar is, en er is een voldoende groot scratch-bestand nodig om de tussentijdse resultaten vast te houden, evenals de werkruimte die elke taak nodig heeft. Als voorbeeld, hoewel DOS de "pipe"-syntaxis toestaat, gebruikt het deze tweede benadering. Stel dat een langlopend programma "Worker" verschillende berichten produceert terwijl het werkt, en dat een tweede programma, TimeStamp, elk record kopieert van stdin naar stdout , voorafgegaan door de datum en tijd van het systeem waarop het record wordt ontvangen. Een reeks zoals die alleen tijdstempels zou produceren als Worker klaar was, liet alleen zien hoe snel het uitvoerbestand kon worden gelezen en geschreven. Worker | TimeStamp > LogFile.txt

Een goed voorbeeld van command piping is het combineren echomet een ander commando om iets interactiefs te bereiken in een niet-interactieve shell, bijv . . Dit voert de ftp- client uit met invoer gebruiker , druk op return en pass . echo -e 'user\npass' | ftp localhost

Bij incidenteel gebruik is de eerste stap van een pijplijn vaak catof echo, lezen uit een bestand of string. Dit kan vaak worden vervangen door input-indirection of een here-string , en het gebruik van cat en piping in plaats van input-omleiding staat bekend als nutteloos gebruik van cat . Bijvoorbeeld de volgende opdrachten:

$ cat infile | command
$ echo $string | command
$ echo -e 'user\npass' | ftp localhost

kan worden vervangen door:

$ command < infile
$ command <<< $string
$ ftp localhost <<< $'user\npass'

Zoals echovaak een shell-intern commando is, wordt het gebruik ervan niet zo bekritiseerd als cat, wat een extern commando is.

Omleiden van en naar de standaard bestandshandvatten

In Unix-shells die zijn afgeleid van de originele Bourne-shell , kunnen de eerste twee acties verder worden gewijzigd door een nummer (de bestandsdescriptor ) direct voor het teken te plaatsen ; dit heeft invloed op welke stream wordt gebruikt voor de omleiding. De Unix standaard I/O-streams zijn:

Handvat Naam Beschrijving
0 standaard Standaard invoer
1 stout Standaard uitvoer
2 stderr Standaardfout

Voert bijvoorbeeld command uit , waarbij de standaardfoutstroom naar file1 wordt geleid . command 2> file1

In shells die zijn afgeleid van csh (de C-shell ), voegt de syntaxis in plaats daarvan het & (ampersand) teken toe aan de omleidingstekens, waardoor een vergelijkbaar resultaat wordt bereikt. De reden hiervoor is om onderscheid te maken tussen een bestand met de naam '1' en stdout, dat wil zeggen vs . In het eerste geval wordt stderr omgeleid naar een bestand met de naam ' 1 ' en in het tweede geval wordt stderr omgeleid naar stdout. cat file 2>1cat file 2>&1

Een andere handige mogelijkheid is om de ene standaard bestandshandle om te leiden naar een andere. De meest populaire variant is om standaardfout samen te voegen met standaarduitvoer, zodat foutmeldingen samen met (of afwisselend met) de gebruikelijke uitvoer kunnen worden verwerkt. Zal bijvoorbeeld proberen alle bestanden met de naam .profile te vinden . Uitgevoerd zonder omleiding, zal het treffers uitvoeren naar stdout en fouten (bijv. wegens gebrek aan privilege om beschermde mappen te doorkruisen) naar stderr . Als standaard output is gericht op file resultaten , foutmeldingen op de console. Om zowel hits en foutmeldingen in het dossier te zien resultaten , merge stderr (handvat 2) in stdout (handle 1) met behulp van . find / -name .profile > results 2>&12>&1

Als de samengevoegde uitvoer naar een ander programma moet worden doorgesluisd, moet de volgorde 2>&1voor het samenvoegen van bestanden voorafgaan aan het pijpsymbool, dusfind / -name .profile 2>&1 | less

Een vereenvoudigde maar niet POSIX-conforme vorm van het commando is (niet beschikbaar in Bourne Shell vóór versie 4, definitieve versie, of in de standaard shell Debian Almquist shell die wordt gebruikt in Debian/Ubuntu): of . command > file 2>&1command &>filecommand >&file

Het is mogelijk om 2>&1vóór " >" te gebruiken, maar het resultaat wordt vaak verkeerd begrepen. De regel is dat elke omleiding de handle onafhankelijk instelt op de uitvoerstroom. Dus " 2>&1" stelt handle 2in 1op datgene waar handle naar verwijst , wat op dat moment meestal stdout is . Dan is " >" omleidingen handvat 1om iets anders, bijvoorbeeld een bestand, maar het maakt niet handvat te veranderen 2, die nog steeds wijst naar stdout .

In het volgende voorbeeld wordt standaarduitvoer naar file geschreven , maar worden fouten omgeleid van stderr naar stdout, dwz naar het scherm gestuurd: . command 2>&1 > file

Om zowel fouten als standaarduitvoer naar bestand te schrijven , moet de volgorde worden omgekeerd. Standaarduitvoer zou eerst worden omgeleid naar het bestand, daarna zou stderr bovendien worden omgeleid naar de stdout-handle die al is gewijzigd om naar het bestand te wijzen: . command > file 2>&1

Geketende pijpleidingen

De tokens voor omleiding en piping kunnen aan elkaar worden gekoppeld om complexe opdrachten te maken. Sorteert bijvoorbeeld de regels van het infile in lexicografische volgorde, schrijft unieke regels voorafgegaan door het aantal keren dat het voorkomt, sorteert de resulterende uitvoer numeriek en plaatst de uiteindelijke uitvoer in outfile . Dit type constructie wordt heel vaak gebruikt in shellscripts en batchbestanden . sort infile | uniq -c | sort -n > outfile

Omleiden naar meerdere uitgangen

Het standaard commando- T-stuk kan de uitvoer van een commando naar verschillende bestemmingen omleiden: . Dit leidt de uitvoer van de bestandenlijst naar zowel de standaarduitvoer als het bestand xyz . ls -lrt | tee xyz

Zie ook

Externe links