Leid standaard I/O en fouten om. Linux I/O-omleiding

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 invoer, wat het als resultaat van het werk produceert, is de uitvoer. 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 Wis het scherm of venster.

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-variabelen 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 tolk het resultaat van de uitvoering ervan op een lijn).

$ 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
Standaardingang 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 standaard invoerbestand (sldin) heeft handle 0. Uit dit bestand halen processen hun invoergegevens op. Standaard is de invoerstroom gekoppeld aan het toetsenbord (device /dev/tty), maar meestal komt deze via een pipe van andere processen of van een gewoon bestand.

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 effectieve 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 opdracht 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!

In het systeem zijn standaard altijd drie "bestanden" geopend: (toetsenbord), (scherm) en (foutmeldingen op het scherm weergeven). Deze en alle andere geopende bestanden kunnen worden omgeleid. In dit geval betekent de term "omleiding" het nemen van de uitvoer van een bestand, opdracht, programma, script of zelfs een enkel blok in een script (zie voorbeeld 3-1 en voorbeeld 3-2) en doorgeven ervan als invoer aan een ander bestand, commando, programma of script.

Aan elk geopend bestand is een bestandsdescriptor gekoppeld. De bestandsbeschrijvingen en zijn respectievelijk 0, 1 en 2. Bij het openen van extra bestanden blijven de descriptoren 3 tot en met 9 onbezet. Soms kunnen aanvullende descriptors goed werk leveren door tijdelijk een link op te slaan naar, of. Dit maakt het gemakkelijker om handvatten terug te brengen naar hun normale status na complexe omleidings- en wisselmanipulaties (zie voorbeeld 16-1).

COMMAND_OUTPUT > # Stuur stdout (uitvoer) om naar een bestand. # Als het bestand ontbreekt, wordt het aangemaakt, anders wordt het overschreven. ls -lR > dir-tree.list # Creëert een bestand met een lijst van een directorystructuur. : > bestandsnaam # De bewerking > kapt het bestand "bestandsnaam" af tot lengte nul. # Als het bestand vóór de bewerking niet bestond, # wordt er een nieuw bestand met lengte nul gemaakt (de opdracht "touch" heeft hetzelfde effect). # Het symbool: fungeert hier als tijdelijke aanduiding, zonder iets uit te voeren. > bestandsnaam # De bewerking > kapt het bestand "bestandsnaam" af tot lengte nul. # Als het bestand vóór de bewerking niet bestond, # wordt er een nieuw bestand met lengte nul gemaakt (de opdracht "touch" heeft hetzelfde effect). # (hetzelfde resultaat als ":>" hierboven, maar deze optie werkt # niet in sommige shells.) COMMAND_OUTPUT >> # Leid stdout (uitvoer) om naar een bestand. # Creëert een nieuw bestand als het ontbreekt, of voegt het toe aan het einde van het bestand. # Omleidingsopdrachten voor één regel # (hebben alleen invloed op de regel waarop ze verschijnen): # ——————————————————————— 1>bestandsnaam # Omleidingsuitvoer (stdout ) naar bestand "bestandsnaam". 1>>bestandsnaam # Leid de uitvoer (stdout) om naar bestand "bestandsnaam", het bestand wordt geopend in de toevoegmodus. 2>bestandsnaam # Stuur stderr door naar bestand "bestandsnaam". 2>>bestandsnaam # Stuur stderr door naar bestand "bestandsnaam", het bestand wordt geopend in de toevoegmodus. &>bestandsnaam # Leid stdout en stderr om naar bestand "bestandsnaam". #================================================ == ============================ # Redirect stdout, voor slechts één regel. LOGFILE=script.log echo "Deze regel wordt naar het bestand \"$LOGFILE\" geschreven." 1>$LOGFILE echo "Deze regel wordt toegevoegd aan het einde van het \"$LOGFILE\" bestand." 1>>$LOGFILE echo "Deze regel wordt ook toegevoegd aan het einde van het \"$LOGFILE\" bestand." 1>>$LOGFILE echo "Deze regel wordt op het scherm afgedrukt en komt niet in het \"$LOGFILE\"-bestand terecht." # Na elke regel wordt de gemaakte omleiding automatisch gereset. # Redirect stderr, voor slechts één regel. ERRORFILE=script.errors bad_command1 2>$ERRORFILE # Het foutbericht wordt naar $ERRORFILE geschreven. bad_command2 2>>$ERRORFILE # Er zal een foutmelding worden toegevoegd aan het einde van $ERRORFILE. bad_command3 # Het foutbericht wordt afgedrukt naar stderr, #+ en niet naar $ERRORFILE. # Na elke regel wordt de gemaakte omleiding ook automatisch gereset. #================================================ === ============================= 2>&1 # Leidt stderr om naar stdout. # Foutmeldingen worden naar dezelfde plek gestuurd als de standaarduitvoer. ik> i V J. # Uitvoer naar bestand met descriptor i doorgegeven aan bestand met descriptor J. >&j # Bestandsbeschrijving wordt omgeleid 1 (stdout) naar een bestand met een descriptor J. # Uitvoer naar stdout wordt naar de bestandsdescriptor gestuurd J. 0< FILENAME < FILENAME # Ввод из файла. # Парная команде ">", vaak gevonden in combinatie ermee. # # grep zoekwoord bestandsnaam # Bestand "bestandsnaam" wordt geopend voor lezen en schrijven, en geassocieerd met handle "j". # Als "bestandsnaam" ontbreekt, wordt deze aangemaakt. # Als descriptor "j" niet is opgegeven, wordt standaard descriptor 0, stdin, gebruikt. # # Eén gebruik hiervoor is schrijven naar een specifieke positie in een bestand. echo 1234567890 > Bestand # Schrijf een tekenreeks naar het bestand "Bestand". ex 3<>Bestand # Open "Bestand" en associeer het met handle 3. lees -n 4<&3 # Прочитать 4 символа. echo -n . >&3 # Schrijf het puntteken. exec 3>&- # Sluit handvat 3. cat File # ==> 1234.67890 # Willekeurige toegang, en dat is alles! | # Transportband (kanaal). # Een universeel hulpmiddel voor het combineren van opdrachten in één keten. # Lijkt op ">", maar is eigenlijk uitgebreider. # Wordt gebruikt om opdrachten, scripts, bestanden en programma's te combineren in één keten (pijplijn). kat *.txt | sorteer | uniq > resultaatbestand # De inhoud van alle .txt-bestanden wordt gesorteerd, dubbele regels worden verwijderd, # het resultaat wordt opgeslagen in het bestand "resultaatbestand".

Omleidingsbewerkingen en/of pijplijnen kunnen op dezelfde opdrachtregel worden gecombineerd.

commando< input-file >uitvoerbestand commando1 | commando2 | command3 > uitvoerbestand Zie voorbeeld 12-23 en voorbeeld A-17.

Het is mogelijk om meerdere streams naar één bestand om te leiden.

ls -yz >> command.log 2>&1 # Een bericht over een ongeldige "yz"-optie in de opdracht "ls" wordt naar het bestand "command.log" geschreven. # Omdat stderr wordt omgeleid naar een bestand.

Dossierhandvatten sluiten

Sluit de invoerbestandsdescriptor.

0<&-, <&-

Sluit de descriptor van het uitvoerbestand.

1>&-, >&-

Onderliggende processen nemen open bestandshandles over. Dit is de reden waarom transportbanden werken. Om te voorkomen dat ingangen worden overgenomen, sluit u deze voordat u het onderliggende proces start.

# Alleen stderr wordt in de pijplijn doorgegeven. exec 3>&1 # Bewaar de huidige "status" in stdout. ls -l 2>&1 >&3 3>&- | grep bad 3>&- # Sluit besc. 3 voor "grep" (maar niet voor "ls"). # ^^^^ ^^^^ exec 3>&- # Sluit het nu voor de rest van het script. # Bedankt S.C.

Zie bijlage D voor meer informatie over I/O-omleiding.

16.1. Met behulp van de opdracht uitvoerend

Team uitvoerend leidt invoer om van naar een bestand. Vanaf nu zal alle invoer, in plaats van (meestal het toetsenbord), vanuit dit bestand worden gedaan. Dit maakt het mogelijk om de inhoud van een bestand regel voor regel te lezen en elke ingevoerde regel te ontleden met sed en/of awk.

Voorbeeld 16-1. Omleiden met exec

#!/bin/bash # Stdin omleiden met "exec". ex 6<&0 # Связать дескр. #6 со стандартным вводом (stdin). # Сохраняя stdin. exec < data-file # stdin заменяется файлом "data-file" read a1 # Читается первая строка из "data-file". read a2 # Читается вторая строка из "data-file." echo echo "Следующие строки были прочитаны из файла." echo "——————————————" echo $a1 echo $a2 echo; echo; echo exec 0<&6 6<&- # Восстанавливается stdin из дескр. #6, где он был предварительно сохранен, #+ и дескр. #6 закрывается (6<&-) освобождая его для других процессов. # # <&6 6<&- дает тот же результат. echo -n "Введите строку " read b1 # Теперь функция "read", как и следовало ожидать, принимает данные с обычного stdin. echo "Строка, принятая со stdin." echo "—————————" echo "b1 = $b1" echo exit 0

Zo ook het ontwerp exec >bestandsnaam stuurt de uitvoer door naar het opgegeven bestand. Hierna wordt alle uitvoer van opdrachten waar normaal gesproken naartoe zou worden gestuurd, nu naar dit bestand uitgevoerd.

Voorbeeld 16-2. Omleiden met exec

#!/bin/bash # reassign-stdout.sh LOGFILE=logfile.txt exec 6>&1 # Linkbesch. #6 met stdout. # Stdout opslaan. exec > $LOGFILE # stdout wordt vervangen door het bestand "logfile.txt". # ———————————————————— # # Alle uitvoer van de opdrachten in dit blok wordt naar het $LOGFILE-bestand geschreven. echo -n "Logbestand: " datum echo "————————————-" echo echo "Uitvoer van \"ls -al\"" echo ls -al echo; echo echo "Uitvoer van het commando \"df\"" echo df # ———————————————————— # exec 1>&6 6>&- # Herstel stdout en sluit het bestand. #6. echo echo "== stdout hersteld naar standaard == " echo ls -al echo exit 0

Voorbeeld 16-3. Gelijktijdige omleiding van apparaten, en met behulp van de exec-opdracht

#!/bin/bash # upperconv.sh # Converteert tekens in het invoerbestand naar hoofdletters. E_FILE_ACCESS=70 E_WRONG_ARGS=71 als [ ! -r "$1" ] # Is het bestand leesbaar? echo dan "Kan het opgegeven bestand niet lezen!" echo "Gebruik: $0 invoerbestand uitvoerbestand" exit $E_FILE_ACCESS fi # Als het invoerbestand ($1) niet #+ is gespecificeerd, zal de afsluitcode hetzelfde zijn. if [ -z "$2" ] then echo "Het uitvoerbestand moet worden opgegeven." echo "Gebruik: $0 invoerbestand uitvoerbestand" exit $E_WRONG_ARGS fi exec 4<&0 exec < $1 # Назначить ввод из входного файла. exec 7>&1 exec > $2 # Wijs uitvoer toe aan een uitvoerbestand. # Ervan uitgaande dat het uitvoerbestand beschrijfbaar is # (controle toevoegen?). # ————————————————— kat — | tr a-z A-Z # Converteren naar hoofdletters # ^^^^^ # Lezen van stdin. # ^^^^^^^^^^ # Schrijf naar stdout. # Zowel stdin als stdout zijn echter omgeleid. # ———————————————— exec 1>&7 7>&- # Stdout herstellen. exec 0<&4 4<&- # Восстановить stdin. # После восстановления, следующая строка выводится на stdout, чего и следовало ожидать. echo "Символы из \"$1\" преобразованы в верхний регистр, результат записан в \"$2\"." exit 0

Volgende: Fouten omleiden naar een bestand Omhoog: I/O-omleiding Vorig: Invoer uit een bestand omleiden Inhoud Inhoudsopgave

Uitvoer omleiden naar een bestand

Om standaarduitvoer naar een bestand om te leiden, gebruikt u de operator `>'.

I/O-omleiding in Linux

Volg de opdrachtnaam met de operator >, gevolgd door de naam van het bestand dat als bestemming voor de uitvoer zal dienen. Als u bijvoorbeeld de uitvoer van een programma naar een bestand wilt schrijven, voert u het volgende in:

Als u de standaarduitvoer omleidt naar een reeds bestaand bestand, wordt dit vanaf het begin overschreven. Om standaarduitvoer aan de inhoud van een bestaand bestand toe te voegen, moet u de operator `"' gebruiken. Als u bijvoorbeeld de resultaten van het werk wilt toevoegen wanneer u het programma opnieuw aan een bestand uitvoert, voert u het volgende in:

Alex Otwagin 2002-12-16

Een programma is meestal waardevol omdat het gegevens kan verwerken: het ene accepteren, het andere als uitvoer produceren, en bijna alles kan als gegevens fungeren: tekst, getallen, geluid, video... De invoer- en uitvoergegevensstromen voor een opdracht worden genoemd invoer En conclusie. Elk programma kan meerdere invoer- en uitvoerstromen hebben. Elk proces ontvangt, wanneer het wordt gemaakt, noodzakelijkerwijs de zogenaamde standaard invoer(standaardinvoer, stdin) en standaard uitvoer(standaarduitvoer, stdout) en standaard foutuitvoer(standaardfout, stderr).

Standaard invoer-/uitvoerstromen zijn primair bedoeld voor het uitwisselen van tekstinformatie. Het maakt niet eens uit wie via sms communiceert: een persoon met een programma of programma's onderling - het belangrijkste is dat ze een datatransmissiekanaal hebben en dat ze “dezelfde taal” spreken.

Het tekstuele principe van het werken met een machine stelt je in staat om te ontsnappen aan specifieke delen van de computer, zoals het systeemtoetsenbord en de videokaart met een monitor, en naar een enkele te kijken eindapparaat, waarmee de gebruiker tekst (opdrachten) invoert en deze naar het systeem verzendt, en het systeem de door de gebruiker vereiste gegevens en berichten weergeeft (diagnostiek en fouten). Zo'n apparaat heet terminal. Over het algemeen is een terminal het toegangspunt van een gebruiker tot een systeem dat de mogelijkheid heeft om tekstinformatie te verzenden. Een terminal kan een afzonderlijk extern apparaat zijn dat via een seriële datapoort op een computer is aangesloten (in een personal computer wordt dit een “COM-poort” genoemd). Een programma (bijvoorbeeld xterm of ssh) kan ook als terminal werken (met enige ondersteuning van het systeem). Eindelijk, virtuele consoles- ook terminals, alleen programmatisch georganiseerd met behulp van geschikte apparaten van een moderne computer.

Wanneer u op de opdrachtregel werkt, wordt de standaardinvoer van de shell geassocieerd met het toetsenbord, en worden de standaarduitvoer en foutuitvoer geassocieerd met het beeldscherm (of het terminalemulatorvenster). Laten we het laten zien met het eenvoudigste commando - cat. Meestal de ploeg kat leest gegevens uit alle bestanden die zijn opgegeven als parameters en verzendt de lezing rechtstreeks naar de standaarduitvoer (stdout). Daarom het commando

/home/larry/papers# cat history-finale masterproef

zal eerst de inhoud van het bestand weergeven, en dan het bestand.

Als de bestandsnaam echter niet is opgegeven, wordt het programma kat leest invoer van stdin en stuurt deze onmiddellijk terug naar stdout (zonder deze op enigerlei wijze te wijzigen). Gegevens passeren kat zoals door een pijp. Laten we een voorbeeld geven:

/home/larry/papers# cat Hallo daar. Hallo daar. Doei. Doei. CtrlD/home/larry/papieren#

Elke regel die via het toetsenbord wordt ingevoerd, wordt door het cat-programma onmiddellijk teruggestuurd naar het scherm. Bij het invoeren van informatie via standaardinvoer wordt het einde van de tekst meestal aangegeven door het invoeren van een speciale toetsencombinatie CtrlD.

Laten we nog een voorbeeld geven. Team soort leest regels invoertekst (ook van stdin als er geen bestandsnaam is opgegeven) en voert een set van deze regels in een geordende vorm uit op stdout. Laten we de actie ervan controleren.

/home/larry/papers# bananen wortelen appels sorteren Ctrl+D appels bananen wortelen /home/larry/papers#

Zoals je kunt zien, na het indrukken CtrlD, soort Toont de regels in alfabetische volgorde.

Standaardinvoer en standaarduitvoer

Stel dat u de uitvoer van de sorteeropdracht naar een bestand wilt doorsturen om een ​​alfabetisch geordende lijst op schijf op te slaan. Met de opdrachtshell kunt u de standaarduitvoer van een opdracht omleiden naar een bestand met behulp van een symbool. Laten we een voorbeeld geven:

/home/larry/papers# sorteer > boodschappenlijstje bananen wortelen appels CtrlD/home/larry/papieren#

U kunt zien dat de uitvoer van het sorteercommando niet op het scherm wordt afgedrukt, maar wordt opgeslagen in een bestand met de naam. Laten we de inhoud van dit bestand weergeven:

/home/larry/papers# katten boodschappenlijstje appels bananen wortelen /home/larry/papers#

Laat nu de originele ongeordende lijst in een bestand staan. Deze lijst kan worden gesorteerd met behulp van de opdracht soort, door het te vertellen dat het uit een bepaald bestand moet lezen in plaats van uit de standaardinvoer, en bovendien de standaarduitvoer om te leiden naar een bestand, zoals hierboven werd gedaan. Voorbeeld:

/home/larry/papers# items sorteren boodschappenlijstje /home/larry/papers# katten boodschappenlijstje appels bananen wortelen /home/larry/papers#

U kunt het echter anders doen door niet alleen de standaarduitvoer om te leiden, maar ook standaard invoer hulpprogramma's uit het bestand met behulp van het symbool:

/home/larry/papers# sorteren< items apples bananas carrots /home/larry/papers#

Commandoresultaat soort< items gelijk aan de opdracht artikelen sorteren, maar de eerste laat het volgende zien: bij het geven van de opdracht soort< items het systeem gedraagt ​​zich alsof de gegevens in het bestand via standaardinvoer zijn ingevoerd. Omleiding wordt gedaan door de opdrachtshell. Team soort de bestandsnaam werd niet gerapporteerd: dit commando las gegevens uit de standaardinvoer alsof we deze via het toetsenbord hadden ingevoerd.

Laten we het concept introduceren filter. Een filter is een programma dat gegevens uit standaardinvoer leest, deze op de een of andere manier verwerkt en het resultaat naar standaarduitvoer verzendt. Wanneer omleiding wordt toegepast, kunnen bestanden worden gebruikt als standaard invoer en uitvoer. Zoals hierboven vermeld, verwijzen stdin en stdout standaard naar respectievelijk het toetsenbord en het scherm. Het sorteerprogramma is een eenvoudig filter: het sorteert de invoergegevens en stuurt het resultaat naar de standaarduitvoer. Een heel eenvoudig filter is het programma kat- het doet niets met de invoergegevens, maar stuurt deze eenvoudig naar de uitvoer.

We hebben hierboven al gedemonstreerd hoe je het sorteerprogramma als filter kunt gebruiken. In deze voorbeelden werd ervan uitgegaan dat de brongegevens zich in een bepaald bestand bevonden of dat de brongegevens via het toetsenbord zouden worden ingevoerd (standaardinvoer). Maar wat als u gegevens wilt sorteren die het resultaat zijn van een ander commando, bijvoorbeeld: ls?

We sorteren de gegevens in omgekeerde alfabetische volgorde; dit wordt gedaan door de opdrachtoptie soort. Als u de bestanden in de huidige map in omgekeerde alfabetische volgorde wilt weergeven, kunt u dit op de volgende manier doen.

I/O-omleiding

Laten we eerst het commando gebruiken ls:

/home/larry/papers# ls engelse lijst geschiedenis-finale masterscriptie-aantekeningen /home/larry/papers#

Nu leiden we de opdrachtuitvoer om ls naar een bestand met de naam file-list

/home/larry/papers# ls > bestandenlijst /home/larry/papers# sort -r bestandslijst notities masterproefgeschiedenis-finale engelse lijst /home/larry/papers#

Hier is de opdrachtuitvoer ls opgeslagen in een bestand, en daarna werd dit bestand verwerkt door de opdracht soort. Dit pad is echter onelegant en vereist het gebruik van een tijdelijk bestand om de programma-uitvoer op te slaan ls.

Een oplossing voor deze situatie zou kunnen zijn om te creëren gedockte opdrachten(pijpleidingen). Het docken wordt uitgevoerd door de opdrachtshell, die de stdout van het eerste commando naar de stdin van het tweede commando stuurt. In dit geval willen we opdrachten naar stdout sturen ls naar stdin-opdrachten soort. Voor het koppelen wordt een symbool gebruikt, zoals weergegeven in het volgende voorbeeld:

/home/larry/papers# ls | sort -r notes masterscriptie geschiedenis-finale engelse lijst /home/larry/papers#

Deze opdracht is korter dan een verzameling opdrachten en is gemakkelijker te typen.

Laten we eens naar een ander nuttig voorbeeld kijken. Team

/home/larry/papers# ls /usr/bin

retourneert een lange lijst met bestanden. Het grootste deel van deze lijst vliegt te snel over het scherm om de inhoud van deze lijst te kunnen lezen. Laten we proberen de opdracht more te gebruiken om deze lijst in delen weer te geven:

/home/larry/papers# ls /usr/bin | meer

Nu kunt u deze lijst ‘doorbladeren’.

Je kunt verder gaan en meer dan twee teams aanmeren. Denk aan het team hoofd, wat een filter is met de volgende eigenschap: het voert de eerste regels uit de invoerstroom uit (in ons geval zal de invoer de uitvoer zijn van verschillende aaneengeschakelde opdrachten). Als we de laatste alfabetische bestandsnaam in de huidige map willen weergeven, kunnen we de volgende lange opdracht gebruiken:

/home/larry/papers# ls | sorteer -r | hoofd -1 notities /home/larry/papers\#

waar is de ploeg hoofd geeft de eerste regel weer van de invoerstroom van regels die het ontvangt (in ons geval bestaat de stroom uit gegevens van de opdracht ls), gesorteerd in omgekeerde alfabetische volgorde.

Gestapelde opdrachten gebruiken (pijplijn)

Het effect van het gebruik van een symbool om de bestandsuitvoer om te leiden is destructief; met andere woorden: het team

/home/larry/papers# ls > bestandslijst

zal de inhoud van het bestand vernietigen als het bestand eerder bestond en in plaats daarvan een nieuw bestand maken.

Als de omleiding in plaats daarvan wordt uitgevoerd met behulp van symbolen, wordt de uitvoer toegevoegd aan het einde van het opgegeven bestand zonder de oorspronkelijke inhoud van het bestand te vernietigen. De opdracht bijvoorbeeld

/home/larry/papers# ls >> bestandslijst

schrijft de uitvoer van de opdracht toe ls naar het einde van het bestand.

Houd er rekening mee dat invoer- en uitvoeromleiding en opdrachtsplitsing worden uitgevoerd door shells die het gebruik van symbolen ondersteunen. De teams zijn zelf niet in staat deze symbolen waar te nemen en te interpreteren.

Niet-destructieve uitvoeromleiding

Zoiets zou moeten doen wat je nodig hebt?

Kijk eens: wintee

Cygwin is niet nodig.

Ik ben echter enkele problemen tegengekomen en gerapporteerd.

Misschien wil je ook http://unxutils.sourceforge.net/ bekijken omdat het tee bevat (en geen cygwin nodig heeft), maar wees voorzichtig dat de EOL-uitvoer UNIX-achtig is.

Last but not least, als je PowerShell hebt, kun je Tee-Object proberen. Typ de PowerShell-console voor meer informatie.

Dit werkt, hoewel het een beetje lelijk is:

Het is iets flexibeler dan sommige andere oplossingen, omdat het op zijn eigen manier werkt, zodat u het kunt gebruiken om iets toe te voegen.

Ik gebruik dit vrij vaak in batchbestanden om berichten te loggen en weer te geven:

Ja, je zou de ECHO-verklaring gewoon kunnen herhalen (een keer voor het scherm en een tweede keer doorverwijzen naar het logbestand), maar dat ziet er net zo slecht uit en is een onderhoudsprobleem.

Het omleiden van input en output

Zo hoef je in ieder geval niet op twee plekken wijzigingen in berichten aan te brengen.

Houd er rekening mee dat _ slechts een korte bestandsnaam is, dus u moet deze aan het einde van uw batchbestand verwijderen (als u een batchbestand gebruikt).

Hierdoor wordt een logbestand gemaakt met de huidige tijd en tijd en kunt u tijdens het proces de consoleregels gebruiken

Als u cygwin in uw Windows-omgevingspad hebt, kunt u het volgende gebruiken:

Een eenvoudige C#-consoletoepassing zou voldoende zijn:

Om dit te gebruiken, geeft u eenvoudigweg de source-opdracht door aan het programma en geeft u het pad op naar alle bestanden waarvan u de uitvoer wilt dupliceren. Bijvoorbeeld:

Zal zoekresultaten weergeven en de resultaten ook opslaan in files1.txt en files2.txt.

Houd er rekening mee dat er niet veel foutafhandeling is (niets!) en dat ondersteuning voor meerdere bestanden mogelijk niet nodig is.

Ik was ook op zoek naar dezelfde oplossing, na een beetje proberen kon ik dit met succes doen op de opdrachtregel. Hier is mijn oplossing:

Het kaapt zelfs elk PAUSE-commando.

Een alternatief is om stdout naar stderr in je programma te zetten:

Vervolgens in uw dos-batchbestand:

Stdout gaat naar het logbestand en stderr (dezelfde gegevens) wordt op de console weergegeven.

Uitvoer weergeven en omleiden naar een bestand. Stel dat als ik de opdracht dos, dir> test.txt gebruik, deze opdracht de uitvoer omleidt naar het bestand test.txt zonder de resultaten weer te geven. hoe je een opdracht schrijft om de uitvoer af te drukken en de uitvoer om te leiden naar een bestand met behulp van DOS, d.w.z. de Windows-opdrachtregel, niet UNIX/LINUX.

Mogelijk vindt u deze commando's in biterscripting (http://www.biterscripting.com) handig.

Dit is een variatie op het eerdere antwoord van MTS, maar het voegt enkele functies toe die voor anderen nuttig kunnen zijn. Hier is de methode die ik heb gebruikt:

  • De opdracht wordt ingesteld als een variabele die later in de code kan worden gebruikt om naar het opdrachtvenster te worden uitgevoerd en aan het logbestand te worden toegevoegd met behulp van
    • het commando vermijdt omleiding met behulp van het wortelsymbool, zodat commando's in eerste instantie niet worden geëvalueerd
  • Er wordt een tijdelijk bestand gemaakt met een bestandsnaam die lijkt op die van een batchbestand, dat de syntaxis van de opdrachtregeloptie-extensie gebruikt om de naam van het batchbestand te verkrijgen.
  • Het resultaat wordt toegevoegd aan een apart logbestand

Hier is de volgorde van de opdrachten:

  1. Uitvoer- en foutmeldingen worden naar een tijdelijk bestand verzonden
  2. De inhoud van het tijdelijke bestand is dan:
    • toegevoegd aan logbestand
    • uitvoer naar het opdrachtvenster
  3. Het tijdelijke bestand met het bericht wordt verwijderd

Hier is een voorbeeld:

Op deze manier kan het commando eenvoudig na latere commando's worden toegevoegd in een batchbestand, dat er veel overzichtelijker uitziet:

Dit kan ook aan het einde van andere opdrachten worden toegevoegd. Voor zover ik weet, werkt dit als berichten uit meerdere regels bestaan. Met de volgende opdracht worden bijvoorbeeld twee regels afgedrukt als er een foutmelding is:

Ik ben het met Brian Rasmussen eens: de unxutils-poort is de gemakkelijkste manier om dit te doen. In de sectie Batchbestanden van zijn Scripting-pagina's biedt Rob van der Woude een schat aan informatie over het gebruik van MS-DOS- en CMD-opdrachten. Ik dacht dat het misschien een eigen oplossing voor je probleem had, en nadat TEE.BAT daar rond had gezocht, vond ik TEE.BAT, wat precies dat lijkt te zijn: een verpakt MS-DOS-taalpakket. Dit is een vrij complex batchbestand en ik zou geneigd zijn de unxutils-poort te gebruiken.

Ik installeer perl op de meeste van mijn machines, dus het antwoord is het gebruik van perl: tee.pl

richt | perl tee.pl of catalogus | perl tee.pl dir.bat

rauw en ongetest.

Een van de interessantste en nuttigste onderwerpen voor systeembeheerders en nieuwe gebruikers die net beginnen te begrijpen hoe ze met de terminal moeten werken, is het omleiden van Linux I/O-streams. Met deze terminalfunctie kunt u de uitvoer van opdrachten naar een bestand omleiden, of de inhoud van een bestand naar opdrachtinvoer omleiden, opdrachten samenvoegen en opdrachtpijplijnen vormen.

In dit artikel zullen we bekijken hoe I/O-streamomleiding in Linux wordt uitgevoerd, welke operators hiervoor worden gebruikt en waar dit allemaal kan worden gebruikt.

Alle opdrachten die we uitvoeren, leveren ons drie soorten gegevens op:

  • Het resultaat van de opdracht, meestal tekstgegevens opgevraagd door de gebruiker;
  • Foutmeldingen - informeer over het proces van opdrachtuitvoering en onverwachte omstandigheden die zich hebben voorgedaan;
  • De returncode is een getal waarmee u kunt beoordelen of het programma correct heeft gewerkt.

In Linux worden alle substanties beschouwd als bestanden, inclusief Linux input/output-streams - bestanden. Elke distributie heeft drie hoofdstroombestanden die programma's kunnen gebruiken. Deze worden gedefinieerd door de shell en geïdentificeerd door hun bestandsdescriptornummer:

  • STDIN of 0- dit bestand is gekoppeld aan het toetsenbord en de meeste opdrachten ontvangen gegevens om vanaf hier te werken;
  • STDOUT of 1- dit is de standaarduitvoer; het programma verzendt hier alle resultaten van zijn werk. Het wordt geassocieerd met het scherm, of om preciezer te zijn, met de terminal waarin het programma draait;
  • STDERR of 2- alle foutmeldingen worden naar dit bestand uitgevoerd.

Met I/O-omleiding kunt u een van deze bestanden vervangen door uw eigen bestanden. U kunt bijvoorbeeld een programma dwingen gegevens uit een bestand op het bestandssysteem te lezen in plaats van op het toetsenbord, u kunt ook fouten naar een bestand afdrukken in plaats van naar het scherm, enz. Dit alles gebeurt met behulp van symbolen "<" En ">" .

Uitvoer omleiden naar bestand

Alles is heel eenvoudig. U kunt de uitvoer naar een bestand omleiden met behulp van het > symbool. Laten we bijvoorbeeld de uitvoer van het topcommando opslaan:

top -bn 5 > top.log

De optie -b zorgt ervoor dat het programma in niet-interactieve batchmodus draait, en n - herhaalt de bewerking vijf keer om informatie over alle processen te verkrijgen. Laten we nu eens kijken wat er met de kat is gebeurd:

Symbool ">" overschrijft informatie uit een bestand als er al iets is. Om gegevens toe te voegen aan het eindgebruik ">>" . Stuur de uitvoer bijvoorbeeld door naar een Linux-bestand voor top:

top -bn 5 >> top.log

Standaard wordt de stgebruikt voor omleiding. Maar u kunt dit expliciet specificeren. Dit commando geeft hetzelfde resultaat:

top -bn 5 1>top.log

Fouten omleiden naar bestand

Om de foutuitvoer naar een bestand om te leiden, moet u expliciet de bestandsdescriptor opgeven die u gaat omleiden. Voor fouten is dit nummer 2. Wanneer u bijvoorbeeld probeert toegang te krijgen tot de superuser-directory, zal ls een foutmelding genereren:

U kunt de standaardfout omleiden naar een bestand als dit:

ls -l /root/ 2> ls-error.log
$ cat ls-error.log

Gebruik hetzelfde symbool om gegevens aan het einde van het bestand toe te voegen:

ls -l /root/ 2>>ls-error.log

Leid standaarduitvoer en fouten om naar bestand

U kunt ook alle uitvoer, fouten en standaarduitvoer omleiden naar één enkel bestand. Er zijn twee manieren om dit te doen. De eerste, oudere, is om beide handvatten door te geven:

ls -l /root/ >ls-error.log 2>&1

Eerst wordt de uitvoer van het ls-commando naar het ls-error.log-bestand gestuurd met behulp van het eerste omleidingsteken. Vervolgens worden alle fouten naar hetzelfde bestand verzonden. De tweede methode is eenvoudiger:

ls -l /root/ &> ls-error.log

U kunt ook toevoegen gebruiken in plaats van herschrijven:

ls -l /root/ &>> ls-error.log

Standaardinvoer uit bestand

De meeste programma's, behalve services, ontvangen gegevens voor hun werk via standaardinvoer. Standaard verwacht standaardinvoer invoer van het toetsenbord. Maar u kunt het programma dwingen gegevens uit een bestand te lezen met behulp van de operator "<" :

kat

U kunt de uitvoer ook onmiddellijk naar een bestand omleiden. Laten we de lijst bijvoorbeeld opnieuw sorteren:

soort sorteer.uitvoer

We sturen dus invoer/uitvoer met één opdracht om naar Linux.

Gebruik van tunnels

U kunt niet alleen met bestanden werken, maar ook de uitvoer van het ene commando omleiden als de invoer van een ander commando. Dit is erg handig bij het uitvoeren van complexe bewerkingen. Laten we bijvoorbeeld vijf onlangs gewijzigde bestanden weergeven:

ls -lt | hoofd -n 5

Met het hulpprogramma xargs kunt u opdrachten combineren, zodat standaardinvoer als parameters wordt doorgegeven. Laten we bijvoorbeeld één bestand naar verschillende mappen kopiëren:

echotest/tmp/ | xargs -n 1 cp -v testbestand.sh

Hier specificeert de -n 1 optie dat slechts één parameter per commando moet worden opgegeven, en de -v optie voor cp maakt het mogelijk om gedetailleerde informatie over bewegingen af ​​te drukken. Een ander nuttig commando in dergelijke gevallen is tee. Het leest gegevens uit standaardinvoer en schrijft naar standaarduitvoer of bestanden. Bijvoorbeeld:

echo "T-bedieningstest" | tee-bestand1

In combinatie met andere commando's kunnen deze worden gebruikt om complexe instructies met meerdere commando's te creëren.

conclusies

In dit artikel hebben we de basisprincipes van Linux I/O-streamomleiding besproken. Nu weet je hoe je de uitvoer naar een Linux-bestand of de uitvoer uit een bestand kunt omleiden. Het is heel eenvoudig en handig. Als je vragen hebt, stel ze dan in de reacties!

Als de uitvoer naar de (grafische) console niet erg omvangrijk is, kunt u eenvoudig met de muis een stuk selecteren en dit in het bericht invoegen door op de middelste knop te klikken. Anders kunt u de uitvoer via een trechter omleiden naar een bestand, zoals deze:

Some_command-parameters > logbestand.txt

Om het uitvoeringsresultaat op het scherm te zien en tegelijkertijd naar een bestand te schrijven, kunt u het tee-commando gebruiken:

Some_command-parameters | tee -een logbestand.txt

De opdracht setterm -dump maakt een momentopname van de huidige virtuele consolebuffer als een eenvoudig tekstbestand met de standaardnaam screen.dump. Als argument kun je het nummer van de console gebruiken waarvoor je wilt dumpen. En als u de optie -file bestandsnaam toevoegt, wordt deze dump omgeleid naar een bestand met de opgegeven naam. De optie -append voegt een nieuwe dump toe aan een reeds bestaand bestand - de "standaard" screen.dump of genoemd met de optie -file.

Die. na gebruik van het commando like

Setterm -dump -bestand /root/screenlog

respectievelijk in het bestand /root/schermlog zal de inhoud zijn van één consolepagina.

Ik heb een andere oplossing gevonden voor het kopiëren/plakken van tekst in een tekstconsole zonder muis. Je kunt ook tekst uit de scrollbuffer kopiëren (dus alles op het scherm en boven het scherm). Voor een beter begrip leest u over het consolevensterbeheerscherm. Het kan ook nuttig zijn om de scrollbuffergrootte te vergroten.

1) Startscherm

2) Druk op Enter. Alle. We bevinden ons in consolevenster nul.

3) Voer de benodigde opdrachten uit, waarvan de uitvoer moet worden gekopieerd.

4) Ctrl+A, Ctrl+[ - we bevinden ons in de kopieermodus. Plaats de cursor aan het begin van de selectie, druk op de spatiebalk, plaats de cursor vervolgens aan het einde van de selectie en druk op de spatiebalk. De tekst is naar het klembord gekopieerd.

5) Ctrl+A, c - we hebben een nieuw eerste venster gemaakt.

6) Ctrl+A, 1 - we gingen naar het eerste venster.

7) Open een (?) teksteditor (ik heb het in mc geprobeerd) en druk op Ctrl+A, Ctrl+] - de tekst wordt ingevoegd. Redden.

8) Ctrl+A, Ctrl+0 - ga terug naar het nulvenster.

Hoe kan ik de scrollback-buffer vergroten?

De eerste oplossing zou zijn om de standaardbuffergrootte in de kernelbronnen te vergroten en deze opnieuw te compileren. Laat ik ervan uitgaan dat u hier net zo afkerig van bent als ik en op zoek bent naar een flexibelere oplossing.

En er is zo'n tool, en het heet framebuffer console, kortweg fbcon. Dit apparaat heeft een documentatiebestand fbcon.txt; als je de kerneldocumentatie hebt geïnstalleerd, dan heb je die. Zoek hem ergens in de omgeving /usr/deel branches (ik kan het exacte pad niet specificeren vanwege verschillen in distributies).

Op dit punt bied ik mijn excuses aan: we moeten een kleine uitweiding maken en wat praten over de videobuffer ( framebuffer ).

Een videobuffer is een buffer tussen het beeldscherm en de videoadapter. Het mooie ervan is dat het kan worden gemanipuleerd: het maakt trucs mogelijk die niet zouden werken als de adapter rechtstreeks op het scherm zou worden aangesloten.

Eén zo'n truc betreft de scrollbuffer; Het blijkt dat je de videobuffer kunt "vragen" om meer geheugen aan de scrollbuffer toe te wijzen. Dit wordt bereikt via kernel-opstartparameters. Eerst eis je framebuffer(videobuffer); Dan vraag je een grotere scrollbuffer aan.

Het volgende voorbeeld is voor GRUB, maar kan eenvoudig worden aangepast aan LILO. In het GRUB-configuratiebestand - menu.lst- zoek de regel die overeenkomt met de kernel, en dan: Verwijder de optie vga=xxx, indien aanwezig. Voeg de optie video=vesabf toe of wat dan ook overeenkomt met uw hardware. Voeg de optie fbcon=scrollback:128 toe. Na deze procedure zou de kernelparameterregel er ongeveer zo uit moeten zien:

Kernel /vmlinuz root=/dev/sdb5 video=radeonfb fbcon=scrollback:128

De vraag is: waarom zou u de optie vga=xxx verwijderen? Vanwege mogelijke conflicten met de video-optie. Op mijn ATI-adapter kan ik de scrollbuffer niet wijzigen als vga=xxx in de lijst staat. Het kan zijn dat dit in uw geval niet het geval is. Als de bovenstaande opties werken, goed; maar wat als u het aantal regels wilt vergroten of een kleiner lettertype op het scherm wilt instellen? Je deed dit altijd met de optie vga=xxx - en die is verdwenen. Maak je geen zorgen: hetzelfde kan worden bereikt door de fbcon-parameters te wijzigen zoals beschreven in het bestand fbcon.txt(maar niet beschreven in dit artikel).

Met de optie fbcon=scrollback:128 werd mijn scrollbuffer vergroot tot 17 schermen (35 keer Shift+PgUp over een half scherm). Trouwens, 128 is een kilobyte. De auteur van het artikel beweert dat het onmogelijk is om meer vast te stellen. Ik heb het niet geprobeerd.

Je kunt een script gebruiken.

Scriptbestandsnaam.log

wanneer alle noodzakelijke opdrachten zijn voltooid -

Alles wordt vastgelegd in bestandsnaam.log

FreeBSD heeft een prachtig watch-hulpprogramma waarmee je terminals kunt monitoren, maar het blijkt dat het in Linux compleet andere functies vervult =\ Als je dit onderwerp googlet, zul je iets vinden...

  • Vertaling

Als je de basisprincipes van de terminal al onder de knie hebt, ben je misschien klaar om de commando's die je hebt geleerd te combineren. Soms is het één voor één uitvoeren van shell-commando's voldoende om een ​​bepaald probleem op te lossen, maar in sommige gevallen is het invoeren van commando na commando te vervelend en irrationeel. In een situatie als deze kunnen enkele speciale symbolen, zoals punthaken, van pas komen.

Voor de shell, de Linux-opdrachtinterpreter, zijn deze extra tekens geen verspilling van schermruimte. Het zijn krachtige teams die verschillende stukjes informatie aan elkaar kunnen koppelen, wat voorheen één geheel was, kunnen scheiden en nog veel meer kunnen doen. Een van de eenvoudigste, maar krachtigste en meest gebruikte functies van de shell is het omleiden van standaard invoer-/uitvoerstromen.

Drie standaard I/O-streams

Om te begrijpen waar we het hier over gaan hebben, is het belangrijk om te weten waar de gegevens die kunnen worden omgeleid vandaan komen en waar deze naartoe gaan. Linux heeft drie standaard I/O-streams.

De eerste is de standaardinvoerstroom. In het systeem is dit thread nr. 0 (aangezien bij computers het tellen meestal vanaf nul begint). Draadnummers worden ook wel descriptors genoemd. Deze stroom vertegenwoordigt een deel van de informatie die naar de terminal wordt doorgegeven, in het bijzonder instructies die ter uitvoering naar de shell worden doorgegeven. Doorgaans komen gegevens in deze stroom binnen terwijl de gebruiker deze via het toetsenbord invoert.

De tweede stroom is de standaarduitvoerstroom, genummerd 1. Dit is de gegevensstroom die de shell uitvoert na het uitvoeren van een bepaalde actie. Normaal gesproken komen deze gegevens terecht in hetzelfde terminalvenster waar de opdracht die ervoor zorgde dat ze verschenen, werd ingevoerd.

En ten slotte is de derde stream de standaardfoutstream, deze heeft handvat 2. Deze stream is vergelijkbaar met de standaarduitvoerstream, omdat wat erin gaat meestal op het terminalscherm terechtkomt. Het verschilt echter inherent van de standaarduitvoer, en als gevolg daarvan kunnen deze stromen desgewenst afzonderlijk worden bestuurd. Dit is bijvoorbeeld handig in de volgende situatie. Er is een team dat een grote hoeveelheid data verwerkt en daarbij een complexe en foutgevoelige operatie uitvoert. U wilt dat de payload die deze opdracht genereert, niet wordt gemengd met foutmeldingen. Dit wordt bereikt door afzonderlijke omleiding van uitvoer- en foutstromen.

Zoals je waarschijnlijk al geraden had, betekent I/O-omleiding het werken met de hierboven beschreven stromen en het omleiden van de gegevens waar de programmeur deze nodig heeft. Dit gebeurt met de symbolen > en< в различных комбинациях, применение которых зависит от того, куда, в итоге, должны попасть перенаправляемые данные.

Standaarduitvoer omleiden

Stel dat u een bestand wilt maken waarin de huidige datum en tijd worden vastgelegd. Om de zaken gemakkelijker te maken, is er een commando, toepasselijk genaamd date , dat teruggeeft wat we nodig hebben. Meestal worden uitvoergegevens naar standaarduitvoer gestuurd. Om deze gegevens in het bestand te laten verschijnen, moet u het symbool > na de opdracht toevoegen, vóór de naam van het doelbestand. Voor en na > je moet een spatie plaatsen.

Wanneer u omleiding gebruikt, wordt elk bestand dat na > wordt opgegeven, overschreven. Als er niets waardevols in het bestand zit en de inhoud ervan verloren kan gaan, is het in ons ontwerp acceptabel om een ​​reeds bestaand bestand te gebruiken. Meestal is het in dit geval beter om een ​​bestandsnaam te gebruiken die nog niet bestaat. Dit bestand wordt aangemaakt nadat de opdracht is uitgevoerd. Laten we het date.txt noemen. De bestandsextensie na de punt doet er meestal niet zoveel toe, maar extensies helpen de zaken overzichtelijk te houden. Dus hier is onze opdracht:

$datum>datum.txt
Dit wil niet zeggen dat dit commando zelf ongelooflijk nuttig is, maar op basis daarvan kunnen we al iets interessants doen. Stel dat u wilt weten hoe uw internetverkeer naar een bepaald eindpunt wordt omgeleid door de gegevens dagelijks vast te leggen. De opdracht traceroute helpt bij het oplossen van dit probleem, die details rapporteert over de verkeersroute tussen onze computer en het eindpunt dat is opgegeven bij het aanroepen van de opdracht in de vorm van een URL. De gegevens bevatten informatie over alle routers waar het verkeer doorheen gaat.

Omdat we al een bestand met de datum hebben, zou het zeer gerechtvaardigd zijn om de gegevens die we van traceroute ontvangen eenvoudigweg aan dit bestand toe te voegen. Om dit te doen, moet u twee > symbolen gebruiken, achter elkaar geplaatst. Als gevolg hiervan zal een nieuw commando dat de uitvoer naar een bestand omleidt, maar het niet overschrijft, maar nieuwe gegevens toevoegt na de oude, er als volgt uitzien:

$ traceroute google.com >> datum.txt
Nu hoeven we alleen nog maar de bestandsnaam te veranderen in iets betekenisvols met behulp van de opdracht mv, waarbij de oorspronkelijke bestandsnaam als eerste argument wordt gebruikt en de nieuwe bestandsnaam als tweede:

$ mv datum.txt trace1.txt

Standaardinvoer omleiden

Met behulp van een teken< вместо >we kunnen standaardinvoer omleiden door deze te vervangen door de inhoud van een bestand.

Laten we zeggen dat we twee bestanden hebben: list1.txt en list2.txt, die elk een ongesorteerde lijst met tekenreeksen bevatten. Elke lijst bevat elementen die uniek zijn, maar sommige elementen in de lijst zijn hetzelfde. We kunnen de regels in zowel de eerste als de tweede lijst vinden met behulp van de opdracht comm, maar voordat we deze kunnen gebruiken, moeten de lijsten worden gesorteerd.

Er is een sorteeropdracht die een gesorteerde lijst naar de terminal retourneert zonder de gesorteerde gegevens op te slaan in het bestand waaruit deze zijn gehaald. U kunt een gesorteerde versie van elke lijst naar een nieuw bestand sturen met de opdracht > en vervolgens de opdracht comm gebruiken. Deze aanpak vereist echter minstens twee opdrachten, hoewel hetzelfde op één regel kan worden gedaan zonder onnodige bestanden te maken.

We kunnen het commando dus gebruiken< для перенаправления отсортированной версии каждого файла команде comm . Вот что у нас получилось:

$ comm<(sort list1.txt) <(sort list2.txt)
De haakjes hebben hier dezelfde betekenis als in de wiskunde. De shell verwerkt eerst de opdrachten tussen haakjes en daarna al het andere. In ons voorbeeld worden de regels uit de bestanden eerst gesorteerd en vervolgens wordt het resultaat doorgegeven aan de opdracht comm, die vervolgens het resultaat van het vergelijken van de lijsten weergeeft.

Standaardfoutstroom omleiden

Laten we het tenslotte hebben over de standaardfoutomleiding. Dit kan bijvoorbeeld nodig zijn om logbestanden met fouten aan te maken of om foutmeldingen en gegevens die door een bepaalde opdracht worden geretourneerd in één bestand te combineren.

Wat moet u bijvoorbeeld doen als u uw hele systeem wilt doorzoeken op informatie over draadloze interfaces die toegankelijk zijn voor gebruikers die geen rootrechten hebben? Om dit te doen, kunt u het krachtige zoekcommando gebruiken.

Wanneer een normale gebruiker de find-opdracht over het hele systeem uitvoert, worden doorgaans zowel nuttige gegevens als fouten naar de terminal verzonden. Tegelijkertijd zijn er meestal meer van de laatste dan de eerste, wat het moeilijk maakt om te vinden wat je nodig hebt in de opdrachtuitvoer. De oplossing voor dit probleem is vrij eenvoudig: stuur de standaardfoutstroom gewoon om naar een bestand met behulp van de opdracht 2> (onthoud dat 2 een descriptor is voor de standaardfoutstroom). Als gevolg hiervan verschijnt alleen wat de opdracht naar de standaarduitvoer verzendt op het scherm:

$ vind / -naam draadloos 2> geweigerd.txt
Wat als u de resultaten van een opdracht in een apart bestand moet opslaan zonder deze gegevens te vermengen met foutinformatie? Omdat streams onafhankelijk van elkaar kunnen worden omgeleid, kunnen we aan het einde van onze constructie een opdracht toevoegen om standaarduitvoer naar een bestand om te leiden:

$ vind / -naam draadloos 2> geweigerd.txt> gevonden.txt
Let op: de eerste hoekbeugel wordt geleverd met het nummer - 2>, en de tweede zonder. Dit komt omdat de standaarduitvoer handle 1 heeft, en de opdracht > is bedoeld om de standaarduitvoer om te leiden als er geen handlenummer is opgegeven.

Tenslotte, als je wilt dat alles wat de opdracht uitvoert in één bestand terechtkomt, kun je beide streams naar dezelfde locatie omleiden met behulp van de opdracht &>:

$ vind / -naam draadloos &> resultaten.txt

Resultaten

Hier hebben we alleen de basisprincipes van het thread-omleidingsmechanisme in de Linux-opdrachtregelinterpreter besproken, maar zelfs het weinige dat je vandaag hebt geleerd geeft je vrijwel onbeperkte mogelijkheden. En trouwens, net als al het andere dat te maken heeft met het werken in de terminal, vereist het beheersen van stream-omleiding oefening. Daarom raden we u aan uw eigen experimenten te beginnen met > en< .

Beste lezers! Kent u interessante voorbeelden van het gebruik van thread-omleiding in Linux die nieuwkomers zullen helpen zich meer op hun gemak te voelen met deze terminaltechniek?