Omleiding (informatica) - Redirection (computing)
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
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
- Here-document , een manier om tekst te specificeren voor invoer in opdrachtregelshells
- Shell scheppen
- Opdrachtvervanging
- Procesvervanging
Externe links
- : dupliceer een open bestandsdescriptor – Referentie voor systeeminterfaces, de Single UNIX-specificatie , uitgave 7 van The Open Group
- Omleidingsdefinitie door The Linux Information Project (LINFO)
- I/O-omleiding in het Linux-documentatieproject
- Omleiding in Windows
- Een onderliggend proces maken met omgeleide invoer en uitvoer in Windows