Console-uitvoer opslaan in een bestand. Streams, programmakanalen en omleidingen

Operators voor het omleiden van opdrachten worden gebruikt om de standaardlocaties van opdrachtinvoer- en uitvoerstromen naar een andere locatie te wijzigen. De locatie van de invoer- en uitvoerstromen wordt een handle genoemd.

In de volgende tabel worden operatoren voor het omleiden van opdrachtinvoer en -uitvoer beschreven.

OmleidingsoperatorBeschrijving
> Schrijft de uitvoer van een opdracht in plaats van de opdrachtregel naar een bestand of apparaat zoals een printer.
< Leest de opdrachtinvoerstroom uit een bestand in plaats van vanaf het toetsenbord.
>> Voegt de opdrachtuitvoer toe aan het einde van het bestand zonder bestaande informatie uit het bestand te verwijderen.
>& Leest de uitvoer van één descriptor als invoer voor een andere descriptor.
<& Leest de invoer van één handle als de uitvoer van een andere handle.
| Leest de uitvoer van één commando en schrijft deze naar de invoer van een ander commando. Deze procedure staat bekend als channeling.

Standaard wordt de opdrachtinvoer (STDIN-handle) vanaf het toetsenbord naar de opdrachtinterpreter Cmd.exe verzonden, waarna Cmd.exe de opdrachtuitvoer (STDOUT-handle) naar het opdrachtpromptvenster verzendt.

De volgende tabel toont de beschikbare descriptoren.

De cijfers 0 tot en met 9 vertegenwoordigen de eerste 10 descriptoren. De opdrachtinterpreter Cmd.exe wordt gebruikt om het programma uit te voeren en een van de 10 handvatten om te leiden. Om de vereiste handle op te geven, voert u het nummer ervan in vóór de omleidingsoperator. Als de handle niet is gedefinieerd, wordt standaard de operator voor invoeromleiding "<» будет ноль (0), а оператором перенаправления вывода «>" zal één (1) zijn. Na het invoeren van de operator "<» или «>"Het is noodzakelijk om aan te geven waar gegevens moeten worden gelezen en waar gegevens moeten worden geschreven. U kunt de bestandsnaam of een van de bestaande descriptors opgeven.

Om de omleiding naar bestaande ingangen op te geven, gebruikt u een ampersand (&), gevolgd door het nummer van de gewenste ingang (bijvoorbeeld & handvat_nummer). Als u bijvoorbeeld handle 2 (STDERR) wilt omleiden naar handle 1 (STDOUT), voert u het volgende in:

Dubbele beschrijvingen

De omleidingsoperator "&" dupliceert de uitvoer of invoer van de ene gespecificeerde handle naar een andere gespecificeerde handle. Als u bijvoorbeeld de uitvoer van de opdracht dir naar File.txt wilt sturen en de foutuitvoer naar File.txt, typt u:

dir>c:\bestand.txt 2>&1

Bij het dupliceren van een descriptor worden alle oorspronkelijke kenmerken gekopieerd.

Als een handle bijvoorbeeld alleen-schrijven is, zijn alle duplicaten ervan alleen-schrijven. U kunt een alleen-lezen-ingang niet dupliceren naar een alleen-schrijven-ingang.<)

Omleiding opdrachtinvoer (<». Например, для ввода команды sort из файла List.txt введите:

Om numerieke toetsenbordopdrachten om te leiden naar een bestand of apparaat, gebruikt u de "

soort

De inhoud van File.txt verschijnt op de opdrachtregel als een lijst in alfabetische volgorde.<» открывает заданное имя файла с доступом только для чтения. Поэтому с его помощью нельзя записывать в файл. Например, при запуске программы с оператором <&2 все попытки прочитать дескриптор 0 ни к чему не приведут, так как изначально он был открыт с доступом только для записи.

Exploitant "

  • Opmerking<».

Handle 0 is de standaardwaarde voor de operator voor invoeromleiding "

Commando-uitvoer omleiden (>)

De uitvoer van bijna alle opdrachten wordt weergegeven in het opdrachtpromptvenster. Zelfs opdrachten die gegevens naar schijf of een printer uitvoeren, produceren berichten en aanwijzingen in het opdrachtpromptvenster.

Om de uitvoer van opdrachten vanuit het opdrachtpromptvenster om te leiden naar een bestand of apparaat, gebruikt u de operator ">". Deze operator wordt bij de meeste opdrachten gebruikt. Als u bijvoorbeeld de uitvoer van het dir-commando wilt omleiden naar het bestand Dirlist.txt, voert u het volgende in:

map>maplijst.txt Als het bestand Dirlist.txt niet bestaat, zal de opdrachtinterpreter Cmd.exe het maken. Als het bestand bestaat, vervangt Cmd.exe de informatie in het bestand door de gegevens die zijn ontvangen van de opdracht.

richt Om de opdracht uit te voeren netsh-routeringsdump

en vervolgens de resultaten van zijn werk naar Route.cfg verzendt, voert u het volgende in:

netsh-routeringsdump > c:\route.cfg<&0 все попытки записать дескриптор 1 ни к чему не приведут, так как изначально дескриптор 0 был открыт с доступом только для чтения.

De operator ">" opent het opgegeven bestand met alleen-schrijven-toegang. Daarom kan het bestand niet worden gelezen met deze operator. Bijvoorbeeld wanneer u een programma uitvoert met een omleidingsoperator

  • Opmerking.

Handle 1 is de standaardwaarde voor de uitvoeromleidingsoperator ">".<&» для перенаправления ввода и дублирования

De operator gebruiken "

Als u de operator voor invoeromleiding wilt gebruiken, moet het opgegeven bestand al bestaan. Als het invoerbestand bestaat, opent de opdrachtinterpreter Cmd.exe het met alleen-lezen toegang en verzendt de inhoud ervan naar de opdracht alsof het numerieke toetsenbordinvoer is. Wanneer een handle is opgegeven, dupliceert de opdrachtinterpreter Cmd.exe deze naar een handle die op het systeem aanwezig is.

Als u bijvoorbeeld File.txt in invoerdescriptor 0 (STDIN) wilt lezen, voert u het volgende in:

Om numerieke toetsenbordopdrachten om te leiden naar een bestand of apparaat, gebruikt u de "< file.txt

Om een ​​File.txt-bestand te openen, de inhoud ervan te sorteren en het vervolgens naar een opdrachtpromptvenster (STDOUT) te sturen, typt u:

Om File.txt te vinden en handle 1 (STDOUT) en handle 2 (STDERR) om te leiden naar Search.txt, voert u het volgende in:<&1

Om door de gebruiker gedefinieerde descriptor 3 te dupliceren als invoer voor descriptor 0 (STDIN), voert u het volgende in:

De operator ">&" gebruiken om invoer om te leiden en te dupliceren

Wanneer u de uitvoer naar een bestand omleidt en een bestaande bestandsnaam opgeeft, opent de opdrachtinterpreter Cmd.exe het bestand met alleen-schrijven-toegang en overschrijft de inhoud ervan. Als er een handle is opgegeven, dupliceert de opdrachtinterpreter Cmd.exe het bestand naar de bestaande handle.

Om door de gebruiker gedefinieerde descriptor 3 te dupliceren naar descriptor 1, voert u het volgende in:


Om alle uitvoer om te leiden, inclusief descriptor 2-uitvoer (STDERR), moeten de commando's ipconfig in handle 1 (STDOUT) en vervolgens de uitvoer omleiden naar Output.log, voer het volgende in:


ipconfig.exe>>output.log 2>&1

De operator ">>" gebruiken om uitvoer toe te voegen

Om de uitvoer van een opdracht aan het einde van een bestand toe te voegen zonder de daarin opgeslagen informatie te verliezen, gebruikt u een dubbel groter dan-teken (>>). Met de volgende opdracht wordt bijvoorbeeld de directorylijst toegevoegd die door de opdracht is gemaakt Als het bestand Dirlist.txt niet bestaat, zal de opdrachtinterpreter Cmd.exe het maken. Als het bestand bestaat, vervangt Cmd.exe de informatie in het bestand door de gegevens die zijn ontvangen van de opdracht, naar het bestand Dirlist.txt:


map >> maplijst.txt

Om opdrachtuitvoer toe te voegen netstat voer aan het einde van het bestand Tcpinfo.txt het volgende in:


netstat >>tcpinfo.txt

Soms is het handiger om het zo te schrijven:

SET OutFile="%~n0.html" > %OutFile% ECHO ^ >> %OutFile% ECHO ^ >> %OutFile% ECHO ^ beste pagina^>> %OutFile% ECHO ^>> %OutFile% ECHO ^ >> %OutFile% ECHO Hallo wereld >> %OutFile% ECHO ^>> %OutFile% ECHO ^

De kanaaloperator gebruiken (|)

De verticale lijnpijpoperator (|) neemt de uitvoer van één opdracht (standaard STDOUT) en stuurt deze naar de invoer van een andere opdracht (standaard STDIN). Met de volgende opdracht sorteert u bijvoorbeeld een map:

In dit voorbeeld worden beide opdrachten gelijktijdig uitgevoerd, maar de opdracht soort pauzeert totdat de opdrachtuitvoer wordt ontvangen Als het bestand Dirlist.txt niet bestaat, zal de opdrachtinterpreter Cmd.exe het maken. Als het bestand bestaat, vervangt Cmd.exe de informatie in het bestand door de gegevens die zijn ontvangen van de opdracht. Team soort gebruikt de opdrachtuitvoer Als het bestand Dirlist.txt niet bestaat, zal de opdrachtinterpreter Cmd.exe het maken. Als het bestand bestaat, vervangt Cmd.exe de informatie in het bestand door de gegevens die zijn ontvangen van de opdracht als invoer en verzendt vervolgens de uitvoer naar descriptor 1 (STDOUT).

Commando's combineren met omleidingsoperatoren

Door filteropdrachten te combineren met andere opdrachten en bestandsnamen, kunt u aangepaste opdrachten maken. Als u bijvoorbeeld bestandsnamen wilt opslaan die de tekenreeks "LOG" bevatten, gebruikt u de volgende opdracht:

map /b | zoek "LOG"> loglist.txt

Commando-uitvoer Als het bestand Dirlist.txt niet bestaat, zal de opdrachtinterpreter Cmd.exe het maken. Als het bestand bestaat, vervangt Cmd.exe de informatie in het bestand door de gegevens die zijn ontvangen van de opdracht verzonden naar de filteropdracht vinden. Bestandsnamen die de tekenreeks "LOG" bevatten, worden als een lijst in het bestand Loglist.txt opgeslagen (bijvoorbeeld NetshConfig.log, Logdat.svd en Mylog.bat).

Wanneer u meer dan één filter in één opdracht gebruikt, moeten deze worden gescheiden met behulp van een pipe (|). Met de volgende opdracht wordt bijvoorbeeld in elke map op station C gezocht naar bestanden met de tekenreeks 'Log' in hun naam en worden deze pagina voor pagina weergegeven:

map c:\ /s /b | zoek "LOG" | meer

De aanwezigheid van een pipe (|) vertelt cmd.exe dat de uitvoer van de DIR-opdracht naar de filteropdracht moet worden verzonden vinden. Het find-commando selecteert alleen die bestandsnamen die de tekenreeks "LOG" bevatten. Met het commando more worden de bestandsnamen weergegeven die door het commando zijn verkregen vinden met een pauze nadat elk scherm is gevuld. Zie voor meer informatie over filteropdrachten

Operators voor het omleiden van opdrachten worden gebruikt om de standaardlocaties van opdrachtinvoer- en uitvoerstromen naar een andere locatie te wijzigen. De locatie van de invoer- en uitvoerstromen wordt een handle genoemd.

In de volgende tabel worden operatoren voor het omleiden van opdrachtinvoer en -uitvoer beschreven.

Omleidingsoperator

Beschrijving

Schrijft de uitvoer van een opdracht in plaats van de opdrachtregel naar een bestand of apparaat zoals een printer.

Leest de opdrachtinvoerstroom uit een bestand in plaats van vanaf het toetsenbord.

Voegt de opdrachtuitvoer toe aan het einde van het bestand zonder bestaande informatie uit het bestand te verwijderen.

Leest de uitvoer van één descriptor als invoer voor een andere descriptor.

Leest de invoer van één handle als de uitvoer van een andere handle.

Leest de uitvoer van één commando en schrijft deze naar de invoer van een ander commando. Deze procedure staat bekend als channeling.

Standaard wordt de opdrachtinvoer (STDIN-handle) vanaf het toetsenbord naar de opdrachtinterpreter Cmd.exe verzonden, waarna Cmd.exe de opdrachtuitvoer (STDOUT-handle) naar het opdrachtpromptvenster verzendt.

De volgende tabel toont de beschikbare descriptoren.

De cijfers 0 tot en met 9 vertegenwoordigen de eerste 10 descriptoren. De opdrachtinterpreter Cmd.exe wordt gebruikt om het programma uit te voeren en een van de 10 handvatten om te leiden. Om de vereiste handle op te geven, voert u het nummer ervan in vóór de omleidingsoperator. Als de handle niet is gedefinieerd, wordt standaard de operator voor invoeromleiding gebruikt "<» будет ноль (0), а оператором перенаправления вывода «>" zal één (1) zijn. Na het invoeren van de operator "<» или «>"Het is noodzakelijk om aan te geven waar gegevens moeten worden gelezen en waar gegevens moeten worden geschreven. U kunt de bestandsnaam of een van de bestaande descriptors opgeven.

Om de omleiding naar bestaande ingangen op te geven, gebruikt u een ampersand (&), gevolgd door het nummer van de gewenste ingang (bijvoorbeeld & handvat_nummer). Als u bijvoorbeeld handle 2 (STDERR) wilt omleiden naar handle 1 (STDOUT), voert u het volgende in:

Dubbele beschrijvingen

De omleidingsoperator "&" dupliceert de uitvoer of invoer van de ene gespecificeerde handle naar een andere gespecificeerde handle. Bijvoorbeeld om de opdrachtuitvoer te verzenden Als het bestand Dirlist.txt niet bestaat, zal de opdrachtinterpreter Cmd.exe het maken. Als het bestand bestaat, vervangt Cmd.exe de informatie in het bestand door de gegevens die zijn ontvangen van de opdracht naar File.txt en stuur de foutuitvoer naar File.txt, voer het volgende in:

dir>c:\bestand.txt 2>&1

Bij het dupliceren van een descriptor worden alle oorspronkelijke kenmerken gekopieerd. Als een handle bijvoorbeeld alleen-schrijven is, zijn alle duplicaten ervan alleen-schrijven. U kunt een alleen-lezen-ingang niet dupliceren naar een alleen-schrijven-ingang.

Als een handle bijvoorbeeld alleen-schrijven is, zijn alle duplicaten ervan alleen-schrijven. U kunt een alleen-lezen-ingang niet dupliceren naar een alleen-schrijven-ingang.<)

Om de numerieke toetsenbordinvoer om te leiden naar een bestand of apparaat, gebruikt u de "<». Например, для ввода команды soort voer uit het List.txt-bestand het volgende in:

Om numerieke toetsenbordopdrachten om te leiden naar een bestand of apparaat, gebruikt u de "

soort

De inhoud van File.txt verschijnt op de opdrachtregel als een lijst in alfabetische volgorde.<» открывает заданное имя файла с доступом только для чтения. Поэтому с его помощью нельзя записывать в файл. Например, при запуске программы с оператором <&2 все попытки прочитать дескриптор 0 ни к чему не приведут, так как изначально он был открыт с доступом только для записи.

Exploitant "

  • Opmerking<».

Handle 0 is de standaardwaarde voor de operator voor invoeromleiding "

De uitvoer van bijna alle opdrachten wordt weergegeven in het opdrachtpromptvenster. Zelfs opdrachten die gegevens naar schijf of een printer uitvoeren, produceren berichten en aanwijzingen in het opdrachtpromptvenster.

Om de uitvoer van opdrachten vanuit het opdrachtpromptvenster om te leiden naar een bestand of apparaat, gebruikt u de operator ">". Deze operator wordt bij de meeste opdrachten gebruikt. Bijvoorbeeld om de opdrachtuitvoer om te leiden Als het bestand Dirlist.txt niet bestaat, zal de opdrachtinterpreter Cmd.exe het maken. Als het bestand bestaat, vervangt Cmd.exe de informatie in het bestand door de gegevens die zijn ontvangen van de opdracht voer in het bestand Dirlist.txt het volgende in:

map>maplijst.txt

Als het bestand Dirlist.txt niet bestaat, zal de opdrachtinterpreter Cmd.exe het maken. Als het bestand bestaat, vervangt Cmd.exe de informatie in het bestand door de gegevens die zijn ontvangen van de opdracht Als het bestand Dirlist.txt niet bestaat, zal de opdrachtinterpreter Cmd.exe het maken. Als het bestand bestaat, vervangt Cmd.exe de informatie in het bestand door de gegevens die zijn ontvangen van de opdracht.

richt Om de opdracht uit te voeren en vervolgens de resultaten van zijn werk naar Route.cfg verzendt, voert u het volgende in:

Om de opdracht uit te voeren>c:\route.cfg

De operator ">" opent het opgegeven bestand met alleen-schrijven-toegang. Daarom kan het bestand niet worden gelezen met deze operator. Bijvoorbeeld wanneer u een programma uitvoert met een omleidingsoperator<&0 все попытки записать дескриптор 1 ни к чему не приведут, так как изначально дескриптор 0 был открыт с доступом только для чтения.

De operator ">" opent het opgegeven bestand met alleen-schrijven-toegang. Daarom kan het bestand niet worden gelezen met deze operator. Bijvoorbeeld wanneer u een programma uitvoert met een omleidingsoperator

  • Opmerking.

Handle 1 is de standaardwaarde voor de uitvoeromleidingsoperator ">".<&» для перенаправления ввода и дублирования

Als u de operator voor invoeromleiding wilt gebruiken, moet het opgegeven bestand al bestaan. Als het invoerbestand bestaat, opent de opdrachtinterpreter Cmd.exe het met alleen-lezen toegang en verzendt de inhoud ervan naar de opdracht alsof het numerieke toetsenbordinvoer is. Wanneer een handle is opgegeven, dupliceert de opdrachtinterpreter Cmd.exe deze naar een handle die op het systeem aanwezig is.

Als u de operator voor invoeromleiding wilt gebruiken, moet het opgegeven bestand al bestaan. Als het invoerbestand bestaat, opent de opdrachtinterpreter Cmd.exe het met alleen-lezen toegang en verzendt de inhoud ervan naar de opdracht alsof het numerieke toetsenbordinvoer is. Wanneer een handle is opgegeven, dupliceert de opdrachtinterpreter Cmd.exe deze naar een handle die op het systeem aanwezig is.

< bestand.txt

Om het bestand File.txt te openen, sorteert u de inhoud ervan en stuurt u het vervolgens naar het opdrachtpromptvenster (STDOUT), typt u:

Om numerieke toetsenbordopdrachten om te leiden naar een bestand of apparaat, gebruikt u de "< bestand.txt

Om File.txt te vinden en handle 1 (STDOUT) en handle 2 (STDERR) om te leiden naar Search.txt, voert u het volgende in:

Om File.txt te vinden en handle 1 (STDOUT) en handle 2 (STDERR) om te leiden naar Search.txt, voert u het volgende in:<&1

Om door de gebruiker gedefinieerde descriptor 3 te dupliceren als invoer voor descriptor 0 (STDIN), voert u het volgende in:

De operator ">&" gebruiken om invoer om te leiden en te dupliceren

Wanneer u de uitvoer naar een bestand omleidt en een bestaande bestandsnaam opgeeft, opent de opdrachtinterpreter Cmd.exe het bestand met alleen-schrijven-toegang en overschrijft de inhoud ervan. Als er een handle is opgegeven, dupliceert de opdrachtinterpreter Cmd.exe het bestand naar de bestaande handle.

Om door de gebruiker gedefinieerde descriptor 3 te dupliceren naar descriptor 1, voert u het volgende in:

Om alle uitvoer om te leiden, inclusief descriptor 2-uitvoer (STDERR), moeten de commando's ipconfig in handle 1 (STDOUT) en vervolgens de uitvoer omleiden naar Output.log, voer het volgende in:

ipconfig.exe>>output.log 2>&1

De operator ">>" gebruiken om uitvoer toe te voegen

Om de uitvoer van een opdracht aan het einde van een bestand toe te voegen zonder de daarin opgeslagen informatie te verliezen, gebruikt u een dubbel groter dan-teken (>>). Met de volgende opdracht wordt bijvoorbeeld de directorylijst toegevoegd die door de opdracht is gemaakt Als het bestand Dirlist.txt niet bestaat, zal de opdrachtinterpreter Cmd.exe het maken. Als het bestand bestaat, vervangt Cmd.exe de informatie in het bestand door de gegevens die zijn ontvangen van de opdracht, naar het bestand Dirlist.txt:

map >> maplijst.txt

Om opdrachtuitvoer toe te voegen netstat voer aan het einde van het bestand Tcpinfo.txt het volgende in:

netstat >>tcpinfo.txt

De kanaaloperator gebruiken (|)

De verticale lijnpijpoperator (|) neemt de uitvoer van één opdracht (standaard STDOUT) en stuurt deze naar de invoer van een andere opdracht (standaard STDIN). Met de volgende opdracht sorteert u bijvoorbeeld een map:

richt | soort

In dit voorbeeld worden beide opdrachten gelijktijdig uitgevoerd, maar de opdracht soort pauzeert totdat de opdrachtuitvoer wordt ontvangen Als het bestand Dirlist.txt niet bestaat, zal de opdrachtinterpreter Cmd.exe het maken. Als het bestand bestaat, vervangt Cmd.exe de informatie in het bestand door de gegevens die zijn ontvangen van de opdracht. Team soort gebruikt de opdrachtuitvoer Als het bestand Dirlist.txt niet bestaat, zal de opdrachtinterpreter Cmd.exe het maken. Als het bestand bestaat, vervangt Cmd.exe de informatie in het bestand door de gegevens die zijn ontvangen van de opdracht als invoer en verzendt vervolgens de uitvoer naar descriptor 1 (STDOUT).

Commando's combineren met omleidingsoperatoren

Door filteropdrachten te combineren met andere opdrachten en bestandsnamen, kunt u aangepaste opdrachten maken. Als u bijvoorbeeld bestandsnamen wilt opslaan die de tekenreeks "LOG" bevatten, gebruikt u de volgende opdracht:

map /b | zoek "LOG"> loglist.txt

Commando-uitvoer Als het bestand Dirlist.txt niet bestaat, zal de opdrachtinterpreter Cmd.exe het maken. Als het bestand bestaat, vervangt Cmd.exe de informatie in het bestand door de gegevens die zijn ontvangen van de opdracht verzonden naar de filteropdracht vinden. Bestandsnamen die de tekenreeks "LOG" bevatten, worden als een lijst in het bestand Loglist.txt opgeslagen (bijvoorbeeld NetshConfig.log, Logdat.svd en Mylog.bat).

Wanneer u meer dan één filter in één opdracht gebruikt, moeten deze worden gescheiden met behulp van een pipe (|). Met de volgende opdracht wordt bijvoorbeeld in elke map op station C gezocht naar bestanden met de tekenreeks 'Log' in hun naam en worden deze pagina voor pagina weergegeven:

map c:\ /s /b | zoek "LOG" | meer

De aanwezigheid van een pipe (|) geeft aan Cmd.exe aan dat de opdracht wordt uitgevoerd Als het bestand Dirlist.txt niet bestaat, zal de opdrachtinterpreter Cmd.exe het maken. Als het bestand bestaat, vervangt Cmd.exe de informatie in het bestand door de gegevens die zijn ontvangen van de opdracht moet naar de filteropdracht worden verzonden vinden. Team vinden selecteert alleen die bestandsnamen die de tekenreeks "LOG" bevatten. Team meer geeft de bestandsnamen weer die door de opdracht zijn verkregen vinden met een pauze nadat elk scherm is gevuld.

Goede tijd, mijn lezers!
In dit artikel wil ik mijn kennis systematiseren volgens de basisprincipes werking van programmastromen en kanalen in de tolk en in het algemeen in het Linux OS, maar ook over de mogelijkheden omleidingen gegevens stromen.
Helemaal aan het begin zou ik willen opmerken dat de tolk met drie standaardstreams werkt:

  1. stoer Dit standaard uitvoer, dat de uitvoer van de opdracht levert. De stroomdescriptor is 1.
  2. stderr Dit standaard foutenstroom, waarmee opdrachtfouten worden afgedrukt. De omschrijving ervan is 2.
  3. stdin Dit standaard invoer, dat invoer levert voor opdrachten. De descriptor ervan is 0.

Laten we nu in eenvoudige woorden beschrijven wat deze drie punten betekenen:

stoer- standaard uitvoerstroom. Dit is, in eenvoudige bewoordingen, de informatie die we in de tolk zien bij het uitvoeren van opdrachten. Dat wil zeggen alle meldingen (zonder foutmeldingen) die het in de tolk uitgevoerde commando rapporteert en weergeeft op de terminal (lees: scherm). (uitvoer naar het scherm staat standaard ingesteld, maar je kunt ook uitvoer opgeven, bijvoorbeeld naar een bestand of doorsturen naar een ander commando; hoe dat moet, vertel ik je hieronder)

stderr- stroom van fouten. Dit zijn fouten bij het uitvoeren van opdrachten in bash, die standaard worden uitgevoerd naar stdout, dat wil zeggen naar de terminal (opnieuw, tenzij uitvoer naar een andere locatie is opgegeven)

stdin- invoerstroom. Dit is, in eenvoudige bewoordingen, wat we vanaf het toetsenbord in de tolk invoeren om de opdracht uit te voeren.

Deze stromen worden heel goed weergegeven in de figuur afkomstig van http://rus-linux.net/:

Op deze afbeelding: Stdin, groen weergegeven, heeft handvat 0
Stdout, rood weergegeven, heeft handvat 1
Stderr, blauw weergegeven, heeft handvat 2

Vervolgens zal ik je vertellen hoe deze streams kunnen worden omgeleid van/naar een bestand. Dat wil zeggen bij het uitvoeren van een commando, zodat meldingen of fouten niet op het scherm verschijnen, maar naar een bestand worden geschreven. Waar is dit voor? U voert bijvoorbeeld een opdracht uit waarvan de uitvoer niet in het terminalvenster past. U vertelt het dat de standaarduitvoer in het ene bestand moet worden opgeslagen en de standaardfout in een ander bestand. Zo kunnen alle fouten en of er standaarduitvoer nodig is, in detail worden bekeken door de opgeslagen bestanden te openen.

Het omleiden van threads gebeurt dus als volgt:

$ commando n>bestand

Deze regel toont: opdrachtuitvoering commando en stroomomleiding (waar N= stream-handle) naar een bestand bestand. Wanneer u deze omleiding uitvoert, zal dit gebeuren als het doelbestand bestaat overschreven. In dit geval wordt, als n niet is gespecificeerd, uitgegaan van standaarduitvoer.

$ commando n>>bestand

Deze opdracht heeft een vergelijkbare syntaxis, maar hier wordt het symbool ">>" gespecificeerd. Met deze omleiding wordt, als het doelbestand bestaat, de uitvoer van de opdracht toegevoegd aan de bestaande gegevens.

$opdracht< file

in dit voorbeeld het commando commando wordt uitgevoerd en gebruikt het bestand als invoerbron bestand, in plaats van toetsenbordinvoer

Soms is het nodig om de standaardfoutenstroom te combineren met de standaarduitvoerstroom, zodat fouten en normale programma-uitvoer samen kunnen worden verwerkt. Voor deze doeleinden wordt een combinatie met het symbool gebruikt: &. Een voorbeeld van deze actie:

Zoek / -naam .naam_bestand > /pad/naar/bestand 2>&1

Wanneer deze opdracht wordt uitgevoerd, wordt er vanuit de hoofdmap van het bestandssysteem naar een bestand met de naam gezocht .naam_bestand en het omleiden van zoekresultaten (stdout en stderr) naar een bestand /pad/naar/bestand. Ontwerp > /pad/naar/bestand 2>&1 stuurt standaarduitvoer om naar /pad/naar/bestand en drukfouten naar standaarduitvoer. Dat gezegd hebbende: het schrijven van 2>&1 vóór > zal niet werken, omdat wanneer de interpreter 2>&1 leest, deze nog niet weet waar de standaard uitvoerstroom naartoe wordt omgeleid, dus de fout- en uitvoerstromen zullen niet worden samengevoegd.

$ commando > bestand 2>&1

vergelijkbaar met schrijven:

$ commando &> bestand

$ commando 2>&bestand

Als de uitvoer moet worden genegeerd, kan deze naar het /dev/null-apparaat worden gestuurd. Dit is een soort "zwart gat" dat elke hoeveelheid informatie opneemt en in niets verandert.

Ik denk dat de verstrekte informatie over stroomomleiding voldoende zal zijn om de essentie te begrijpen, nu zal ik je erover vertellen transportband overdracht.

Pijpleiding in Linux is het vermogen van verschillende programma's om samen te werken wanneer de uitvoer van het ene programma rechtstreeks wordt overgedragen naar de invoer van een ander programma, zonder het gebruik van tussenliggende tijdelijke bestanden. De syntaxis voor het gebruik van de pijplijn is als volgt:

$opdracht1 | commando2

In dit voorbeeld wordt de opdracht uitgevoerd commando1, wordt de uitvoerstroom gebruikt als invoerstroom tijdens de uitvoering commando2.

Dat is alles voor vandaag. Opmerkingen en aanvullingen ontvang ik graag. Bedankt.

Met vriendelijke groet, McSim!

Door gebruik te maken van I/O-remapping kan het ene programma zijn uitvoer naar de invoer van een ander programma sturen, of de uitvoer van een ander programma onderscheppen en als invoer gebruiken. Het is dus mogelijk om informatie van proces naar proces over te dragen met minimale softwareoverhead. In praktische termen betekent dit dat voor programma's die standaard invoer- en uitvoerapparaten gebruiken, het besturingssysteem het volgende toestaat:

  • programmaberichten niet naar het scherm uitvoeren (standaarduitvoerstroom), maar naar een bestand of naar een printer (uitvoeromleiding);
  • lees invoergegevens niet van het toetsenbord (standaard invoerstroom), maar van een eerder voorbereid bestand (invoeromleiding);
  • berichten die door het ene programma worden uitgevoerd, doorgeven als invoer voor een ander programma (pipelining of instructiecompositie).

Vanaf de opdrachtregel worden deze functies als volgt geïmplementeerd. Om tekstberichten die door een willekeurige opdracht vanaf de opdrachtregel worden uitgevoerd, om te leiden naar een tekstbestand, moet u de constructie gebruiken opdracht > bestandsnaam. Als het voor uitvoer opgegeven bestand al bestond, wordt het overschreven (de oude inhoud gaat verloren, het wordt gemaakt). U kunt het bestand ook niet opnieuw maken, maar de door de opdracht uitgevoerde informatie aan het einde van het bestaande bestand toevoegen. Om dit te doen, moet het uitvoeromleidingscommando als volgt worden gespecificeerd: opdracht >> bestandsnaam. Een symbool gebruiken< можно прочитать входные данные для заданной команды не с клавиатуры, а из определенного (заранее подготовленного) файла: команда < имя_файла

Voorbeelden van I/O-omleiding op de opdrachtregel

Hier volgen enkele voorbeelden van I/O-omleiding.

1. Output van resultaten ping-opdrachten archiveren ping ya.ru > ping.txt

2. Helptekst toevoegen voor XCOPY-opdrachten naar het bestand copy.txt: XCOPY /? >> kopie.txt

Indien nodig kunnen foutmeldingen (standaardfoutstroom) worden omgeleid naar een tekstbestand met behulp van het commando 2> bestandsnaamconstructie. In dit geval wordt de standaarduitvoer op het scherm afgedrukt. Het is ook mogelijk om informatieberichten en foutmeldingen naar hetzelfde bestand uit te voeren. Dit gebeurt als volgt: opdracht > bestandsnaam 2 >&1

Met de volgende opdracht worden de standaarduitvoer en de standaardfout bijvoorbeeld omgeleid naar copy.txt: XCOPY A:\1.txt C: > kopiëren.txt 2>&1

Elk programma is een ‘automatische machine’ die is ontworpen om gegevens te verwerken: door de ene informatie als invoer te ontvangen, produceert het als resultaat van zijn werk een andere. Hoewel de inkomende en/of uitgaande informatie nul kan zijn, dat wil zeggen simpelweg afwezig is. De gegevens die ter verwerking naar het programma worden overgebracht, zijn de input, wat het als resultaat van zijn werk produceert, is de output. Het organiseren van invoer en uitvoer voor elk programma is de taak van het besturingssysteem.

Elk programma werkt met gegevens van een bepaald type: tekst, afbeeldingen, geluid, enz. Zoals waarschijnlijk al duidelijk is geworden, is de belangrijkste systeembeheerinterface in Linux een terminal, die is ontworpen om tekstinformatie van de gebruiker naar het systeem over te dragen en rug. Omdat alleen tekstinformatie vanuit de terminal kan worden ingevoerd en uitgevoerd, moeten de invoer en uitvoer van programma's die bij de terminal horen ook uit tekst bestaan. De noodzaak om met tekstgegevens te werken beperkt echter de mogelijkheden van systeembeheer niet, maar breidt deze integendeel uit. Een persoon kan de uitvoer van elk programma lezen en uitzoeken wat er in het systeem gebeurt, en verschillende programma's blijken compatibel met elkaar te zijn omdat ze hetzelfde type gegevensrepresentatie gebruiken: tekst.

Commando's en scripts kunnen op twee manieren input krijgen: vanuit standaardinvoer (gekoppeld aan het toetsenbord) of vanuit een bestand. Een soortgelijke scheiding bestaat voor de uitvoer: de uitvoer van een opdracht of script wordt standaard naar het terminalscherm verzonden, maar u kunt deze omleiden naar een bestand. Als er fouten optreden tijdens het gebruik. berichten daarover worden ook op het scherm weergegeven en de stroom fouten kan ook worden omgeleid naar een bestand.

Laten we eerst eens kijken naar een aantal commando's die gebruikt kunnen worden om I/O te organiseren.

Voer opdrachten uit naar standaard uitvoerapparaat

Linux biedt verschillende opdrachten om berichten naar standaarduitvoer af te drukken:

  • echo - Druk een tekenreeks af naar standaarduitvoer.
  • printf - Druk opgemaakte tekst af naar standaarduitvoer.
  • ja - Herhaalde tekst afdrukken naar standaarduitvoer.
  • seq - Druk een reeks getallen af ​​naar standaarduitvoer
  • clear Maak het scherm of venster leeg.

Als u bijvoorbeeld de opdracht echo gebruikt en u het controleteken \c opgeeft, zal er, wanneer de uitvoer is voltooid, geen overgang naar een nieuwe regel plaatsvinden:

$ echo "Wat is je naam?\c"

Hoe heet je?$

Hier is $ het uitnodigingssymbool.

De lijn kan ook de waarden van shell-interpretervariabelen en zelfs andere opdrachten berekenen. Het volgende commando vertelt u bijvoorbeeld wat de thuismap van de huidige gebruiker is (de omgevingsvariabele $HOME) en met welke terminal hij is verbonden (het tty-commando wordt tussen aanhalingstekens geplaatst, zodat de interpreter zijn uitvoer op een regel zet).

$ echo "Je thuismap is $HOME, je bent verbonden met de terminal - `tty` "

Je thuismap is /home/knoppix, je bent verbonden met de terminal - /dev/tty1

Omdat dubbele aanhalingstekens een speciaal doel hebben in de shell-interpreter, moet u, om dubbele aanhalingstekens in de uitvoerreeks op te nemen, hun speciale doel ongedaan maken met behulp van een backslash (\). Hierdoor wordt de toewijzing van een speciaal teken geannuleerd.

Om bijvoorbeeld de string “/dev/tty1” weer te geven, moet u het volgende uitvoeren:

$echo “\”/dev/tty1\””

Voer opdrachten in vanaf een standaard invoerapparaat

Het leescommando leest één regel uit de standaardinvoer en schrijft de inhoud ervan naar de opgegeven variabelen. Wanneer u meerdere variabelen opgeeft, wordt het eerste woord naar het eerste geschreven, het tweede woord naar het tweede, enz. de laatste bevat de rest van de regel.

Het volgende script roept een afzonderlijke leesopdracht aan om elke variabele te lezen.


$ kattentest
#!/bin/bash
echo “Naam: \c”
lees naam
echo "Achternaam: \c"
lees achternaam
echo “Voornaam=” $naam “Achternaam=” $achternaam

Om dit script vervolgens uit te voeren, moet u het testbestand het uitvoeringsrecht geven: chmod 0755 test en voer het uit./test.

Resultaat van de uitvoering: Voornaam: Ivan Achternaam: Petrov Voornaam=Ivan Achternaam=Petrov

STANDAARD INPUT, OUTPUT EN FOUTSTREAM

Elk programma dat wordt gestart vanuit de opdrachtinterpreter ontvangt drie open I/O-streams:

Standaardinvoer (sldin) - standaarduitvoer (sldout) - standaardfoutuitvoer (stderr)

Standaard zijn deze threads gekoppeld aan de terminal. Die. Elk programma dat geen andere streams gebruikt dan de standaardstreams, wacht op invoer van het terminaltoetsenbord; de uitvoer van dat programma, inclusief foutmeldingen, zal op het terminalscherm verschijnen.

Bovendien is elk proces (opdracht, script, enz.) dat wordt uitgevoerd in de shell-interpreter geassocieerd met een aantal open bestanden waaruit het proces zijn gegevens kan lezen en waarin het deze kan schrijven. Elk van deze bestanden wordt geïdentificeerd door een nummer dat een bestandsdescriptor wordt genoemd, maar de eerste drie bestanden zijn de standaard I/O-streams:
Bestandsbeschrijving
Standaard invoerstroom 0
Standaarduitgang 1

Standaardfoutstroom 2

In werkelijkheid worden er twaalf geopende bestanden gemaakt, maar bestanden met de descriptoren 0, 1 en 2 zijn gereserveerd voor standaardinvoer, uitvoer en fouten. Gebruikers kunnen ook werken met bestanden met bestandsbeschrijvingen 3 tot en met 9 (gereserveerd).

Het standaarduitvoerbestand (stdout) heeft handle 1. Alle procesuitvoer wordt naar dit bestand geschreven. Standaard worden gegevens uitgevoerd naar het terminalscherm (device/dev/tty), maar ze kunnen ook worden omgeleid naar een bestand of worden doorgesluisd naar een ander proces.

Het standaard error stream-bestand (siderr) heeft descriptor 2. Foutmeldingen die optreden tijdens de uitvoering van opdrachten worden naar dit bestand geschreven. Standaard worden foutmeldingen naar het terminalscherm (device /dev/tty) gestuurd, maar ze kunnen ook naar een bestand worden omgeleid. Waarom een ​​speciaal bestand toewijzen voor logfouten? Feit is dat dit een erg handige manier is om de daadwerkelijke uitvoergegevens te isoleren van de resultaten van het werk van een opdracht, en ook een goede gelegenheid om het onderhoud van verschillende soorten logbestanden effectief te organiseren.

Een groot aantal hulpprogramma's gebruikt alleen standaardstreams. Voor dergelijke programma's maakt de shell het mogelijk dat I/O-streams onafhankelijk worden omgeleid. U kunt bijvoorbeeld foutmeldingen onderdrukken, invoer of uitvoer van een bestand instellen.

Die. Bij het aanroepen van opdrachten kunt u opgeven waar invoer moet worden ontvangen en waar uitvoer naartoe moet worden gestuurd, evenals foutmeldingen. Standaard wordt, tenzij anders aangegeven, uitgegaan van het werken met een terminal: gegevens worden via het toetsenbord ingevoerd en op het scherm weergegeven. Maar de shell-interpreter heeft een omleidingsmechanisme waarmee standaardstreams aan verschillende bestanden kunnen worden gekoppeld. In dit geval moet bij het omleiden van de standaardfoutenstroom een ​​bestandsdescriptor (2) worden opgegeven. Voor invoer- en uitvoerstromen is dit niet nodig.

Een handig speciaal geval bij het gebruik van het thread-omleidingsmechanisme is het omleiden naar /dev/null, waarmee je onnodige berichten op het scherm kunt verwijderen. Met hetzelfde mechanisme kunt u lege bestanden maken:

% cat mijnbestand - zal een leeg bestand mijnbestand maken in de huidige map.

/dev/null is een speciaal bestand dat een zogenaamd . "leeg apparaat" Het schrijven ernaar gebeurt met succes, ongeacht de hoeveelheid "opgenomen" informatie. Het lezen van /dev/null is gelijk aan het lezen van het einde van het bestand EOF.

I/O-streams omleiden wordt uitgevoerd, zoals DOS (meer precies, het DOS-besturingssysteem heeft de syntaxis overgenomen voor het omleiden van streams van UNIX) met behulp van de symbolen:

- standaarduitvoerstroom omleiden
- omleiding van de standaarduitvoerstroom in de toevoegmodus
- standaardinvoerstroom omleiden
- gegevens ontvangen van standaardinvoer totdat een scheidingsteken wordt aangetroffen

In tegenstelling tot DOS start het UNIX/Linux-besturingssysteem echter bij het creëren van een programmakanaal tussen twee processen beide processen tegelijkertijd en draagt ​​het informatie over via de systeembuffer (zonder tussentijdse opname op de harde schijf). Softwarekanalen in UNIX/Linux OS zijn dus een zeer efficiënte manier van uitwisseling. Als de systeembuffer overstroomt (bijvoorbeeld als het ``verzendende'' programma sneller informatie naar het kanaal stuurt dan het ``ontvangende'' programma deze kan verwerken), onderbreekt het besturingssysteem automatisch het proces dat naar het kanaal schrijft totdat de buffer wordt bevrijd.

Meest voorkomende omleidingsoperatoren

Nr. Syntaxisbeschrijving
1 opdrachtbestand Stuurt standaarduitvoer naar een nieuw bestand

2 commando 1 bestand Stuurt standaarduitvoer naar het opgegeven bestand

3 bestandsopdracht Stuurt standaarduitvoer naar het opgegeven bestand (bijlagemodus)

4 commandobestand 2&1 Stuurt standaarduitvoer en fouten naar het opgegeven bestand

5 commando 2 bestand Stuurt standaardfout naar het opgegeven bestand

6 commando 2 bestand Stuurt standaardfout naar het opgegeven bestand (toevoegmodus)

7 commandobestand 2&1 Stuurt standaarduitvoer en fouten naar het opgegeven bestand (bijlagemodus)

8 commando file1 file2 Ontvangt invoer van het eerste bestand en verzendt uitvoer naar het tweede bestand

9-opdrachtbestand als standaardinvoer ontvangt gegevens uit het opgegeven bestand

10 opdracht voor scheidingsteken Ontvangt gegevens van standaardinvoer totdat er een scheidingsteken wordt aangetroffen

11 commando &m Ontvangt gegevens uit een bestand met descriptor m als standaardinvoer

12 commando &m Stuurt standaarduitvoer naar bestandsdescriptor m

Met de operator n&m kan een bestand met descriptor n worden omgeleid naar dezelfde locatie als een bestand met descriptor m. Er kunnen meerdere vergelijkbare operators op de opdrachtregel staan, in welk geval ze van links naar rechts worden berekend.

exec-opdracht en het gebruik van bestandsdescriptors

Het exec-commando vervangt de huidige shell door het opgegeven commando. Meestal wordt het gebruikt om de huidige tolk te sluiten en een andere te starten. Maar het heeft ook andere toepassingen.

Een commando als bijvoorbeeld

Exec-bestand maakt het opgegeven bestand de standaardinvoer van alle opdrachten. Voer het uit
de interactieve modus heeft geen zin - het is bedoeld voor gebruik in scripts,
zodat alle opdrachten die erna komen hun invoergegevens uit het bestand lezen. In dit geval
er moet een commando aan het einde van het script staan

Exec & – waarmee de standaard invoerstroom wordt afgesloten (in dit geval een bestand). Er wordt gebruik gemaakt van een soortgelijke techniek
voornamelijk in scripts die worden uitgevoerd wanneer u uitlogt.

Het exec-commando is een verwijzing naar een bestand met descriptor 0 (stdin). Deze pointer kan alleen worden hersteld nadat het script is uitgevoerd.
Als het script van plan is gegevens van het toetsenbord te blijven lezen, moet u opslaan
verwijzing naar de vorige invoerstroom. Hieronder vindt u een kort script dat laat zien hoe u dit kunt doen.

$ cat f_desc
#!/bin/bash
exec 3&0 0bestand
lees linel
lees regel2
uitvoerend 0&3
echo $1inel
echo $regel2

Het eerste exec-commando slaat een verwijzing op naar de standaardinvoer (stdin) in bestandsdescriptor 3
(elk geheel getal tussen 3 en 9 is toegestaan) en opent vervolgens het bestand om te lezen. De volgende twee leesopdrachten
lees twee regels tekst uit een bestand. Het tweede exec-commando herstelt de pointer naar de standaardinvoer: now
het is gekoppeld aan het stdin-bestand, niet aan het bestand. De laatste echo-opdrachten geven de inhoud van de leesregels op het scherm weer,
die zijn opgeslagen in de variabelen linel en Iine2.

Het resultaat van het script:
$./f_desc
Hallo!
Doei!