Shell als programmeertaal en integrator. shell-opdrachttaal

    Besturingssystemen van de Linux-familie, evenals elk ander besturingssysteem, vereisen een interface voor interactie tussen de componenten van het computersysteem en de eindgebruiker, d.w.z. de aanwezigheid van een softwarelaag die invoer van commando's en parameters levert om de gewenste resultaten. Deze softwarelaag wordt genoemd "schelp" of, in het Engels - schelp.

Wat is een schil?

opdrachtshell ( schelp) zorgt voor interactie tussen de gebruiker en de Linux-besturingssysteemomgeving. Het is een gespecialiseerd softwareproduct dat zorgt voor de uitvoering van opdrachten en het verkrijgen van de resultaten van hun uitvoering, of, als het erg vereenvoudigd is, een shell is een programma dat is ontworpen om de uitvoering van andere programma's op verzoek van de gebruiker te garanderen. Een voorbeeld van een shell is bijvoorbeeld een commando-interpreter commando. com MS DOS-besturingssysteem of shell bashen Unix/Linux-besturingssystemen.

Alle shells hebben vergelijkbare functies en eigenschappen, in overeenstemming met hun hoofddoel - het uitvoeren van gebruikerscommando's en het weergeven van de resultaten van hun uitvoering:

Commandoregelinterpretatie.

Toegang tot opdrachten en hun resultaten.

Ondersteuning voor variabelen, speciale tekens en gereserveerde woorden.

Bestanden verwerken, standaard invoer- en uitvoerbewerkingen.

Implementatie van een speciale shell-programmeertaal.

    Voor besturingssystemen van de Unix / Linux-familie is het mogelijk om verschillende shells te gebruiken die verschillen in eigenschappen en manieren van interactie met het systeem. De meest voorkomende schelpen zijn

sch- schelp Bourne, klassieke Unix-shell

bashen schelp Nogmaals Bourne(GNU Bourne-Again Shell). Misschien wel de meest voorkomende op dit moment, de shell in de omgeving van de Linux-familie van besturingssystemen.

ksh- schelp Korn, ontworpen als een shell-ontwikkeling Bourne met opdrachtregelgeschiedenis en de mogelijkheid om opdrachten te bewerken.

csh- schelp C, gebruikmakend van de syntaxis van een populaire programmeertaal C

tcsh- shell-versie C met interactieve opdrachtregelbewerking.

Er kunnen verschillende shells op het systeem worden geïnstalleerd en het is voor elke gebruiker mogelijk om zijn eigen standaard shell te gebruiken. Dit gebeurt natuurlijk allemaal automatisch tijdens het downloaden en registreren van een gebruiker.

    Tijdens het laden van besturingssystemen van de Linux-familie wordt na het laden van de systeemkernel een overgang gemaakt naar de interactieve modus - de modus van interactie tussen de gebruiker en het besturingssysteem. Op Linux is het eerste proces dat start tijdens het opstarten het initialisatieprogramma. in het, die de inhoud van het configuratiebestand leest /etc/inittab, bepaalt de lijst en kenmerken van de beschikbare terminals in het systeem en roept het interactieve login-programma op getty A die de gebruikersnaamprompt weergeeft. Na het invoeren van de gebruikersnaam en het wachtwoord, wordt het programma getty roept het programma op Log in, die het account valideert, navigeert naar de thuismap van de gebruiker en de controle overdraagt ​​aan het initiële opstartprogramma van de sessie, wat meestal het shell-programma van de gebruiker is, waarvan de specifieke variant wordt bepaald door de inhoud van het bestand /etc/wachtwoord voor deze rekening. Bijvoorbeeld:

gebruiker1:x:508:511::/home/gebruiker1:/bin/sh
interbase:x:510:511::/home/interbase:/bin/csh
apb:x:511:513:apb:/home/apb:/bin/bash

Zoals je kunt zien aan de inhoud van het bestand /etc/wachtwoord, voor de gebruiker gebruiker1 shell wordt gelanceerd sch(Bourne-shell), per gebruiker tussenbasis- schelp csh(C shell) en voor de gebruiker apb- schelp bashen(Opnieuw Bourne). Nadat de shell is gestart, wordt een opdrachtprompt op het scherm weergegeven (meestal in de vorm van een dollarteken $ indien de werkzaamheden worden uitgevoerd in het kader van een standaard gebruikersaccount, of lb # als de shell wordt gebruikt onder een bevoorrechte gebruikersaccount ( wortel).

Bij het verlaten van de shell geeft de systeemkernel de besturing terug aan het programma in het, waarmee het aanmeldingsproces opnieuw wordt gestart en de gebruikersnaam op de terminal wordt weergegeven. Het verlaten van de shell kan op twee manieren:

Via de ploeg Uitgang uitgevoerd door de gebruiker

Wanneer het shell-proces een signaal ontvangt doden verzonden door de kernel, bijvoorbeeld wanneer het systeem opnieuw wordt opgestart.

Commandoregelinterpretatie.

    Gebruikersinvoer als reactie op een shell-prompt wordt gewoonlijk aangeduid als opdrachtregel of team. Een Linux-opdracht is een tekenreeks van de opdrachtnaam en argumenten gescheiden door spaties. Argumenten voorzien de opdracht van extra opties die het gedrag ervan bepalen. De meest gebruikte argumenten zijn opties en namen bestanden en mappen. Bijvoorbeeld opdrachtregel

ls -l bestand01 bestand02

Bevat de opdracht ls, de optie -l en de twee bestandsnamen file01 file02 .

Bij gebruik van meerdere opties kunnen deze gecombineerd worden. De varianten van de volgende opdrachten zijn bijvoorbeeld identiek:

Ls-l-d
ls-ld

De commando's die deel uitmaken van de shell worden aangeroepen ingebouwd. Zulke commando's zijn bijvoorbeeld cd, if, case, enz. Uiteraard kunnen ingebouwde commando's verschillen voor verschillende shells. Naast ingebouwde opdrachten is het mogelijk om programmamodules te gebruiken die afzonderlijke uitvoerbare bestanden of bestanden zijn scripts of scenario's- gewone tekstbestanden die achtereenvolgens uitgevoerde regels bevatten met shell-commando's. Sommige scripts (scripts) kunnen worden uitgevoerd door Linux-processen, zoals de taakplanner kroon. Taakplanner is in de regel ontworpen om automatisch geplande systeembeheertaken uit te voeren. Taken kroon zijn commando's of scripts en worden automatisch uitgevoerd, zonder enige menselijke tussenkomst en kunnen worden uitgevoerd in de context van verschillende gebruikersaccounts. In het geval dat de plannertaak de uitvoering van een script inhoudt, is er een probleem bij het kiezen van een shell die moet worden gestart als een onderliggend proces kroon voor het verwerken van opdrachten uit het scriptbestand - de shell kan immers elke shell zijn, en de syntaxis van het script omvat in de regel het gebruik van een specifieke shell waarvoor het is geschreven. Om dit probleem op te lossen, is het in de Linux-familie van besturingssystemen gebruikelijk om in de eerste regel van het script het type shell aan te geven dat nodig is voor de uitvoering ervan, in de vorm:

#!/bin/bash- voor schelp bashen

#!/bin/sh- voor schelp sch

Teken # is een teken van een opmerking en de tekens die erop volgen worden niet geïnterpreteerd als een opdracht. Met deze techniek kunt u expliciet specificeren welke shell moet worden gebruikt om de daaropvolgende inhoud van het bestand te verwerken. Als het script geen item bevat dat expliciet de vereiste shell definieert, dan zullen de instellingen van het account worden gebruikt in de context waarvan het gegeven script wordt uitgevoerd. In dit geval is het mogelijk dat een script dat is geschreven voor een shell, bijvoorbeeld tch zal worden doorgegeven aan de shell voor uitvoering bashen, waardoor het onmogelijk wordt om uit te voeren.

Bij het uitvoeren van opdrachten of scripts, de omgevingsvariabelen(in Engels - omgeving, waarvan de waarden kenmerkend zijn voor de softwareomgeving waarin de opdrachten worden uitgevoerd. Dergelijke variabelen kunnen algemene systeeminstellingen, grafische of opdrachtshell-opties, uitvoerbare bestandspaden, enzovoort bevatten. Waarden voor omgevingsvariabelen worden ingesteld op systeemniveau (voor alle gebruikers) en op het niveau van een bepaalde gebruiker. Om omgevingsvariabelen op systeemniveau in te stellen, wordt de inhoud van de bestanden gebruikt:

/etc/profiel- stelt alleen variabelen in voor shells. Kan alle scripts uitvoeren in shells die compatibel zijn met Bourne-shells.

/etc/bash.bashrc- stelt alleen variabelen in voor interactieve shells. Het voert ook bash-scripts uit.

/etc/omgeving- gebruikt door de PAM-env-module. In dit bestand kunnen alleen paren worden opgegeven. naam=waarde.

Elk van deze bestanden heeft zijn eigen toepassing, dus u moet zorgvuldig degene kiezen die bij uw doeleinden past. Als u bijvoorbeeld een aangepaste map wilt toevoegen ~/bak in een variabele PAD plaats voor alle gebruikers de volgende code in een van de initialisatiebestanden van de systeemomgeving (/etc/profile of /etc/bash.bashrc):

# Als de gebruikers-ID groter is dan of gelijk is aan 1000 en de map ~/bin bestaat en deze

#was niet eerder toegevoegd aan de variabele PATH,

# exporteer ~/bin naar $PATH.

Als [[ $UID -ge 1000 && -d $HOME/bin && -z $(echo $PATH | grep -o $HOME/bin)

Exporteer PATH=$HOME/bin:$(PATH)

Op Linux-besturingssystemen wordt doorgaans een gebruikers-ID van minder dan 1000 of minder dan 500 gebruikt voor serviceaccounts. In dit voorbeeld wordt de omgevingsvariabele ingesteld voor alle lokale systeemgebruikers met een ID van 1000 of hoger.

Als u de omgeving voor een bepaalde gebruiker moet wijzigen, wijzigt u de inhoud van de gebruikersomgeving:

- ~/.bash_profiel, ~/.bash_login enzovoort. - shell-initialisatiebestanden uit de thuismap van de gebruiker.

- ~/.profiel- initialisatiebestand voor gebruikersprofielen. Wordt door veel shells gebruikt om omgevingsvariabelen te definiëren.

~/.pam_omgeving- een aangepast equivalent van het bestand /etc/environment, dat wordt gebruikt door de PAM-env-module.

Om bijvoorbeeld de map ~/bin van de gebruiker toe te voegen aan het zoekpad voor de uitvoerbare bestanden die zijn opgegeven door de variabele PAD bijvoorbeeld in een bestand ~/.profiel zet de lijn:

export PATH="$(PATH):/home/gebruiker/bin"

Om omgevingsvariabelen voor grafische toepassingen in te stellen, wordt de inhoud van de configuratiebestanden van de grafische omgeving van de gebruiker gebruikt. ~/.xinitrc

Het komt veel vaker voor dat omgevingsvariabelen worden ingesteld voor de huidige gebruikerssessie. Bijvoorbeeld om een ​​aangepaste map toe te voegen ~/bak in het uitvoerbare zoekpad:

exporteer PATH=~/bin:$PATH

Nieuwe variabele waarde PAD duurt slechts tot het einde van de huidige gebruikerssessie.

Om de waarde van een variabele te bekijken, kunt u de opdracht gebruiken echo $ variabele, bijv.:

echo $PAD

Momenteel is de meest voorkomende shell, zoals hierboven vermeld, dat wel bashen. Dit komt voornamelijk door het feit dat de schaal bashen is een sch- een compatibele opdrachtshell die handige functies van Korn-shells toevoegt ( ksh) en C-schaal ( csh). schelp bashen kan de meeste shell-scripts uitvoeren zonder enige wijziging sch en probeert zo dicht mogelijk bij de standaard te komen POSIX, wat heeft geleid tot veel verbeteringen, zowel voor de programmering als voor interactief gebruik. In moderne uitvoering bashen er is een bewerkingsmodus voor de opdrachtregel, een onbeperkte grootte van de opdrachtgeschiedenis, hulpmiddelen voor taakbeheer, de mogelijkheid om aliassen te gebruiken, een uitgebreide lijst met ingebouwde opdrachten, shell-functies, enz. Over het algemeen, bashen voldoet het best aan de behoeften van de gemiddelde gebruiker, waardoor het het meest gebruikt werd in de Linux-omgeving.

In de beginfase bashen zonder opdrachtregelopties start de shell in interactieve modus, waarbij een opdrachtprompt op het scherm wordt weergegeven. Een interactieve shell leest doorgaans gegevens van de terminal van de gebruiker en schrijft gegevens naar dezelfde terminal, het standaardinvoerapparaat is het toetsenbord en het standaarduitvoerapparaat is het beeldscherm. De gebruiker voert opdrachten in op het toetsenbord en het resultaat van de uitvoering ervan wordt weergegeven op het display.

  • zelfstudie

Waarom en voor wie is het artikel?

In eerste instantie was dit een herinnering voor studenten die beginnen te werken met Unix-achtige systemen. Met andere woorden, het artikel is bedoeld voor diegenen die geen eerdere ervaring hebben met de Unix-opdrachtregel, maar om de een of andere reden willen of moeten leren hoe ze er effectief mee kunnen werken.

Er zal geen hervertelling van manas (documentatie) zijn, en het artikel annuleert of vervangt het lezen ervan op geen enkele manier. In plaats daarvan zal ik het hebben over de belangrijkste dingen (commando's, trucs en principes) die je vanaf het allereerste begin van het werken in de unix-shell moet begrijpen om effectief en plezierig te werken.

Het artikel gaat over volwaardige unix-achtige omgevingen, met een volledige shell (bij voorkeur zsh of bash) en een redelijk breed scala aan standaardprogramma's.

Wat is schil

Shell (shell, ook wel "command line", ook wel CLI, ook wel "console", ook wel "terminal", ook wel "zwart venster met witte letters" genoemd) is een tekstinterface voor communicatie met het besturingssysteem (nou ja, strikt genomen programma, die zo'n interface biedt, maar nu is dit verschil niet significant).

Over het algemeen ziet het werken door de shell er als volgt uit: de gebruiker (d.w.z. jij) voert een commando in vanaf het toetsenbord, drukt op Enter, het systeem voert het commando uit, schrijft het resultaat van de uitvoering naar het scherm en wacht opnieuw op het volgende commando in te voeren.

Typische schelplook:

De shell is de belangrijkste manier om te communiceren met alle Unix-achtige serversystemen.

Waar worden opdrachtregelsystemen gevonden?

Waar een unix-shell op je kan wachten, populaire opties:
  • macOS (beuk);
  • externe toegang tot de server voor werk of voor een persoonlijk webproject;
  • home-bestandsserver met toegang op afstand;
  • Ubuntu, PC-BSD op laptop/desktop - Unix-achtige systemen zijn tegenwoordig eenvoudig te installeren en te gebruiken.

Welke taken zijn redelijk op te lossen met een shell?

Natuurlijke taken waarvoor de schaal geschikt, nuttig en onmisbaar is:
  • interactief werken in de terminal:
    • compileren, taken uitvoeren via make;
    • vergelijking van tekstbestanden;
    • snelle ad-hoc data-analyse (aantal unieke ips in de log, verdeling van records in uren/minuten, etc.);
    • eenmalige massale acties (veel processen uitschakelen; als u met een versiebeheersysteem werkt, een aantal bestanden ongedaan maken of oplossen);
    • diagnostiek van wat er in het systeem gebeurt (semaforen, vergrendelingen, processen, descriptors, schijfruimte, enz.);
  • scripten:
    • stel scripts in waarvan u niet op andere tolken kunt vertrouwen om ze uit te voeren - niet voor beginners;
    • functies voor het aanpassen van de interactieve shell (de prompt beïnvloeden, de map wijzigen, omgevingsvariabelen instellen) - ook niet helemaal voor beginners;
    • eenmalige scripts zoals het transcoderen van bulkbestanden;
    • makefiles.

Absoluut eerste stappen

Aan de slag: inloggen en uitloggen

Zorg ervoor dat u precies weet hoe u de shell moet starten en hoe u deze moet verlaten.

Als u zich op een computer bevindt waarop Ubuntu is geïnstalleerd, moet u het Terminal-programma starten. Aan het einde van het werk kunt u eenvoudig het raam sluiten.

Start op MacOS ook Terminal.

Om toegang te krijgen tot een externe server, gebruikt u ssh (als u MacOS, Ubuntu of een ander Unix-achtig systeem lokaal hebt) of putty (als u Windows hebt).

Wie ben ik, waar ben ik?

Voer de volgende opdrachten uit:
  • hostnaam - geeft de naam weer van de machine (server) waarop u zich momenteel bevindt;
  • whoami - toont uw login (uw naam in het systeem);
  • tree -d / |less - pseudografische afbeelding van de mappenboom op de machine; stoppen met scrollen - q ;
  • pwd - geeft de map weer waarin u zich momenteel bevindt; op de opdrachtregel kun je niet "zomaar" zijn, je bevindt je noodzakelijkerwijs in een map (=huidige map, werkmap). Waarschijnlijk wordt de huidige werkmap weergegeven in uw prompt (prompt).
  • ls - lijst met bestanden in de huidige map; ls /home - lijst met bestanden in de opgegeven map;

Opdrachtgeschiedenis (geschiedenis)

Een belangrijke eigenschap van een volwaardige opdrachtregel is de geschiedenis van opdrachten.

Voer een paar opdrachten uit: hostnaam, ls, pwd, whoami. Druk nu op de omhoog-toets. Het vorige commando verscheen in de invoerregel. De toetsen omhoog en omlaag kunnen worden gebruikt om vooruit en achteruit door de geschiedenis te bladeren. Wanneer u naar hostnaam scrolt, drukt u op Enter - de opdracht wordt opnieuw uitgevoerd.

Commando's uit de historie kunnen niet alleen opnieuw worden uitgevoerd, maar ook worden bewerkt. Blader door de geschiedenis naar het ls-commando, voeg de -l-toets eraan toe (het bleek ls -l , er is een spatie voor de min, maar niet erna). Druk op Enter - de gewijzigde opdracht wordt uitgevoerd.

Door de geschiedenis bladeren, opdrachten bewerken en opnieuw uitvoeren zijn de meest typische acties bij het werken in de opdrachtregel, wen er maar aan.

kopiëren plakken

De opdrachtregel is erg tekstgericht: opdrachten zijn tekst, de invoergegevens voor de meeste standaardprogramma's zijn tekst, het resultaat van het werk is meestal ook tekst.

Het leuke van tekst is dat het kan worden gekopieerd en geplakt, en dit geldt ook voor de opdrachtregel.

Probeer datum +"%y-%m-%d, %A" uit te voeren
Heb je het helemaal met de hand ingevoerd of overgenomen uit het artikel? Zorg ervoor dat je het kunt kopiëren, in de terminal kunt plakken en uitvoeren.

Nadat u hebt geleerd hoe u man " moet gebruiken, moet u ervoor zorgen dat u de voorbeeldopdrachten uit de help kunt kopiëren en uitvoeren. Om dit te controleren, kijkt u in de help voor het datumprogramma voor de sectie VOORBEELDEN, kopieert en voert u het eerste gegeven voorbeeld uit (alleen in geval: het dollarteken maakt geen deel uit van de opdracht, dit is een voorwaardelijke afbeelding van de invoerprompt).

Hoe u precies tekst van de terminal kopieert en in de terminal plakt, hangt af van uw systeem en de bijbehorende instellingen, dus helaas zal het niet werken om een ​​universele instructie te geven. Probeer dit op Ubuntu: kopiëren is slechts muisselectie, plakken is middelste muisknop. Als het niet werkt, of als je een ander systeem hebt, kijk dan op internet of vraag meer ervaren vrienden.

Toetsen en opties

Tijdens het onderzoeken van de commandogeschiedenis ben je al tegengekomen dat het ls-commando ten minste twee opties heeft. Als je het zo noemt, drukt het een eenvoudige lijst af:

[e-mail beveiligd]: ~/shell-survival-quide> ls Makefile shell-first-steps.md shell-first-steps.pdf shell-survival-quide.md shell-survival-quide.pdf
Als u de schakeloptie -l toevoegt, wordt voor elk bestand gedetailleerde informatie weergegeven:

[e-mail beveiligd]: ~/shell-survival-quide> ls -l totaal 332 -rw-rw-r-- 1 akira akira 198 feb 13 11:48 Makefile -rw-rw-r-- 1 akira akira 15107 feb 14 22:26 shell -first-steps.md -rw-rw-r-- 1 akira akira 146226 13 februari 11:49 shell-first-steps.pdf -rw-rw-r-- 1 akira akira 16626 13 februari 11:45 shell-survival -quide.md -rw-rw-r-- 1 akira akira 146203 13 februari 11:35 shell-survival-quide.pdf
Dit is een zeer typische situatie: als speciale modifiers (schakelaars, opties, parameters) worden toegevoegd aan de opdrachtoproep, verandert het gedrag van de opdracht. Vergelijk: tree / en tree -d / , hostname en hostname -f .

Bovendien kunnen opdrachten bestandsnamen, mappen of alleen tekenreeksen als parameters aannemen. Poging:

ls -ld /home ls -l /home grep root /etc/passwd

Mens

man - Help over de opdrachten en programma's die beschikbaar zijn op uw machine, evenals systeemoproepen en de C-standaardbibliotheek.

Probeer: man grep, man atoi, man chdir, man man.

Vooruit en achteruit scrollen doe je met de “up”, “down”, “PageUp”, “PageDown” knoppen, het verlaten van de helpweergave doe je met de q knop. Zoeken naar specifieke tekst in een helpartikel: druk op / (schuine streep naar voren), typ de zoektekst en druk op Enter. Ga naar volgende voorkomens - n-toets.

Alle helpartikelen zijn onderverdeeld in categorieën. Het belangrijkste:

  • 1 - uitvoerbare programma's en shell-commando's (wc , ls , pwd, etc.);
  • 2 - systeemoproepen (fork, dup2 enz.)
  • 3 - bibliotheekfuncties (printf, scanf, cos, exec).
Het is noodzakelijk om aan te geven uit welke categorie de hulp moet worden getoond in geval van samenvallen van namen. Man 3 printf beschrijft bijvoorbeeld een functie uit de C-standaardbibliotheek en man 1 printf beschrijft een consoleprogramma met dezelfde naam.

U kunt een lijst bekijken van alle helpartikelen die beschikbaar zijn op de machine met de opdracht man -k. (de stip maakt ook deel uit van het team).

minder

Wanneer een zeer lange tekst (de inhoud van een bestand, een lange man, enz.) in een klein terminalvenster moet worden bekeken, worden speciale "pager" -programma's gebruikt (van het woord pagina / pagina, dat wil zeggen paging). De meest populaire scroller is less , en dat zorgt ervoor dat je kunt scrollen als je aan het lezen bent.

Probeer en vergelijk gedrag:

cat /etc/bash.bashrc cat /etc/bash.bashrc |minder

U kunt het bestand onmiddellijk naar de scroller overbrengen in de parameters:

Minder /etc/bash.bashrc

Blader omhoog en omlaag - knoppen "omhoog", "omlaag", "PageUp", "PageDown", exit - knop q. Zoeken naar specifieke tekst: druk op / (schuine streep naar voren), voer de zoektekst in en druk op Enter. Ga naar volgende voorkomens - n-toets. (Herken je de instructie over de mens? Geen wonder, er wordt ook minder gebruikt om hulp te tonen.)

De rechten

Aan elk bestand of elke map is een set "rechten" gekoppeld: het recht om het bestand te lezen, het recht om naar het bestand te schrijven, het recht om het bestand uit te voeren. Alle gebruikers zijn onderverdeeld in drie categorieën: bestandseigenaar, groep bestandseigenaar, alle andere gebruikers.

U kunt bestandsrechten bekijken met ls -l . Bijvoorbeeld:

> ls -l Makefile -rw-r--r-- 1 akira studenten 198 feb 13 11:48 Makefile
Deze uitvoer betekent dat de eigenaar (akira) het bestand kan lezen en schrijven, de groep (studenten) kan alleen lezen en alle anderen in de gebruiker kunnen ook alleen lezen.

Als u tijdens het werken een bericht krijgt dat toestemming is geweigerd, betekent dit dat u niet genoeg machtigingen heeft voor het object waarmee u wilde werken.

Lees meer in man chmod.

STDIN, STDOUT, pijpleidingen (pijpen)

Aan elk uitvoerend programma zijn 3 standaard gegevensstromen gekoppeld: invoergegevensstroom STDIN , uitvoergegevensstroom STDOUT , foutstroom STDERR .

Voer het wc-programma uit, typ Goede dag vandaag, druk op Enter, typ goede dag, druk op Enter, druk op Ctrl+d. Het wc-programma toont statistieken over het aantal letters, woorden en regels in uw tekst en sluit af:

> wc goede dag vandaag goede dag 2 5 24
In dit geval gaf u het programma STDIN een tekst van twee regels en ontving u drie cijfers in STDOUT.

Voer nu het commando head -n3 /etc/passwd uit, het zou er ongeveer zo uit moeten zien:

> head -n3 /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x: 2:2:bin:/bin:/usr/sbin/nologin
In dit geval las het hoofdprogramma niets van STDIN, maar schreef het drie regels naar STDOUT.

Zie het zo: een programma is een pijp waar STDIN in stroomt en STDOUT uit.

De belangrijkste eigenschap van de Unix-commandoregel is dat "pipe"-programma's onderling gekoppeld kunnen worden: de output (STDOUT) van het ene programma kan als input (STDIN) worden doorgegeven aan een ander programma.

Zo'n constructie van verbonden programma's wordt in het Engels pipe (pipe) genoemd, in het Russisch - transportband of pipe.

Het combineren van programma's tot een pijplijn gebeurt met het symbool | (verticale balk)

Voer het commando head -n3 /etc/passwd |wc uit, je krijgt zoiets als dit:

> head -n3 /etc/passwd |wc 3 3 117
Dit is wat er gebeurde: het hoofdprogramma voerde drie regels tekst uit naar STDOUT, die onmiddellijk in de invoer van het wc-programma terechtkwamen, dat op zijn beurt het aantal tekens, woorden en regels in de ontvangen tekst telde.

U kunt zoveel programma's combineren als u wilt in een pijplijn. U kunt bijvoorbeeld een ander wc-programma toevoegen aan de vorige pijplijn, die zal tellen hoeveel woorden en letters er in de uitvoer van de eerste wc zaten:

> head -n3 /etc/passwd |wc |wc 1 3 24

Het compileren van pijplijnen (pipes) is heel gebruikelijk bij het werken op de opdrachtregel. Voor een voorbeeld van hoe dit in de praktijk wordt gedaan, zie de sectie Een éénlijnige pijplijn samenstellen.

I/O-omleiding

De uitvoer (STDOUT) van een programma kan niet alleen naar een ander programma worden doorgesluisd, maar kan eenvoudig naar een bestand worden geschreven. Deze omleiding gebeurt met > (groter dan teken):

Datum > /tmp/vandaag.txt
Als resultaat van het uitvoeren van deze opdracht zal het bestand /tmp/today.txt op de schijf verschijnen. Bekijk de inhoud met cat /tmp/today.txt

Als er al een bestand met dezelfde naam bestond, wordt de oude inhoud vernietigd. Als het bestand nog niet bestond, wordt het aangemaakt. De map waarin het bestand wordt gemaakt, moet bestaan ​​voordat de opdracht wordt uitgevoerd.

Als u het bestand niet wilt overschrijven, maar uitvoer aan het einde ervan wilt toevoegen, gebruikt u >> :

Datum >> /tmp/vandaag.txt
Controleer wat er nu in het bestand staat.

Bovendien kunt u elk bestand in plaats van STDIN doorgeven aan het programma. Poging:

wc

Wat te doen als iets niet duidelijk is

Als je systeemgedrag tegenkomt dat je niet begrijpt, of een bepaald resultaat wilt bereiken, maar niet weet hoe, raad ik je aan om in de volgende volgorde te werk te gaan (dit geldt trouwens niet alleen voor shells):
  • formuleer de vraag of taak zo duidelijk mogelijk - er is niets moeilijker dan het oplossen van "Ik weet niet wat";
  • onthoud of u hetzelfde of een soortgelijk probleem al bent tegengekomen - in dit geval is het de moeite waard om de oplossing te proberen die de vorige keer werkte;
  • lees de juiste man-s (als u begrijpt welke man-s in uw geval geschikt zijn) - u kunt geschikte voorbeelden vinden van het gebruik van commando's, noodzakelijke opties of links naar andere commando's;
  • denk er eens over na: is het mogelijk om de taak een beetje te veranderen? - misschien krijg je door de voorwaarden iets te veranderen een probleem waarvan je al weet hoe je het moet oplossen;
  • stel uw goed gedefinieerde vraag in een zoekmachine - misschien is het antwoord te vinden op Stack Overflow of andere sites;
Als niets van het bovenstaande heeft geholpen, vraag dan advies aan een leraar, een ervaren collega of vriend. En wees niet bang om "domme" vragen te stellen - het is geen schande om het niet te weten, het is een schande om het niet te vragen.

Als je een moeilijk probleem hebt opgelost (in je eentje, via internet of andere mensen), schrijf dan je oplossing op voor het geval jij of je kameraden weer hetzelfde probleem hebben. U kunt opnemen in een eenvoudig tekstbestand, in Evernote, publiceren op sociale netwerken.

Werkwijzen

Knippen en plakken- van man-s, van artikelen op StackOverflow, enz. De opdrachtregel bestaat uit tekst, gebruik dit: kopieer en gebruik opdrachtvoorbeelden, schrijf succesvolle vondsten op voor geheugen, publiceer ze op Twitter en blogs.

Haal de vorige opdracht uit de geschiedenis, voeg nog een opdracht toe aan de pijplijn, voer uit, herhaal.Cm. Zie ook het gedeelte "Een pijpleiding met één regel samenstellen".

Basiscommando's

  • map wijzigen: cd ;
  • de inhoud van bestanden bekijken: kat, minder, kop, staart;
  • bestandsmanipulatie: cp , mv , rm ;
  • directorylijst: ls , ls -l , ls -lS ;
  • directorystructuur: tree , tree -d (u kunt een directory doorgeven als parameter);
  • bestand zoeken: vind . -naam ... ;

Analyse

  • wc , wc -l ;
  • sorteer -k - sorteer op het opgegeven veld;
  • sorteer -n - numeriek sorteren;
  • diff - vergelijk bestanden;
  • grep , grep -v , grep -w , grep "\ ", grep -E - zoek naar tekst;
  • uniq , uniq -c - unieke strings;
  • awk - in de awk "(print $1)" variant, om alleen het eerste veld van elke regel over te laten, kan $1 veranderd worden in $2 , $3 , etc.;

Systeem diagnostiek

  • ps axuww - informatie over processen (lopende programma's) die op de machine draaien;
  • top - interactieve weergave van de meest resource-intensieve processen;
  • df - gebruikte en vrije schijfruimte;
  • du - totale grootte van bestanden in de map (recursief met submappen);
  • strace , ktrace - welke systeemaanroepen het proces aan het maken is;
  • lsof - welke bestanden het proces gebruikt;
  • netstat -na , netstat -nap - welke poorten en sockets zijn open op het systeem.

Mogelijk hebt u sommige programma's niet, deze moeten extra worden geïnstalleerd. Bovendien zijn sommige opties van deze programma's alleen beschikbaar voor bevoorrechte gebruikers (root "y").

Bulk- en semi-automatische uitvoering

Sla deze sectie in eerste instantie over, je hebt deze commando's en constructies nodig als je aan eenvoudige shell-scripting begint.
  • test - voorwaarden controleren;
  • while read-cycle through lines STDIN;
  • xargs - vervanging van strings van STDIN in de parameters van het gespecificeerde programma;
  • seq - generatie van reeksen natuurlijke getallen;
  • () - combineer de output van verschillende commando's;
  • ; - doe de een na de ander;
  • && - uitvoeren als de eerste opdracht succesvol is voltooid;
  • || - uitvoeren als het eerste commando mislukt;
  • tee - dupliceer programma-uitvoer naar STDOUT en naar een bestand op schijf.

Diversen

  • datum - huidige datum;
  • curl - downloadt het document op de gespecificeerde url en schrijft het resultaat naar STDOUT;
  • touch - wijzigingsdatum bestand bijwerken;
  • doden - stuur een signaal naar het proces;
  • waar - doet niets, retourneert waar, handig voor het organiseren van eeuwige lussen;
  • sudo - voer een commando uit als root "a.

Samenstellen van een one-liner pijplijn

Laten we eens kijken naar een voorbeeld van een echte taak: we willen alle taak-6-serverprocessen beëindigen die namens de huidige gebruiker worden uitgevoerd.

Stap 1.
Begrijp welk programma ongeveer de benodigde gegevens produceert, ook al is het niet in pure vorm. Voor onze taak is het de moeite waard om een ​​lijst te krijgen van alle processen in het systeem: ps axuww. Rennen.

Stap 2
Kijk met je ogen naar de ontvangen gegevens, bedenk een filter dat een deel van de onnodige gegevens weggooit. Vaak is dit grep of grep -v . Gebruik de "Omhoog" -toets om het vorige commando uit de geschiedenis te halen, er een verzonnen filter aan toe te wijzen en het uit te voeren.

Ps axuww |grep `whoami`
- alleen processen van de huidige gebruiker.

Stap 3
Herhaal stap 2 totdat u de gewenste schone gegevens krijgt.

"
- alle processen met de gewenste naam (plus misschien overbodige zoals vim task-6-server.c, etc.),

Ps axuww |grep `whoami` | grep "\ " | grep -v vim ps axuww |grep `whoami` | grep "\ " | grep -v vim | grep -v minder
- alleen processen met de gewenste naam

Ps axuww |grep `whoami` | grep "\ " | grep -v vim |grep -v less |awk "(print $2)"

Pids van de vereiste processen, stap 3 voltooid

Stap 4
Pas een geschikte laatste handler toe. Met behulp van de "Omhoog" -toets halen we de vorige opdracht uit de geschiedenis en voegen we verwerking toe die de oplossing van het probleem zal voltooien:

  • |wc -l om het aantal processen te tellen;
  • >pids om pids naar een bestand te schrijven;
  • |xargs kill -9 kill-processen.

Taken voor opleiding

Wil je nieuwe vaardigheden oefenen? Probeer de volgende taken:
  • krijg een lijst van alle bestanden en mappen in je thuismap;
  • krijg een lijst van alle man-artikelen uit categorie 2 (systeemoproepen);
  • tel hoe vaak het woord grep voorkomt in de grep man-pagina;
  • tellen hoeveel processen er momenteel als root draaien;
  • vinden welk commando voorkomt in het maximale aantal hulpcategorieën (man);
  • tel hoe vaak het woord var voorkomt op de ya.ru-pagina.
Hint: je hebt find , grep -o , awk "(print $1)" , reguliere expressies in grep , curl -s nodig.

Wat ga je hierna studeren?

Als je de opdrachtregel leuk begint te vinden, stop dan niet, blijf je vaardigheden verbeteren.

Hier zijn enkele programma's die zeker van pas zullen komen als u op de opdrachtregel woont:

  • vinden met complexe opties
  • ter zake
  • bevind zich
  • telnet
  • netkat
  • tcpdump
  • rsync
  • scherm
  • zgrep, zless
  • zien
  • crontab -e
  • Verzend mail
Het is ook de moeite waard om na verloop van tijd een scripttaal te leren, zoals perl of python, of zelfs beide.

Wie heeft het nodig?

Is het de moeite waard om vandaag de opdrachtregel en shell-scripting te leren? Zeker de moeite waard. Ik zal slechts enkele voorbeelden geven van de eisen die Facebook stelt aan kandidaten die bij FB willen werken.

De commandotaal shell (in vertaling - shell, shell) is eigenlijk een programmeertaal van een heel hoog niveau. In deze taal bestuurt de gebruiker de computer. Meestal begin je na het inloggen met een shell te communiceren. Een teken dat de shell (shell) klaar is om commando's te ontvangen, is de prompter die door hem naar het scherm wordt gestuurd. In het eenvoudigste geval is dit één dollar ("$"). Shell is geen noodzakelijke en enige commandotaal (hoewel het wel de taal is die gestandaardiseerd is binnen POSIX - de standaard voor mobiele systemen). De cshell-taal is bijvoorbeeld behoorlijk populair, er zijn ook kshell, bashell en andere. Bovendien kan elke gebruiker zijn eigen commandotaal creëren. Het kan tegelijkertijd werken met verschillende commandotalen op één instantie van het besturingssysteem. shell is een van de vele UNIX-commando's. Dat wil zeggen, de "shell"-commandoset bevat het "sh"-commando - waarbij de "shell"-interpreter wordt aangeroepen. De eerste "shell" wordt automatisch aangeroepen wanneer u zich aanmeldt en geeft de prompter weer. Daarna kun je alle commando's aanroepen voor uitvoering, ook weer de "shell" zelf, die een nieuwe shell voor je zal creëren binnen de oude. Dus als u bijvoorbeeld het bestand "file_1" in de editor voorbereidt:

Echo Hallo!

dan wordt het een gewoon tekstbestand met het commando "echo", dat, wanneer het wordt uitgevoerd, alles wat er rechts van staat op het scherm zal weergeven. U kunt het bestand "file_1" uitvoerbaar maken met het commando "chmod 755 file_1". Maar het kan worden gedaan door expliciet de opdracht "sh" ("shell") aan te roepen:

Sh-bestand_1

Sch< file1

Het bestand kan ook worden uitgevoerd in de huidige "shell"-instantie. Hiervoor is er een specifiek commando "." (punt), d.w.z.

Bestand_1

Aangezien UNIX een systeem voor meerdere gebruikers is, kunt u zelfs op een personal computer parallel werken, bijvoorbeeld op 12 schermen (verplaats van scherm naar scherm ALT / functietoets), met een nieuwe (of dezelfde) gebruiker op elk scherm met zijn commandoschaal. Je kunt ook een groot aantal vensters openen in de X-Window grafische modus, en elk venster kan zijn eigen gebruiker hebben met zijn eigen commando-shell... Het kernelement van de shell-taal is het commando.

Commandostructuren:

Shell-commando's hebben meestal het volgende formaat:

<имя команды> <флаги> <аргумент(ы)>

Bijvoorbeeld:

ls -ls /usr/bin

Waar ls de naam is van het commando voor het uitgeven van de inhoud van de map, -ls zijn vlaggen ("-" is een teken van vlaggen, l is een lang formaat, s is de grootte van bestanden in blokken), /usr/bin is de directory waarvoor het commando wordt uitgevoerd. Dit commando zal de inhoud van de /usr/bin directory in een lang formaat weergeven, en tegelijkertijd informatie toevoegen over de grootte van elk bestand in blokken. diversiteit in de presentatie van argumenten .Het aantal commando's met exotische formaten omvat dergelijke "lopende" commando's als cc - bel de C-compiler, tar - werk met archieven, dd - kopieer een bestand met transformatie, vind - zoek naar bestanden en een aantal andere In de regel , wordt het eerste woord van de shell behandeld als een commando, dus op de commandoregel

het eerste woord zal door de shell worden geïnterpreteerd als een (aaneenschakelings)commando, dat een bestand met de naam "cat" (het tweede woord) zal weergeven in de huidige map. Opdrachtomleiding Standaardinvoer (invoer) - "stdin" in UNIX OS wordt uitgevoerd vanaf het terminaltoetsenbord en standaarduitvoer (uitvoer) - "stdout" wordt naar het terminalscherm geleid. Er is ook een standaard diagnostisch berichtbestand - "stderr", dat later zal worden besproken. Het commando dat kan werken op standaard invoer en uitvoer wordt FILTER genoemd. De gebruiker heeft handige middelen om invoer en uitvoer om te leiden naar andere bestanden (apparaten). De symbolen ">" en ">>" duiden uitvoeromleiding aan. ls >file_1 De opdracht "ls" geeft een lijst van de bestanden in de huidige map en plaatst deze in bestand "file_1" (in plaats van deze op het scherm weer te geven). Als het bestand "file_1" al eerder bestond, wordt het overschreven door het nieuwe.

Pwd >>bestand_1

het pwd-commando vormt de volledig gekwalificeerde naam van de huidige map en plaatst deze aan het einde van het bestand "file_1", d.w.z. ">>" wordt toegevoegd aan het bestand als het niet leeg is. Symbolen "<" и "<<" обозначают перенаправление ввода.

Wc-l

zal het aantal regels in het bestand file_1 tellen en weergeven.

Ed-bestand_2<

maakt het bestand "file_2" met behulp van de editor, rechtstreeks vanuit de terminal. Het einde van de invoer wordt bepaald door het teken rechts "<<" (т. е. "!"). То есть ввод будет закончен, когда первым в очередной строке будет "!". Можно сочетать перенаправления. Так

Wc-l bestand_4

Wc -l >bestand_4

worden op dezelfde manier uitgevoerd: het aantal regels van het bestand "file_3" wordt geteld en het resultaat wordt in het bestand "file_4" geplaatst. Een faciliteit die de standaarduitvoer van een commando combineert met de standaardinvoer van een ander wordt een PIPELINE genoemd en wordt aangeduid met de verticale balk "|".

Ls | wc -l

de lijst met bestanden in de huidige map wordt doorgegeven aan de invoer van het "wc"-commando, dat het aantal regels in de map weergeeft. Een pijplijn kan ook meer dan twee commando's combineren, wanneer ze allemaal, mogelijk behalve de eerste en de laatste, filters zijn:

Kattenbestand_1 | grep -hresult | sorteren | kat -b > bestand_2

Deze pijplijn uit het bestand "file_1" ("cat") selecteert alle regels die het woord "result" ("grep") bevatten, sorteert ("sort") de resulterende regels en nummert ("cat -b") en voer het resultaat uit naar bestand "file_2". Omdat UNIX-apparaten worden vertegenwoordigd door speciale bestanden, kunnen ze worden gebruikt in omleidingen. De speciale bestanden bevinden zich in de map "/dev". Bijvoorbeeld "lp" - afdrukken; "console" - console; "ttyi" - i-de aansluiting; "null" - dummy (leeg) bestand (apparaat). Dan, bijvoorbeeld,

Ls > /dev/lp

drukt de inhoud van de huidige map af, en file_1< /dev/null обнулит файл "file_1".

sorteer bestand_1 | tee /dev/lp | staart -20

In dit geval wordt het bestand "file_1" gesorteerd en afgedrukt en worden de laatste 20 regels ook op het scherm weergegeven. Laten we teruggaan om de omleiding af te sluiten. Standaard bestanden zijn genummerd:

0 - stdin, 1 - stdout 2 - stderr. Als u geen foutmelding op het scherm wilt hebben, kunt u deze omleiden van het scherm naar het bestand dat u hebt opgegeven (of het helemaal "gooien" door het om te leiden naar het "lege apparaat"-bestand - /dev/null). Bijvoorbeeld bij het uitvoeren van de opdracht

Kat bestand_1 bestand_2

die de inhoud van de bestanden "file_1" en "file_2" opeenvolgend op het scherm zou moeten weergeven, geeft u bijvoorbeeld het volgende

111111 222222 cat: f2: niet zo'n bestand of map

waarbij 111111 222222 de inhoud is van bestand "file_1" en bestand "file_2" ontbreekt, zoals gerapporteerd door de opdracht "cat" in het standaard diagnostische bestand, evenals de standaarduitvoer die wordt weergegeven door het scherm. Als u zo'n bericht niet op het scherm wilt, kunt u het omleiden naar het bestand dat u hebt opgegeven:

Cat file_1 file_2 2>f-err

foutmeldingen worden verzonden (zoals aangegeven door de "2>"-omleiding) naar het "f-err"-bestand. Trouwens, je kunt alle informatie naar één "ff" -bestand sturen, in dit geval met behulp van de constructie

Cat bestand_1 bestand_2 >>ff 2>ff

U kunt niet alleen specificeren welke van de standaardbestanden u wilt omleiden, maar ook naar welk standaardbestand u wilt omleiden.

Cat bestand_1 bestand_2 2>>ff 1>&2

Hier wordt eerst "stderr" omgeleid (in append-modus) naar het bestand "ff", en vervolgens wordt de standaarduitvoer omgeleid naar "stderr", wat nu het bestand "ff" is. Dat wil zeggen, het resultaat zal vergelijkbaar zijn met het vorige. Constructie "1>&2" - betekent dat naast het nummer van het standaardbestand waarnaar moet worden omgeleid, het nodig is om "&" ervoor te plaatsen; de hele structuur is geschreven zonder spaties.<- закрывает стандартный ввод. >- sluit standaard uitvoer. opdracht bestanden. Om een ​​tekstbestand als commando te gebruiken zijn er verschillende mogelijkheden. Laat de editor een bestand met de naam "cmd" maken met daarin één regel van de volgende vorm:

datum; pwd; ls

Je kunt de shell aanroepen als een commando, aangeduid met "sh", en er een "cmd"-bestand aan doorgeven, ofwel als een argument of als een omgeleide invoer, d.w.z.

$sh cmd

$ sh

Al deze opdrachten printen de datum, vervolgens de naam van de huidige map en vervolgens de inhoud van de map. Een interessantere en handigere optie om met een batchbestand te werken, is om er een uitvoerbaar bestand van te maken, d.w.z. maak er gewoon een commando van, dat wordt bereikt door de beveiligingscode te wijzigen. Om dit te doen, moet u de uitvoering van dit bestand toestaan. Bijvoorbeeld,

Chmod 711cmd

maakt de beveiligingscode "rwx__x__x". Dan maar een simpel telefoontje

zal ertoe leiden dat dezelfde drie commando's worden uitgevoerd. Het resultaat is hetzelfde als het bestand met de inhoud

datum; pwd; ls

wordt weergegeven als: datum pwd ls omdat een regeleinde ook een scheidingsteken is in een reeks opdrachten. Uitvoerbare bestanden kunnen dus niet alleen bestanden zijn die zijn verkregen als resultaat van compilatie en assemblage, maar ook bestanden die zijn geschreven in de shell-taal. Ze worden uitgevoerd in interpretatiemodus met behulp van een shell-interpreter.

Batchbestanden debuggen

SHELL gebruikt twee mechanismen voor het debuggen van batchbestanden. De eerste: set -v drukt de regels van het batchbestand af terwijl ze worden gelezen. Deze modus wordt gebruikt bij het zoeken naar syntaxisfouten. Om het te gebruiken, hoeft u het batchbestand niet te wijzigen, bijvoorbeeld: sh -v proc... waarbij proc de naam is van het batchbestand. De schakeloptie -v kan worden gebruikt in combinatie met de schakeloptie -n, die de uitvoering van de volgende opdrachten verhindert (de opdracht set -n blokkeert de terminal totdat het EOF-teken wordt ingevoerd). De opdracht set -x drukt de opdrachten af ​​terwijl ze worden uitgevoerd, waarbij de programmaregels naar de terminal worden afgedrukt en hun waarden worden vervangen door de variabelen. Om de schakelaars -x en -v uit te schakelen, kunt u de opdracht set gebruiken - en om in te stellen - de juiste waarde toewijzen aan de macrovariabele. SHELL-OMGEVING (VARIABELEN EN PARAMETERS) U kunt batchbestanden schrijven in de shell-taal en ze uitvoerbaar maken met het "chmod"-commando. Daarna verschillen ze niet van andere UNIX OS-commando's.

Shell-variabelen

De naam van een shell-variabele is een letter-beginreeks van letters, cijfers en onderstrepingstekens. De waarde van een shell-variabele is een tekenreeks. Het feit dat er maar twee datatypes in de shell zitten: een tekenreeks en een tekstbestand, maakt het enerzijds gemakkelijk om eindgebruikers die nog nooit eerder hebben geprogrammeerd gemakkelijk bij het programmeren te betrekken en zorgt anderzijds voor enige intern protest onder veel programmeurs die gewend zijn aan meer variatie en grotere flexibiliteit van taalmiddelen. Het is echter interessant om te zien hoe eersteklas programmeurs, die de "spelregels" van de shell onder de knie hebben, er vele malen sneller programma's in schrijven dan in C, maar wat vooral interessant is, in sommige gevallen werken deze programma's zelfs sneller dan die geïmplementeerd in C. De naam van de variabele is vergelijkbaar met de traditionele notie van een identifier, d.w.z. de naam kan een reeks letters, cijfers en onderstrepingstekens zijn, beginnend met een letter of een onderstrepingsteken. De toewijzingsoperator "=" kan worden gebruikt om waarden aan variabelen toe te wijzen.

Var_1=13 - "13" is geen getal, maar een reeks van twee cijfers. var_2="UNIX OS" - Dubbele aanhalingstekens (" ") zijn hier nodig omdat er een spatie in de tekenreeks staat.

Er zijn andere manieren om waarden toe te wijzen aan shell-variabelen. Dus bijvoorbeeld de ingang

DAT=`datum`

zorgt ervoor dat het "date"-commando eerst wordt uitgevoerd (de aanhalingstekens achter geven aan dat het bijgevoegde commando eerst moet worden uitgevoerd), en het resultaat van de uitvoering wordt, in plaats van naar de standaarduitvoer te worden afgedrukt, toegewezen als de waarde van een variabele, in dit geval "DAT". U kunt ook een waarde toekennen aan een variabele met behulp van het "read"-commando, waarmee de waarde van een variabele kan worden ontvangen van het (toetsenbord)display in dialoogmodus. Gewoonlijk wordt het "lees"-commando in een batchbestand voorafgegaan door het "echo"-commando, waarmee u een soort bericht vooraf op het scherm kunt afdrukken. Bijvoorbeeld:

echo -n "Voer een getal van drie cijfers in:" lees x

Bij het uitvoeren van dit fragment van een batchbestand, na het weergeven van het bericht

Voer een driecijferig nummer in:

de tolk stopt en wacht tot er een waarde wordt ingevoerd vanaf het toetsenbord. Als u bijvoorbeeld "753" invoert, wordt dit de waarde van de variabele "x". Eén "lees" -opdracht kan waarden voor meerdere variabelen tegelijk lezen (toewijzen). Als er meer variabelen in "lezen" zijn dan ingevoerd (gescheiden door spaties), krijgen de resterende variabelen een lege string toegewezen. Als er meer doorgegeven waarden zijn dan variabelen in de opdracht "lezen", worden de extra waarden genegeerd. Wanneer u een shell-variabele benadert, moet u de naam laten voorafgaan door het "$"-symbool. Dus de commando's echo $var_2 echo var_2 zullen op het scherm worden weergegeven

UNIX OS var_2 Ontsnappen

Laten we de ontsnappingstechnieken die in de schaal worden gebruikt eens nader bekijken. De escape-tekens zijn dubbele aanhalingstekens (" "), enkele aanhalingstekens (" ") en backslashes (\). Hun werking wordt duidelijk uit de voorbeelden: U kunt meerdere opdrachten op één regel schrijven.

X=22 y=33 z=$x A="$x" B="$x" C=\$x D="$x + $y + $z" E="$x + $y + $z " F=$x\ +\ $y\ +\ $z

(de opdracht G=$x+$y zou vanwege spaties niet zijn uitgevoerd) Dan

echo A = $A B = $B C = $C echo D = $D E = $E F = $F eval echo-evaluatie A = $A eval echo-evaluatie B = $B eval echo-evaluatie C = $C

Weergegeven op het scherm

A = 22 B = $x C = $x D = 22 + 33 + 22 E = $x + $y + $z F = 22 + 33 + 22 geëvalueerd A = 22 geëvalueerd B = 22 geëvalueerd C = 22

Laten we nog enkele voorbeelden geven met betrekking tot het ontsnappen van regeleinden. Geef de variabele "string" de waarde van "array" 2x3: abc def Merk op dat om te voorkomen dat er extra spaties worden toegewezen, de tweede regel van de array begint vanaf de eerste positie van de volgende regel: string="abc def" zijn drie manieren om de variabele in het commando "echo" te schrijven echo $string echo "$string" echo "$string" geeft respectievelijk drie verschillende resultaten: abc def $string abc def en de volgorde van commando's echo "str_1 str_2" > file_1 echo "str_1 str_2" > file_2 cat file_1 file_2 zal opeenvolgende identieke bestanden file_1 en file_2 geven: str_1 str_2 str_1 str_2 Merk ook op dat de backslash (\) niet alleen het karakter dat erop volgt escaped, waardoor speciale karakters eenvoudig kunnen worden gebruikt als tekens die zichzelf vertegenwoordigen (het kan zichzelf escapen - \\), maar in een batchbestand kunt u met een backslash regels combineren tot één (escape aan het einde van de regel). Bijvoorbeeld het eerder gegeven voorbeeld van de opdrachtregel:

Kattenbestand_1 | grep -hresult | sorteren | kat -b > bestand_2

kan in een batchbestand worden geschreven, bijvoorbeeld als

Kattenbestand_1 | grep -h \resultaat | sorteren | kat -b > bestand_2

Trouwens, het pijplijnsymbool biedt ook het effect van voortzetting van de opdrachtregel. In dit geval kan dit een mooier resultaat geven, bijvoorbeeld:

Kattenbestand_1 | grep -hresult | sorteren | kat -b > bestand_2

Manipulaties met shell-variabelen Hoewel shell-variabelen over het algemeen worden behandeld als strings, d.w.z. "35" is geen getal, maar een string van twee tekens "3" en "5", kunnen ze in sommige gevallen anders worden geïnterpreteerd, bijvoorbeeld als gehele getallen. Het commando "expr" heeft verschillende mogelijkheden. Laten we enkele illustreren met voorbeelden: Een batchbestand uitvoeren:

X=7 y=2 a=`expr $x + $y` ; echo a=$a a=`expr $a + 1` ; echo a=$a b=`expr $y - $x` ; echo b=$b c=`uitdr $x "*" $y`; echo c=$c d=`expr $x / $y` ; echo d=$d e=`expr $x % $y` ; echo e=$e

zal op het scherm verschijnen

A=9 a=10 b=-5 c=14 d=3 e=1

De vermenigvuldigingsbewerking ("*") moet worden vermeden, omdat dit pictogram in de shell wordt gezien als een speciaal teken, wat betekent dat elke reeks tekens deze plaats kan vervangen. Met het commando "expr" zijn niet alleen (gehele) rekenkundige bewerkingen mogelijk, maar ook stringbewerkingen:

A=`expr "cocktail" : "haan"`; echo $A B=`uitdr "cocktail" : "staart"`; echo $B C=`uitdr "cocktail" : "koken"`; echo $C D=`expr "haan" : "cocktail"`; echo $D

Er worden getallen op het scherm weergegeven met het aantal overeenkomende tekens in de tekenreeksen (vanaf het begin). De tweede regel kan niet langer zijn dan de eerste:

4 0 0 0

Variabelen exporteren UNIX heeft het concept van een proces. Een proces vindt plaats wanneer een opdracht wordt uitgevoerd voor uitvoering. Bijvoorbeeld bij het typen van "r" op het toetsenbord " proces "p" wordt voortgebracht. Op zijn beurt kan "p" andere processen voortbrengen. Laten we zeggen dat "p" "p1" en "p2" aanroept, die achtereenvolgens de overeenkomstige processen voortbrengen. Elk proces heeft zijn eigen omgeving - een set Bijvoorbeeld, voordat "p" werd uitgevoerd, bestond er al een omgeving waarin enkele variabelen al waren gedefinieerd. Door "p" uit te voeren, wordt een nieuwe omgeving gegenereerd, waarin "p1" en "p2" worden voortgebracht. Variabelen zijn local binnen het proces waarin ze worden gedeclareerd, d.w.z. waar ze waarden krijgen toegewezen. Om ervoor te zorgen dat ze beschikbaar zijn voor andere voortgebrachte processen, moeten ze expliciet worden doorgegeven. Hiervoor wordt de ingebouwde opdracht "exporteren" gebruikt.

Parameters

Parameters kunnen worden doorgegeven aan het batchbestand. De shell gebruikt positionele parameters (d.w.z. de volgorde waarin ze verschijnen is significant). In een batchbestand beginnen de variabelen die overeenkomen met de parameters (vergelijkbaar met shell-variabelen) met het "$"-teken, gevolgd door een van de cijfers van 0 tot 9: Laat "examp-1" worden aangeroepen met de "cock" en "staart" parameters. Deze parameters komen de nieuwe omgeving binnen onder de standaardnamen "1" en "2". De (standaard) variabele met de naam "0" zal de naam van de aangeroepen berekening bevatten. Bij toegang tot parameters wordt het dollarteken "$" voor het cijfer geplaatst (zoals bij toegang tot variabelen): $0 komt overeen met de naam van het gegeven batchbestand; $1 eerste parameter; $2 is de tweede parameter, enzovoort. Aangezien het aantal variabelen waaraan parameters kunnen worden doorgegeven, beperkt is tot één cijfer, d.w.z. 9e ("0", zoals reeds opgemerkt, heeft een speciale betekenis), dan wordt een speciaal "shift" -commando gebruikt om een ​​groter aantal parameters over te dragen. De opdracht "set" geeft een eigenaardige benadering van parameters. Fragmenten bijvoorbeeld

Stel a b in met echo eerste=$1 tweede=$2 derde=$3

zal op het scherm verschijnen

Eerste=a Tweede=b Derde=c

die. het "set" commando stelt de parameterwaarden in. Dit blijkt erg handig te zijn. De opdracht "date" geeft bijvoorbeeld de huidige datum weer, zeg "Mon May 01 12:15:10 2000", bestaande uit vijf woorden, en

Stel `datum` echo in $1 $3 $5

zal op het scherm verschijnen

ma 01 2000

Met het "set"-commando kunt u ook de uitvoering van het programma regelen, bijvoorbeeld: set -v voert regels uit die leesbaar zijn voor de shell naar de terminal. set +v annuleert de vorige modus. set -x print commando's naar de terminal voordat ze worden uitgevoerd. set +x annuleert de vorige modus. Het "set"-commando zonder parameters print de status van de softwareomgeving naar de terminal.

Vervangingen van Shell-tolken

Voordat de directe interpretatie en uitvoering van commando's in batchbestanden wordt gestart, voert de shell verschillende soorten vervangingen uit: 1. RESULTAATVERVANGING. Alle commando's tussen aanhalingstekens worden uitgevoerd en het resultaat wordt op hun plaats gezet. 2. VERVANGING VAN DE WAARDEN VAN PARAMETERS EN VARIABELEN. Dat wil zeggen, woorden die beginnen met "$" worden vervangen door de overeenkomstige waarden van variabelen en parameters. 3. INTERPRETATIE VAN GAPS. Ontsnapte spaties worden genegeerd. 4. GENEREREN VAN BESTANDSNAMEN. Woorden worden gecontroleerd op de aanwezigheid van speciale tekens ("*", "?", "") en de overeenkomstige generaties worden uitgevoerd. Softwareomgeving Elk proces heeft een omgeving waarin het draait. Shell gebruikt een aantal omgevingsvariabelen. Als u de opdracht "set" typt zonder parameters, zal het scherm informatie weergeven over een aantal standaardvariabelen die bij het inloggen zijn gemaakt (en doorgegeven aan al uw nieuwe processen "door overerving"), evenals variabelen die door uw processen zijn gemaakt en geëxporteerd . Het specifieke type en de inhoud van de weergegeven informatie hangt in grote mate af van welke versie van UNIX wordt gebruikt en hoe het systeem is geïnstalleerd.

Het resultaat van het uitvoeren van het set-commando zonder parameters (niet volledig):

HOME=/root PATH=/usr/local/bin:/usr/bin:/bin:.:/usr/bin/X11: IFS= LOGNAME=sae MAIL=/var/spool/mail/sae PWD=/home/ sae/STUDY/SHELL PS1=$(PWD):" " PS2=> SHELL=/bin/bash

Laten we iets zeggen over de waarden van de variabelen. HOME=/root is de naam van de homedirectory waar de gebruiker terechtkomt na het inloggen. Dat wil zeggen, door de gebruikersnaam en het wachtwoord correct te typen, kom ik in de map "/ root". PATH=/bin:/usr/bin:.:/usr/local/bin:/usr/bin/X11 - deze variabele bepaalt de volgorde van bestanden die "shell" zoekt naar een opdracht. Bestandsnamen worden hier gescheiden door dubbele punten. De bladervolgorde komt overeen met de volgorde van de namen in het spoor. Maar in eerste instantie vindt het zoeken plaats tussen de zogenaamde ingebouwde commando's. De ingebouwde commando's bevatten de meest gebruikte commando's, zoals "echo", "cd", "pwd", "date". Daarna kijkt het systeem in de directory "/bin", die de opdrachten "sh", "cp", "mv", "ls", enz. kan bevatten. Dan de directory "/usr/bin" met de commando's "cat", "cc", "expr", "nroff", "man" en vele anderen. Verder vindt de zoekopdracht plaats in de huidige map ("".", of een andere aanduiding "leeg", d.w.z. ""), waar de commando's die u hebt geschreven zich hoogstwaarschijnlijk bevinden. Na het typen van de opdrachtregel en het indrukken van "shell" (na het maken van de nodige vervangingen) herkent de naam die overeenkomt met het commando en zoekt ernaar in de mappen die worden vermeld in het PATH. Als de opdracht buiten deze mappen wordt geplaatst, wordt deze niet gevonden. Als er meerdere commando's met dezelfde naam zijn, wordt degene die zich in de eerst bekeken directory bevindt, aangeroepen. PATH kan, net als andere variabelen, eenvoudig worden gewijzigd door mappen toe te voegen, te herschikken of uit te sluiten. IFS= (Internal Field Separator) somt de tekens op die worden gebruikt om woorden (velden) te scheiden. Dit zijn "spatie", "tab" en "line feed", hier is dus links van de opdracht niets zichtbaar en zijn twee regels bezet. LOGNAME=root - inlognaam ("gebruikersnaam"). MAIL=/var/spool/mail/root is de naam van het bestand dat (e-mail)mail ontvangt. PWD=/root - huidige mapnaam PS1=$(PWD):" " - type promter. In dit geval zal de prompter de naam van de huidige map, een dubbele punt en een spatie weergeven. Dat wil zeggen, "/ root:" zal hier zijn. PS2=> - deze prompter (hier ">") wordt gebruikt als een uitnodiging om door te gaan met het typen (op de volgende regel) van een onvoltooide opdracht. Typ bijvoorbeeld het openingshaakje "(" en druk daarna op op de volgende regel ziet u deze prompter. Als u nog niet weet wat u vervolgens moet doen, typt u het haakje sluiten ")" en het zal verdwijnen. SHELL=/bin/sh - Deze variabele specificeert de shell die de gebruiker gebruikt. In dit geval wordt de standaard shell ("sh") gebruikt. De initiële omgeving wordt automatisch ingesteld bij het inloggen met behulp van bestanden zoals "/etc/rc" en "/etc/.profile". Een manier om eenvoudig de omgeving te wijzigen (bijv. opdrachtzoekpad, prompterweergave, shellweergave, schermkleur, enz.) is door deze informatie in uw thuismap te plaatsen in een gespecialiseerd ".profile"-bestand ($(HOME)/.profile ) door de gewenste waarden toe te wijzen aan de omgevingsvariabelen. Dat wil zeggen, roep dit bestand in de editor en schrijf wat je wilt). Elke keer dat u zich aanmeldt, wordt dit bestand automatisch uitgevoerd en wordt een nieuwe omgeving opgezet. Dit bestand MOET in uw HOME-directory (login-directory) worden geplaatst. Merk op dat bestandsnamen die met een punt beginnen over het algemeen een speciale status hebben. Ze worden dus niet op het scherm weergegeven met een simpele "ls" -opdracht - u moet deze opdracht aanroepen met de "-a" -vlag. Overigens worden ze niet zonder onderscheid vernietigd door het commando "rm *". De shell-interpreter wijst zelf automatisch waarden toe aan de volgende variabelen (parameters): ? de waarde geretourneerd door de laatste opdracht; $ procesnummer; ! achtergrondprocesnummer;

  1. het aantal positionele parameters dat aan de shell is doorgegeven;
  • parameterlijst als één regel;

@ lijst met opties als een verzameling woorden; - vlaggen doorgegeven aan de schaal. Wanneer u deze variabelen benadert (dat wil zeggen, wanneer u ze gebruikt in een batchbestand - een shell-programma), moet u "$" ervoor plaatsen. Een belangrijke rol bij het maken van unieke bestanden wordt gespeeld door de speciale variabele "$$", waarvan de waarde overeenkomt met het nummer van het proces dat deze berekening uitvoert. Elke nieuwe berekening die door de computer wordt uitgevoerd, initieert een of meer processen die automatisch getallen op volgorde ontvangen. Door het procesnummer als bestandsnaam te gebruiken, kunt u er dus zeker van zijn dat elk nieuw bestand een nieuwe naam krijgt (niet een bestaande overschrijft). Het voordeel is meteen ook het grootste nadeel van deze manier van bestanden benoemen. Het is niet bekend welke namen aan de bestanden worden toegekend. En als het in het kader van dit proces mogelijk is om een ​​bestand te vinden "zonder te kijken", d.w.z. door ernaar te verwijzen met $$, dan kunnen dergelijke bestanden gemakkelijk verloren gaan. Dit zorgt voor extra problemen bij het debuggen van programma's. De tolk bellen Nadat de gebruiker zich heeft aangemeld bij het systeem (met behulp van de login-opdracht), wordt de SHELL-taaltolk gebeld. Als de inlogdirectory van de gebruiker een .profile-bestand bevat, voert de interpreter dit bestand uit voordat er ook maar één commando van de terminal is ontvangen (er wordt aangenomen dat het .profile-bestand commando's bevat). De volgende schakelopties kunnen worden opgegeven tijdens de aanroep: -c string Commando's worden gelezen uit de opgegeven string. -s Commando's worden gelezen uit standaardinvoer. Tolkberichten worden naar het standaarddiagnosebestand geschreven. -i Interactieve modus. Als het eerste teken van de parameter "0" - is, worden de opdrachten uit het .profile-bestand gelezen.

PROGRAMMASTRUCTUREN===

Zoals in elke programmeertaal, kunnen er opmerkingen in de tekst in de shell-taal staan. Hiervoor wordt het "#"-teken gebruikt. Alles wat in de regel (in het batchbestand) links van dit symbool staat, wordt door de tolk gezien als commentaar. Bijvoorbeeld,

# Dit is een opmerking.

Zoals elke procedurele programmeertaal heeft de shell-taal operators. Met een aantal operators kunt u de volgorde van uitvoering van opdrachten bepalen. Bij dergelijke operatoren is het vaak nodig om de voorwaarde te controleren, die de richting van de voortzetting van de berekeningen bepaalt.

test(") commando

Het testcommando controleert of aan een bepaalde voorwaarde wordt voldaan. Met behulp van dit (ingebouwde) commando worden commando's voor shell-taal selecteren en herhalen gevormd. Twee mogelijke opdrachtformaten:

test conditie

[ voorwaarde ]

we zullen de tweede optie gebruiken, d.w.z. in plaats van het woord "test" voor de voorwaarde te schrijven, plaatsen we de voorwaarde tussen haakjes, wat meer bekend is bij programmeurs. In feite zal de shell dit commando van de openingshaak "[" herkennen als het woord dat overeenkomt met het commando "test". Er moeten spaties zijn tussen de haakjes en de voorwaarde die erin staat. Er moeten ook spaties zijn tussen de waarden en het vergelijkingsteken of de bewerking.De shell gebruikt voorwaarden van verschillende "types". BESTANDSCONTROLE VOORWAARDEN: -f bestand "bestand" is een normaal bestand; -d bestand bestand "bestand" - map; -c bestand "bestand" is een speciaal bestand; -r bestand heeft toestemming om bestand "bestand" te lezen; -w bestand heeft toestemming om naar bestand "bestand" te schrijven; -s bestand "bestand" is niet leeg.

STRING CONTROLEER VOORWAARDEN: str1 = str2 tekenreeksen "str1" en "str2" komen overeen; str1 != str2 strings "str1" en "str2" komen niet overeen; -n str1 string "str1" bestaat (niet leeg); -z str1 string "str1" bestaat niet (leeg). Voorbeelden.

x="wie is wie"; x exporteren; [ "wie is wie" = "$x" ]; echo $? 0 x=abc ; x exporteren; [abc = "$x"]; echo $? 0 x=abc ; x exporteren; [ -n "$x" ] ; echo $? 0x="" ; x exporteren; [ -n "$x" ] ; echo $? een

Daarnaast zijn er twee standaardwaarden voor voorwaarden die kunnen worden gebruikt in plaats van de voorwaarde (haakjes zijn niet nodig). VOORWAARDEN VOOR VERGELIJKING VAN GETALLEN: x -eq y "x" is gelijk aan "y", x -ne y "x" is niet gelijk aan "y", x -gt y "x" is groter dan "y", x -ge y "x" is groter dan of gelijk aan "y", x -lt y "x" is kleiner dan "y", x -le y "x" is kleiner dan of gelijk aan "y". COMPLEXE OMSTANDIGHEDEN: Geïmplementeerd met typische logische operaties: ! (niet) keert de waarde van de afsluitcode om. -o (of) komt overeen met logische "OF". -a (and) komt overeen met logische AND.

Voorwaardelijke "als"-verklaring

Over het algemeen heeft de "if" -instructie de structuur

als voorwaarde dan lijst

Hier is "elif" een afkorting voor "else if" en kan samen met de volledige worden gebruikt, d.w.z. het nesten van een willekeurig aantal "if"-statements (evenals andere statements) is toegestaan. Natuurlijk moet "lijst" in elk geval zinvol en toelaatbaar zijn in de gegeven context. De meest afgekapte structuur van deze operator

Als voorwaarde, vermeld dan fi

als aan de voorwaarde is voldaan (in de regel is dit degene die de voltooiingscode "0" heeft ontvangen, dan wordt de "lijst" uitgevoerd, anders wordt deze overgeslagen. Voorbeelden. Laat "if-1" schrijven

Als [$1 -gt $2]

dan pwd else echo $0: Hallo!

Dan bellen als-1 12 11 geeft /home/sae/STUDY/SHELL en als-1 12 13 geeft als-1: Hallo!

Oproepverklaring ("zaak")

De selectieopdracht "zaak" heeft de structuur:

Hoofdletterreeks erin

patroon) lijst met opdrachten;; patroon) lijst met opdrachten;; ... patroon) lijst met commando's;;

Hier zijn "case", "in" en "esac" hulpwoorden. Een "string" (het kan een enkel teken zijn) wordt vergeleken met een "patroon". Vervolgens wordt de "commandolijst" van de geselecteerde rij uitgevoerd. Kijk ongewoon naar het einde van de selectieregels ";;", maar schrijf hier ";" het zou een vergissing zijn. Voor elk alternatief kunnen verschillende commando's worden uitgevoerd. Als deze commando's op één regel zijn geschreven, dan is het teken ";" wordt gebruikt als opdrachtscheidingsteken. Meestal heeft de laatste selectieregel het patroon "*", wat "elke waarde" betekent in de "case"-structuur. Deze tekenreeks wordt geselecteerd als de waarde van de variabele (hier $z) niet overeenkomt met een van de eerder geschreven patronen die worden begrensd door het haakje ")". De waarden worden opgezocht in de volgorde waarin ze zijn geschreven.

Opsommingslus-instructie ("for")

De "for"-lusoperator heeft de structuur:

Voor naam

doen lijst met uitgevoerde opdrachten waarbij "voor" een functiewoord is dat het type cyclus definieert, "doen" en "klaar" zijn servicewoorden die de kern van de cyclus markeren. Laat het "lsort" commando worden vertegenwoordigd door een batchbestand

Voor i in file_1 file_2 file_3 doe proc_sort $i klaar

In dit voorbeeld speelt de naam "i" de rol van een lusparameter. Deze naam kan worden beschouwd als een shell-variabele, waaraan de vermelde waarden (i=file_1, i=file_2, i=file_3) achtereenvolgens worden toegewezen, en de opdracht "proc_sort" wordt in een lus uitgevoerd. De vorm "voor i in *" wordt vaak gebruikt, wat betekent "voor alle bestanden in de huidige directory". Laat "proc_sort" op zijn beurt worden weergegeven door een batchbestand

Kat $1 | sorteren | tee /dev/lp > $(1)_gesorteerd

die. de opgegeven bestanden worden achtereenvolgens gesorteerd, de sorteerresultaten worden afgedrukt ("/dev/lp") en naar de bestanden verzonden file_1_sorted file_2_sorted en file_3_sorted

Loop-instructie met ware voorwaarde ("while")

De "while"-structuur, die ook berekeningen levert, heeft de voorkeur wanneer de exacte lijst met parameterwaarden niet van tevoren bekend is of deze lijst moet worden verkregen als resultaat van berekeningen in een lus. De lusopdracht "while" heeft de volgende structuur:

terwijl conditie

doe lijst met uitgevoerde opdrachten waarbij "terwijl" een functiewoord is dat het type lus definieert met een voorwaarde waar. De lijst met opdrachten in de lusbody (tussen "do" en "done") wordt herhaald totdat de voorwaarde waar is (d.w.z. de afsluitcode van de laatste opdracht in de lusbody is "0") of de lus wordt onderbroken vanaf de binnen door speciale commando's ("break", "continue" of "exit"). De eerste keer dat u de lus betreedt, moet aan de voorwaarde zijn voldaan. Met het commando "break [n]" kunt u de lus verlaten. Als "n" afwezig is, dan is het gelijk aan "break 1". "n" geeft het aantal geneste lussen aan waaruit moet worden afgesloten, bijvoorbeeld "break 3" - verlaten van drie geneste lussen. In tegenstelling tot het commando "break", beëindigt het commando "continue [n]" alleen de uitvoering van de huidige lus en keert terug naar het BEGIN van de lus. Het kan ook met een parameter. Bijvoorbeeld, "continue 2" betekent verlaten naar het begin van de tweede (indien geteld vanaf de diepte) geneste lus. Met de opdracht "exit [n]" kunt u de procedure helemaal afsluiten met een retourcode van "0" of "n" (als de parameter "n" is opgegeven). Deze opdracht kan niet alleen in lussen worden gebruikt. Zelfs in een lineaire volgorde van instructies kan het bij het debuggen nuttig zijn om de uitvoering van de (huidige) berekening op een bepaald punt te stoppen.

Loop-instructie met valse voorwaarde ("until")

De lusoperator "until" heeft de structuur:

tot voorwaarde

do lijst met uitgevoerde commando's waarbij "until" een functiewoord is dat het type lus definieert met de voorwaarde onwaar. De lijst met commando's in de body van de lus (tussen "do" en "done") wordt herhaald totdat de voorwaarde onwaar is of de lus van binnenuit wordt onderbroken door speciale commando's ("break", "continue" of "exit") . De eerste keer dat u de lus invoert, mag de voorwaarde niet waar zijn. Het verschil met de "while"-operator is dat de lusvoorwaarde wordt gecontroleerd op onwaarheid (voor een niet-nul exitcode van het laatste commando van de lusbody) wordt gecontroleerd NA elke (inclusief de eerste!) uitvoering van de commando's van de lus lichaam. Voorbeeld.

tot vals doen

lees x als [ $x = 5 ] echo dan voldoende ; break else echo wat meer fi

Hier wacht het programma in een oneindige lus op de invoer van woorden (waarbij de zin "nog wat" op het scherm wordt herhaald) totdat "5" wordt ingevoerd. Daarna wordt "genoeg" gegeven en het commando "break" beëindigt de uitvoering van de lus.

Lege verklaring

De lege verklaring heeft het formaat

:

Niks doen. Retourneert de waarde "0".".

Shell-functies

Met deze functie kunt u een lijst met shell-commando's voorbereiden voor latere uitvoering. De functiebeschrijving ziet er als volgt uit:

Naam() (lijst met opdrachten)

waarna de aanroep van de functie op naam plaatsvindt. Wanneer de functie wordt uitgevoerd, wordt er geen nieuw proces gemaakt. Het wordt uitgevoerd in de omgeving van het corresponderende proces. De argumenten van de functie worden de positionele parameters; de naam van de functie is de null-parameter. U kunt de uitvoering van een functie onderbreken met het statement "return [n]", waarbij (optioneel) "n" de returncode is.

Afhandeling onderbreken ("trap")

Soms is het nodig om de uitvoering van het programma te beschermen tegen onderbrekingen. De meest voorkomende onderbrekingen zijn de volgende, overeenkomend met signalen: 0 uitgang van de tolk, 1 vrijgave (verbreken van de abonnee op afstand), 2 onderbreking van , 9 doden (niet onderschept), 15 beëindigen executie. Ter bescherming tegen onderbrekingen is er een "trap"-opdracht, die de volgende indeling heeft:

Vang "commandolijst" signalen op

Als er onderbrekingen optreden in het systeem, waarvan de signalen worden weergegeven met een spatie in "signalen", dan wordt de "lijst met commando's" uitgevoerd, waarna (als het "exit" -commando niet werd uitgevoerd in de lijst met commando's), de besturing keert terug naar het breekpunt en de uitvoering van het batchbestand gaat door. Als u bijvoorbeeld de bestanden in "/tmp" wilt verwijderen voordat u de uitvoering van een batchbestand onderbreekt, kunt u dit doen met de opdracht "trap":

Trap "rm /tmp/* ; exit 1" 1 2 15

die voorafgaat aan andere opdrachten in het bestand. Hier wordt na het verwijderen van de bestanden "afsluiten" gedaan vanuit het batchbestand.

Zoals hierboven vermeld, is het noodzakelijk om operatoren voor conditiecontrole te hebben om willekeurige algoritmen te construeren. schelp bashen ondersteunt geselecteerde verklaringen indiendananders en zaak, evenals looping-operators voor,terwijl, tot, waardoor het een krachtige programmeertaal is.

5.8.1 Exploitanten indien en test(of )

De constructie van de voorwaardelijke operator in een enigszins vereenvoudigde vorm ziet er als volgt uit:

als lijst1 dan lijst2 anders lijst3 fi

waar lijst1, lijst2 en lijst3 zijn opeenvolgingen van commando's gescheiden door komma's en eindigend met een puntkomma of een nieuwregelteken. Bovendien kunnen deze reeksen tussen accolades worden geplaatst: (lijst).

Exploitant indien controleert de waarde die wordt geretourneerd door opdrachten van lijst1. Als er meerdere opdrachten in deze lijst staan, wordt de waarde gecontroleerd die door de laatste opdracht in de lijst wordt geretourneerd. Als deze waarde 0 is, dan commando's van lijst2; als deze waarde niet nul is, worden de opdrachten from lijst3. De waarde die wordt geretourneerd door een dergelijke samengestelde instructie indien, komt overeen met de waarde die wordt geretourneerd door de laatste opdracht in de reeks die wordt uitgevoerd.

Volledig opdrachtformaat indien lijkt op:

als lijst dan lijst [elif lijst dan lijst] ... [anders lijst] fi

(hier betekenen de vierkante haken alleen dat wat ze bevatten optioneel is in de operator).

Als uitdrukking die direct daarna komt indien of elif, wordt de opdracht vaak gebruikt test, wat ook kan worden aangegeven met vierkante haken . Opdracht test evalueert een uitdrukking en retourneert 0 als de uitdrukking waar is en 1 anders. De expressie wordt doorgegeven aan het programma test als argument. In plaats van te schrijven

testuitdrukking,

U kunt de uitdrukking tussen vierkante haken plaatsen:

[ uitdrukking ].

Let erop dat test en [ zijn twee namen van hetzelfde programma, niet een of andere magische conversie uitgevoerd door de shell bashen(alleen de syntaxis [ vereist een accolade sluiten). Merk ook op dat in plaats van test in aanbouw indien elk programma kan worden gebruikt.

Tot slot geven we een voorbeeld van het gebruik van de operator indien:

if [ -e tekstmode2.htm ] ; dan

ls tekstmodus*

anders

pwd

Over de exploitant test(of […]) we zouden een speciaal gesprek moeten hebben.

5.8.2 Exploitant test en voorwaarden

Voorwaardelijke uitdrukkingen die in de instructie worden gebruikt test, zijn gebouwd op basis van het controleren van bestandskenmerken, stringvergelijkingen en gewone rekenkundige vergelijkingen. Complexe uitdrukkingen worden opgebouwd uit de volgende unaire of binaire bewerkingen ("elementaire bouwstenen"):

    Een bestand

Waar als er een bestand met de naam bestand bestaat.

    B-bestand

Waar als het dossier bestaat en is een speciaal blokapparaatbestand.

    C-bestand

Waar als het dossier bestaat en is een speciaal karakterapparaatbestand.

    D-bestand

Waar als het dossier bestaat en is een directory.

    E-bestand

Waar als het bestand met de naam het dossier bestaan.

    F-bestand

Waar als het bestand met de naam het dossier bestaat en is een regulier bestand.

    G-bestand

Waar als het bestand met de naam het dossier bestaat en de groepsveranderingsbit is ingesteld.

    H-bestand of -L-bestand

Waar als het bestand met de naam het dossier bestaat en is een symbolische link.

    K-bestand

Waar als het bestand met de naam het dossier bestaat en is ingesteld op "sticky"" bit.

    P-bestand

Waar als het bestand met de naam het dossier bestaat en is genoemde pijp(FIFO).

    R-bestand

Waar als het bestand met de naam het dossier bestaat en is ingesteld om te lezen

    S-bestand

Waar als het bestand met de naam het dossier bestaat en de grootte ervan is groter dan nul.

    Tfd

Waar als de bestandsdescriptor fd is open en wijst naar de terminal.

    u bestand

Waar als het bestand met de naam het dossier bestaat en heeft de change user bit ingesteld.

    w-bestand

Waar als het bestand met de naam het dossier bestaat en heeft schrijfrechten.

    X-bestand

Waar als het bestand met de naam het dossier bestaat en is uitvoerbaar.

    Over bestand

Waar als het bestand met de naam het dossier bestaat en is eigendom van de gebruiker waarnaar wordt verwezen door de effectieve gebruikers-ID.

    G-bestand

Waar als het bestand met de naam het dossier bestaat en behoort tot de groep die wordt geïdentificeerd door de effectieve groepsidentificatie.

    S-bestand

Waar als het bestand met de naam het dossier bestaat en is een socket.

    N-bestand

Waar als het bestand met de naam het dossier bestaat en is veranderd sinds het voor het laatst werd gelezen.

    bestand1 -nt bestand2

Waar als het bestand bestand1 heeft een later wijzigingstijdstip dan bestand2.

    bestand1 -ot bestand2

Waar als het bestand bestand1 ouder dan bestand2.

    bestand1 -ef bestand2

Waar als de files bestand1 en bestand2dezelfde apparaat- en inodenummers hebben(inode).

    Over optname

Waar als de shell-optie is ingeschakeld optnaam. Zie de bash man-pagina voor uitleg.

    Zstring

Waar als de lengte van de tekenreeks nul is.

    N-snaar

Waar als de lengte van de tekenreeks niet nul is.

    tekenreeks1 == tekenreeks2

Waar als de tekenreeksen overeenkomen. In plaats van == kan worden gebruikt = .

    tekenreeks1!== tekenreeks2

Waar als de tekenreeksen niet overeenkomen.

    tekenreeks1< string2

Waar als de tekenreeks tekenreeks1 lexicografisch voorafgaat aan de string tekenreeks2(voor de huidige locale).

    tekenreeks1 > tekenreeks2

Waar als de tekenreeks tekenreeks1 komt lexicografisch na de string tekenreeks2(voor de huidige locale).

    arg1 OP arg2

Hier OP- eh dan een van de rekenkundige vergelijkingsbewerkingen: -eq(gelijk aan), -ne(niet gelijk), -lt(minder dan), -le(minder dan of gelijk aan), - gt(meer), -ge(meer of gelijk). Positieve of negatieve gehele getallen kunnen als argumenten worden gebruikt.

Van deze elementaire voorwaardelijke uitdrukkingen kun je willekeurig complexe uitdrukkingen bouwen met behulp van de gebruikelijke logische bewerkingen NEGATIEF, EN en OF:

    !(uitdrukking)

Booleaanse ontkenningsoperator.

    uitdrukking1 -een uitdrukking2

booleaanse operator EN(EN). Waar als beide uitdrukkingen waar zijn.

    uitdrukking1 -o uitdrukking2

booleaanse operator OF(OF). Waar als een van de twee uitdrukkingen waar is.

Dezelfde voorwaardelijke uitdrukkingen worden gebruikt in statements terwijl en tot, die we hieronder zullen bekijken.

5.8.3 Exploitant geval

Operator formaat geval is:

hoofdletterwoord in [ [(] patroon [ | patroon ] ...) lijst ;; ] ... esac

Opdracht geval produceert eerst de onthulling van het woord woord, en probeert het resultaat te matchen met elk van de monsters patroon afwisselend. Na het vinden van de eerste match wordt er niet meer gecontroleerd, de lijst met commando's achter het patroon waarmee een match is gevonden wordt uitgevoerd. De waarde die door de operator wordt geretourneerd, is 0 als er geen patroonovereenkomsten zijn gevonden. Anders wordt de waarde geretourneerd die is uitgegeven door de laatste opdracht in de overeenkomstige lijst.

Het volgende voorbeeld van een case-statement is afkomstig uit het systeemscript /etc/rc.d/rc.sysinit.

hoofdletter "$UTC" erin

ja|waar)

CLOCKFLAGS="$CLOCKFLAGS -u";

CLOCKDEF="$CLOCKDEF (utc)";

nee|niet waar)

CLOCKFLAGS="$CLOCKFLAGS --lokale tijd";

CLOCKDEF="$CLOCKDEF (lokale tijd)";

esac

Als de variabele ja of true, dan wordt het eerste paar commando's uitgevoerd en als de waarde no of false is, wordt het tweede paar uitgevoerd.

5.8.4 Exploitant selecteren

Exploitant selecteren stelt u in staat om interactieve interactie met de gebruiker te organiseren. Het heeft de volgende indeling:

selecteer naam [woord; ]do lijst; gedaan

Eerst van sjabloon woord er wordt een lijst met woorden gevormd die overeenkomen met het patroon. Deze reeks woorden wordt uitgevoerd naar standaardfout, waarbij elk woord wordt gevolgd door een volgnummer. Als sjabloon woord weggelaten, worden de positionele parameters op dezelfde manier uitgevoerd. De standaard PS3-prompt wordt dan gegeven en de shell wacht op het invoeren van een tekenreeks bij standaardinvoer. Als de ingevoerde string een nummer bevat dat overeenkomt met een van de weergegeven woorden, dan is de variabele naam krijgt een waarde gelijk aan dit woord. Als een lege string wordt ingevoerd, worden de cijfers en de bijbehorende woorden opnieuw weergegeven. Als een andere waarde wordt ingevoerd, wordt de variabele naam krijgt een nulwaarde toegewezen. De door de gebruiker ingevoerde string wordt opgeslagen in een variabele ANTWOORD. Commando lijst lijst uitgevoerd met de geselecteerde waarde van de variabele naam.

Hier is een klein script:

#!/bin/sh

echo "Welk besturingssysteem heeft uw voorkeur?"

selecteer var in "Linux" "Gnu Hurd" "Free BSD" "Other"; doen

pauze

gedaan

echo "Zou je $var kiezen"

Welk besturingssysteem heeft uw voorkeur?
1) Linux
2) GnuHurd
3) FreeBSD
4) Anders
#?

Druk op een van de 4 voorgestelde nummers (1,2,3,4). Als u bijvoorbeeld 1 invoert, ziet u de volgende melding:

“Je zou voor Linux kiezen”

5.8.5 Exploitant voor

Exploitant voor werkt een beetje anders dan in conventionele programmeertalen. In plaats van de waarde van een variabele te organiseren om met één te verhogen of te verlagen bij elke doorgang van de lus, wijst het de volgende waarde toe aan de variabele uit de gegeven lijst met woorden bij elke doorgang van de lus. Over het algemeen ziet het ontwerp er ongeveer zo uit:

voor naam in woorden doe lijst gedaan.

Regels voor het samenstellen van commandolijsten ( lijst) zijn hetzelfde als in de operator indien.

Voorbeeld. Het volgende script maakt de bestanden foo_1, foo_2 en foo_3:

voor een op 1 2 3 ; doen

raak foo_$a aan

gedaan

Over het algemeen heeft het for-statement de indeling:

voor naam [in woord; ]do lijst; gedaan

Eerst wordt het woord onthuld woord volgens de uitdrukkingsuitbreidingsregels hierboven. Dan een variabele naam de resulterende waarden worden beurtelings toegewezen, en telkens de lijst met commando's l is. Indien " in woord" wordt weggelaten, dan de lijst met commando's lijst wordt eenmaal uitgevoerd voor elke gegeven positionele parameter.

Linux heeft een programma volg, die twee getallen als argumenten gebruikt en de volgorde van alle getallen tussen de gegeven getallen retourneert. Met dit commando kun je forceren voor in bashen werken op precies dezelfde manier als een vergelijkbare operator werkt in conventionele programmeertalen. Om dit te doen, volstaat het om een ​​cyclus te schrijven voor op de volgende manier:

voor een in $(seq 1 10) ; doen

cat-bestand_$a

gedaan

Deze opdracht toont de inhoud van 10 bestanden op het scherm: " bestand_1", ..., "bestand_10".

5.8.6 Exploitanten terwijl en tot

Exploitant terwijl werkt als indien, alleen uitvoering van operators uit de lijst lijst2 lus zolang de voorwaarde waar is, en breekt als de voorwaarde niet waar is. De opbouw ziet er als volgt uit:

terwijl lijst1 lijst2 doet.

while [ -d mijndirectory] ; doen

ls -l mijnmap >> logbestand

echo -- SEPARATOR -- >> logbestand

slapen 60

gedaan

Zo'n programma logt elke minuut de inhoud van de map "mydirectory" zolang de map bestaat.

Exploitant tot gelijk aan operator terwijl:

tot lijst1 doe lijst2 gedaan.

Het verschil is dat het resultaat wordt geretourneerd bij het uitvoeren van een lijst met instructies lijst1, wordt genomen met ontkenning: lijst2 wordt uitgevoerd als het laatste commando in de lijst lijst1 retourneert een afsluitstatus die niet gelijk is aan nul.

5.8.7 Functies

Syntaxis

schelp bashen stelt de gebruiker in staat om zijn eigen functies te creëren. Functies gedragen zich en worden op precies dezelfde manier gebruikt als gewone shell-commando's, d.w.z. we kunnen zelf nieuwe commando's maken. Functies zijn als volgt opgebouwd:

functienaam () ( lijst )

En het woord functie niet nodig, naam definieert de naam van de functie waarmee deze kan worden aangeroepen, en de hoofdtekst van de functie bestaat uit een lijst met opdrachten lijst tussen en ). Deze lijst met opdrachten wordt elke keer uitgevoerd als de naam naam opgegeven als de naam van de opdracht die moet worden aangeroepen. Merk op dat functies recursief kunnen worden gedefinieerd, dus het is toegestaan ​​om de functie die we definiëren binnen zichzelf aan te roepen.

Functies worden uitgevoerd in de context van de huidige shell: er wordt geen nieuw proces gestart om een ​​functie te interpreteren (in tegenstelling tot shellscripts).

Argumenten

Wanneer een functie wordt aangeroepen voor uitvoering, worden de argumenten van de functie positionele parameters(positionele parameters) tijdens de uitvoering van de functie. Ze worden genoemd als $n, waar n is het nummer van het argument waartoe we toegang willen hebben. Argumentnummering begint bij 1, dus $1 is het eerste argument. We kunnen ook alle argumenten in één keer meekrijgen $* , en het aantal argumenten dat wordt gebruikt $# . Positionele parameter 0 verandert niet.

Als er een ingebouwde opdracht is in de hoofdtekst van de functie opbrengst, wordt de uitvoering van de functie onderbroken en wordt de besturing overgedragen aan het commando na de functieaanroep. Wanneer de functie is voltooid, de positionele parameters en de speciale parameter # de waarden die ze hadden vóór de start van de functie worden geretourneerd.

Lokale variabelen (lokaal)

Als we een lokale instelling willen creëren, kunnen we het trefwoord gebruiken lokaal. De syntaxis voor het instellen ervan is precies hetzelfde als voor normale parameters, alleen de definitie wordt voorafgegaan door het trefwoord lokaal: lokaal naam=waarde.

Hier is een voorbeeld van het instellen van een functie die de hierboven genoemde opdracht implementeert volg:

volg()

lokaal I=$1;

terwijl [$2!= $I]; doen

echo -n "$I";

ik=$(($ik + 1))

gedaan;

echo $ 2

Let op de optie -n exploitant echo, wordt de nieuwe regel geannuleerd. Hoewel het niet essentieel is voor de doeleinden die we hier in gedachten hebben, kan het nuttig zijn voor ander gebruik van de functie.

Factoriële functie feit

Nog een voorbeeld:

feit()

als [$1 = 0]; dan

echo1;

anders

echo $(($1 * $(feit $(($1 - 1)))))

Dit is de faculteitsfunctie, een voorbeeld van een recursieve functie. Besteed aandacht aan rekenkundige uitbreiding en opdrachtvervanging.

V. Kostromin (kos bij rus-linux dot net) - 5.8. Shell als programmeertaal
  • zelfstudie

Waarom en voor wie is het artikel?

In eerste instantie was dit een herinnering voor studenten die beginnen te werken met Unix-achtige systemen. Met andere woorden, het artikel is bedoeld voor diegenen die geen eerdere ervaring hebben met de Unix-opdrachtregel, maar om de een of andere reden willen of moeten leren hoe ze er effectief mee kunnen werken.

Er zal geen hervertelling van manas (documentatie) zijn, en het artikel annuleert of vervangt het lezen ervan op geen enkele manier. In plaats daarvan zal ik het hebben over de belangrijkste dingen (commando's, trucs en principes) die je vanaf het allereerste begin van het werken in de unix-shell moet begrijpen om effectief en plezierig te werken.

Het artikel gaat over volwaardige unix-achtige omgevingen, met een volledige shell (bij voorkeur zsh of bash) en een redelijk breed scala aan standaardprogramma's.

Wat is schil

Shell (shell, ook wel "command line", ook wel CLI, ook wel "console", ook wel "terminal", ook wel "zwart venster met witte letters" genoemd) is een tekstinterface voor communicatie met het besturingssysteem (nou ja, strikt genomen programma, die zo'n interface biedt, maar nu is dit verschil niet significant).

Over het algemeen ziet het werken door de shell er als volgt uit: de gebruiker (d.w.z. jij) voert een commando in vanaf het toetsenbord, drukt op Enter, het systeem voert het commando uit, schrijft het resultaat van de uitvoering naar het scherm en wacht opnieuw op het volgende commando in te voeren.

Typische schelplook:

De shell is de belangrijkste manier om te communiceren met alle Unix-achtige serversystemen.

Waar worden opdrachtregelsystemen gevonden?

Waar een unix-shell op je kan wachten, populaire opties:
  • macOS (beuk);
  • externe toegang tot de server voor werk of voor een persoonlijk webproject;
  • home-bestandsserver met toegang op afstand;
  • Ubuntu, PC-BSD op laptop/desktop - Unix-achtige systemen zijn tegenwoordig eenvoudig te installeren en te gebruiken.

Welke taken zijn redelijk op te lossen met een shell?

Natuurlijke taken waarvoor de schaal geschikt, nuttig en onmisbaar is:
  • interactief werken in de terminal:
    • compileren, taken uitvoeren via make;
    • vergelijking van tekstbestanden;
    • snelle ad-hoc data-analyse (aantal unieke ips in de log, verdeling van records in uren/minuten, etc.);
    • eenmalige massale acties (veel processen uitschakelen; als u met een versiebeheersysteem werkt, een aantal bestanden ongedaan maken of oplossen);
    • diagnostiek van wat er in het systeem gebeurt (semaforen, vergrendelingen, processen, descriptors, schijfruimte, enz.);
  • scripten:
    • stel scripts in waarvan u niet op andere tolken kunt vertrouwen om ze uit te voeren - niet voor beginners;
    • functies voor het aanpassen van de interactieve shell (de prompt beïnvloeden, de map wijzigen, omgevingsvariabelen instellen) - ook niet helemaal voor beginners;
    • eenmalige scripts zoals het transcoderen van bulkbestanden;
    • makefiles.

Absoluut eerste stappen

Aan de slag: inloggen en uitloggen

Zorg ervoor dat u precies weet hoe u de shell moet starten en hoe u deze moet verlaten.

Als u zich op een computer bevindt waarop Ubuntu is geïnstalleerd, moet u het Terminal-programma starten. Aan het einde van het werk kunt u eenvoudig het raam sluiten.

Start op MacOS ook Terminal.

Om toegang te krijgen tot een externe server, gebruikt u ssh (als u MacOS, Ubuntu of een ander Unix-achtig systeem lokaal hebt) of putty (als u Windows hebt).

Wie ben ik, waar ben ik?

Voer de volgende opdrachten uit:
  • hostnaam - geeft de naam weer van de machine (server) waarop u zich momenteel bevindt;
  • whoami - toont uw login (uw naam in het systeem);
  • tree -d / |less - pseudografische afbeelding van de mappenboom op de machine; stoppen met scrollen - q ;
  • pwd - geeft de map weer waarin u zich momenteel bevindt; op de opdrachtregel kun je niet "zomaar" zijn, je bevindt je noodzakelijkerwijs in een map (=huidige map, werkmap). Waarschijnlijk wordt de huidige werkmap weergegeven in uw prompt (prompt).
  • ls - lijst met bestanden in de huidige map; ls /home - lijst met bestanden in de opgegeven map;

Opdrachtgeschiedenis (geschiedenis)

Een belangrijke eigenschap van een volwaardige opdrachtregel is de geschiedenis van opdrachten.

Voer een paar opdrachten uit: hostnaam, ls, pwd, whoami. Druk nu op de omhoog-toets. Het vorige commando verscheen in de invoerregel. De toetsen omhoog en omlaag kunnen worden gebruikt om vooruit en achteruit door de geschiedenis te bladeren. Wanneer u naar hostnaam scrolt, drukt u op Enter - de opdracht wordt opnieuw uitgevoerd.

Commando's uit de historie kunnen niet alleen opnieuw worden uitgevoerd, maar ook worden bewerkt. Blader door de geschiedenis naar het ls-commando, voeg de -l-toets eraan toe (het bleek ls -l , er is een spatie voor de min, maar niet erna). Druk op Enter - de gewijzigde opdracht wordt uitgevoerd.

Door de geschiedenis bladeren, opdrachten bewerken en opnieuw uitvoeren zijn de meest typische acties bij het werken in de opdrachtregel, wen er maar aan.

kopiëren plakken

De opdrachtregel is erg tekstgericht: opdrachten zijn tekst, de invoergegevens voor de meeste standaardprogramma's zijn tekst, het resultaat van het werk is meestal ook tekst.

Het leuke van tekst is dat het kan worden gekopieerd en geplakt, en dit geldt ook voor de opdrachtregel.

Probeer datum +"%y-%m-%d, %A" uit te voeren
Heb je het helemaal met de hand ingevoerd of overgenomen uit het artikel? Zorg ervoor dat je het kunt kopiëren, in de terminal kunt plakken en uitvoeren.

Nadat u hebt geleerd hoe u man " moet gebruiken, moet u ervoor zorgen dat u de voorbeeldopdrachten uit de help kunt kopiëren en uitvoeren. Om dit te controleren, kijkt u in de help voor het datumprogramma voor de sectie VOORBEELDEN, kopieert en voert u het eerste gegeven voorbeeld uit (alleen in geval: het dollarteken maakt geen deel uit van de opdracht, dit is een voorwaardelijke afbeelding van de invoerprompt).

Hoe u precies tekst van de terminal kopieert en in de terminal plakt, hangt af van uw systeem en de bijbehorende instellingen, dus helaas zal het niet werken om een ​​universele instructie te geven. Probeer dit op Ubuntu: kopiëren is slechts muisselectie, plakken is middelste muisknop. Als het niet werkt, of als je een ander systeem hebt, kijk dan op internet of vraag meer ervaren vrienden.

Toetsen en opties

Tijdens het onderzoeken van de commandogeschiedenis ben je al tegengekomen dat het ls-commando ten minste twee opties heeft. Als je het zo noemt, drukt het een eenvoudige lijst af:

[e-mail beveiligd]: ~/shell-survival-quide> ls Makefile shell-first-steps.md shell-first-steps.pdf shell-survival-quide.md shell-survival-quide.pdf
Als u de schakeloptie -l toevoegt, wordt voor elk bestand gedetailleerde informatie weergegeven:

[e-mail beveiligd]: ~/shell-survival-quide> ls -l totaal 332 -rw-rw-r-- 1 akira akira 198 feb 13 11:48 Makefile -rw-rw-r-- 1 akira akira 15107 feb 14 22:26 shell -first-steps.md -rw-rw-r-- 1 akira akira 146226 13 februari 11:49 shell-first-steps.pdf -rw-rw-r-- 1 akira akira 16626 13 februari 11:45 shell-survival -quide.md -rw-rw-r-- 1 akira akira 146203 13 februari 11:35 shell-survival-quide.pdf
Dit is een zeer typische situatie: als speciale modifiers (schakelaars, opties, parameters) worden toegevoegd aan de opdrachtoproep, verandert het gedrag van de opdracht. Vergelijk: tree / en tree -d / , hostname en hostname -f .

Bovendien kunnen opdrachten bestandsnamen, mappen of alleen tekenreeksen als parameters aannemen. Poging:

ls -ld /home ls -l /home grep root /etc/passwd

Mens

man - Help over de opdrachten en programma's die beschikbaar zijn op uw machine, evenals systeemoproepen en de C-standaardbibliotheek.

Probeer: man grep, man atoi, man chdir, man man.

Vooruit en achteruit scrollen doe je met de “up”, “down”, “PageUp”, “PageDown” knoppen, het verlaten van de helpweergave doe je met de q knop. Zoeken naar specifieke tekst in een helpartikel: druk op / (schuine streep naar voren), typ de zoektekst en druk op Enter. Ga naar volgende voorkomens - n-toets.

Alle helpartikelen zijn onderverdeeld in categorieën. Het belangrijkste:

  • 1 - uitvoerbare programma's en shell-commando's (wc , ls , pwd, etc.);
  • 2 - systeemoproepen (fork, dup2 enz.)
  • 3 - bibliotheekfuncties (printf, scanf, cos, exec).
Het is noodzakelijk om aan te geven uit welke categorie de hulp moet worden getoond in geval van samenvallen van namen. Man 3 printf beschrijft bijvoorbeeld een functie uit de C-standaardbibliotheek en man 1 printf beschrijft een consoleprogramma met dezelfde naam.

U kunt een lijst bekijken van alle helpartikelen die beschikbaar zijn op de machine met de opdracht man -k. (de stip maakt ook deel uit van het team).

minder

Wanneer een zeer lange tekst (de inhoud van een bestand, een lange man, enz.) in een klein terminalvenster moet worden bekeken, worden speciale "pager" -programma's gebruikt (van het woord pagina / pagina, dat wil zeggen paging). De meest populaire scroller is less , en dat zorgt ervoor dat je kunt scrollen als je aan het lezen bent.

Probeer en vergelijk gedrag:

cat /etc/bash.bashrc cat /etc/bash.bashrc |minder

U kunt het bestand onmiddellijk naar de scroller overbrengen in de parameters:

Minder /etc/bash.bashrc

Blader omhoog en omlaag - knoppen "omhoog", "omlaag", "PageUp", "PageDown", exit - knop q. Zoeken naar specifieke tekst: druk op / (schuine streep naar voren), voer de zoektekst in en druk op Enter. Ga naar volgende voorkomens - n-toets. (Herken je de instructie over de mens? Geen wonder, er wordt ook minder gebruikt om hulp te tonen.)

De rechten

Aan elk bestand of elke map is een set "rechten" gekoppeld: het recht om het bestand te lezen, het recht om naar het bestand te schrijven, het recht om het bestand uit te voeren. Alle gebruikers zijn onderverdeeld in drie categorieën: bestandseigenaar, groep bestandseigenaar, alle andere gebruikers.

U kunt bestandsrechten bekijken met ls -l . Bijvoorbeeld:

> ls -l Makefile -rw-r--r-- 1 akira studenten 198 feb 13 11:48 Makefile
Deze uitvoer betekent dat de eigenaar (akira) het bestand kan lezen en schrijven, de groep (studenten) kan alleen lezen en alle anderen in de gebruiker kunnen ook alleen lezen.

Als u tijdens het werken een bericht krijgt dat toestemming is geweigerd, betekent dit dat u niet genoeg machtigingen heeft voor het object waarmee u wilde werken.

Lees meer in man chmod.

STDIN, STDOUT, pijpleidingen (pijpen)

Aan elk uitvoerend programma zijn 3 standaard gegevensstromen gekoppeld: invoergegevensstroom STDIN , uitvoergegevensstroom STDOUT , foutstroom STDERR .

Voer het wc-programma uit, typ Goede dag vandaag, druk op Enter, typ goede dag, druk op Enter, druk op Ctrl+d. Het wc-programma toont statistieken over het aantal letters, woorden en regels in uw tekst en sluit af:

> wc goede dag vandaag goede dag 2 5 24
In dit geval gaf u het programma STDIN een tekst van twee regels en ontving u drie cijfers in STDOUT.

Voer nu het commando head -n3 /etc/passwd uit, het zou er ongeveer zo uit moeten zien:

> head -n3 /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin bin:x: 2:2:bin:/bin:/usr/sbin/nologin
In dit geval las het hoofdprogramma niets van STDIN, maar schreef het drie regels naar STDOUT.

Zie het zo: een programma is een pijp waar STDIN in stroomt en STDOUT uit.

De belangrijkste eigenschap van de Unix-commandoregel is dat "pipe"-programma's onderling gekoppeld kunnen worden: de output (STDOUT) van het ene programma kan als input (STDIN) worden doorgegeven aan een ander programma.

Zo'n constructie van verbonden programma's wordt in het Engels pipe (pipe) genoemd, in het Russisch - transportband of pipe.

Het combineren van programma's tot een pijplijn gebeurt met het symbool | (verticale balk)

Voer het commando head -n3 /etc/passwd |wc uit, je krijgt zoiets als dit:

> head -n3 /etc/passwd |wc 3 3 117
Dit is wat er gebeurde: het hoofdprogramma voerde drie regels tekst uit naar STDOUT, die onmiddellijk in de invoer van het wc-programma terechtkwamen, dat op zijn beurt het aantal tekens, woorden en regels in de ontvangen tekst telde.

U kunt zoveel programma's combineren als u wilt in een pijplijn. U kunt bijvoorbeeld een ander wc-programma toevoegen aan de vorige pijplijn, die zal tellen hoeveel woorden en letters er in de uitvoer van de eerste wc zaten:

> head -n3 /etc/passwd |wc |wc 1 3 24

Het compileren van pijplijnen (pipes) is heel gebruikelijk bij het werken op de opdrachtregel. Voor een voorbeeld van hoe dit in de praktijk wordt gedaan, zie de sectie Een éénlijnige pijplijn samenstellen.

I/O-omleiding

De uitvoer (STDOUT) van een programma kan niet alleen naar een ander programma worden doorgesluisd, maar kan eenvoudig naar een bestand worden geschreven. Deze omleiding gebeurt met > (groter dan teken):

Datum > /tmp/vandaag.txt
Als resultaat van het uitvoeren van deze opdracht zal het bestand /tmp/today.txt op de schijf verschijnen. Bekijk de inhoud met cat /tmp/today.txt

Als er al een bestand met dezelfde naam bestond, wordt de oude inhoud vernietigd. Als het bestand nog niet bestond, wordt het aangemaakt. De map waarin het bestand wordt gemaakt, moet bestaan ​​voordat de opdracht wordt uitgevoerd.

Als u het bestand niet wilt overschrijven, maar uitvoer aan het einde ervan wilt toevoegen, gebruikt u >> :

Datum >> /tmp/vandaag.txt
Controleer wat er nu in het bestand staat.

Bovendien kunt u elk bestand in plaats van STDIN doorgeven aan het programma. Poging:

wc

Wat te doen als iets niet duidelijk is

Als je systeemgedrag tegenkomt dat je niet begrijpt, of een bepaald resultaat wilt bereiken, maar niet weet hoe, raad ik je aan om in de volgende volgorde te werk te gaan (dit geldt trouwens niet alleen voor shells):
  • formuleer de vraag of taak zo duidelijk mogelijk - er is niets moeilijker dan het oplossen van "Ik weet niet wat";
  • onthoud of u hetzelfde of een soortgelijk probleem al bent tegengekomen - in dit geval is het de moeite waard om de oplossing te proberen die de vorige keer werkte;
  • lees de juiste man-s (als u begrijpt welke man-s in uw geval geschikt zijn) - u kunt geschikte voorbeelden vinden van het gebruik van commando's, noodzakelijke opties of links naar andere commando's;
  • denk er eens over na: is het mogelijk om de taak een beetje te veranderen? - misschien krijg je door de voorwaarden iets te veranderen een probleem waarvan je al weet hoe je het moet oplossen;
  • stel uw goed gedefinieerde vraag in een zoekmachine - misschien is het antwoord te vinden op Stack Overflow of andere sites;
Als niets van het bovenstaande heeft geholpen, vraag dan advies aan een leraar, een ervaren collega of vriend. En wees niet bang om "domme" vragen te stellen - het is geen schande om het niet te weten, het is een schande om het niet te vragen.

Als je een moeilijk probleem hebt opgelost (in je eentje, via internet of andere mensen), schrijf dan je oplossing op voor het geval jij of je kameraden weer hetzelfde probleem hebben. U kunt opnemen in een eenvoudig tekstbestand, in Evernote, publiceren op sociale netwerken.

Werkwijzen

Knippen en plakken- van man-s, van artikelen op StackOverflow, enz. De opdrachtregel bestaat uit tekst, gebruik dit: kopieer en gebruik opdrachtvoorbeelden, schrijf succesvolle vondsten op voor geheugen, publiceer ze op Twitter en blogs.

Haal de vorige opdracht uit de geschiedenis, voeg nog een opdracht toe aan de pijplijn, voer uit, herhaal.Cm. Zie ook het gedeelte "Een pijpleiding met één regel samenstellen".

Basiscommando's

  • map wijzigen: cd ;
  • de inhoud van bestanden bekijken: kat, minder, kop, staart;
  • bestandsmanipulatie: cp , mv , rm ;
  • directorylijst: ls , ls -l , ls -lS ;
  • directorystructuur: tree , tree -d (u kunt een directory doorgeven als parameter);
  • bestand zoeken: vind . -naam ... ;

Analyse

  • wc , wc -l ;
  • sorteer -k - sorteer op het opgegeven veld;
  • sorteer -n - numeriek sorteren;
  • diff - vergelijk bestanden;
  • grep , grep -v , grep -w , grep "\ ", grep -E - zoek naar tekst;
  • uniq , uniq -c - unieke strings;
  • awk - in de awk "(print $1)" variant, om alleen het eerste veld van elke regel over te laten, kan $1 veranderd worden in $2 , $3 , etc.;

Systeem diagnostiek

  • ps axuww - informatie over processen (lopende programma's) die op de machine draaien;
  • top - interactieve weergave van de meest resource-intensieve processen;
  • df - gebruikte en vrije schijfruimte;
  • du - totale grootte van bestanden in de map (recursief met submappen);
  • strace , ktrace - welke systeemaanroepen het proces aan het maken is;
  • lsof - welke bestanden het proces gebruikt;
  • netstat -na , netstat -nap - welke poorten en sockets zijn open op het systeem.

Mogelijk hebt u sommige programma's niet, deze moeten extra worden geïnstalleerd. Bovendien zijn sommige opties van deze programma's alleen beschikbaar voor bevoorrechte gebruikers (root "y").

Bulk- en semi-automatische uitvoering

Sla deze sectie in eerste instantie over, je hebt deze commando's en constructies nodig als je aan eenvoudige shell-scripting begint.
  • test - voorwaarden controleren;
  • while read-cycle through lines STDIN;
  • xargs - vervanging van strings van STDIN in de parameters van het gespecificeerde programma;
  • seq - generatie van reeksen natuurlijke getallen;
  • () - combineer de output van verschillende commando's;
  • ; - doe de een na de ander;
  • && - uitvoeren als de eerste opdracht succesvol is voltooid;
  • || - uitvoeren als het eerste commando mislukt;
  • tee - dupliceer programma-uitvoer naar STDOUT en naar een bestand op schijf.

Diversen

  • datum - huidige datum;
  • curl - downloadt het document op de gespecificeerde url en schrijft het resultaat naar STDOUT;
  • touch - wijzigingsdatum bestand bijwerken;
  • doden - stuur een signaal naar het proces;
  • waar - doet niets, retourneert waar, handig voor het organiseren van eeuwige lussen;
  • sudo - voer een commando uit als root "a.

Samenstellen van een one-liner pijplijn

Laten we eens kijken naar een voorbeeld van een echte taak: we willen alle taak-6-serverprocessen beëindigen die namens de huidige gebruiker worden uitgevoerd.

Stap 1.
Begrijp welk programma ongeveer de benodigde gegevens produceert, ook al is het niet in pure vorm. Voor onze taak is het de moeite waard om een ​​lijst te krijgen van alle processen in het systeem: ps axuww. Rennen.

Stap 2
Kijk met je ogen naar de ontvangen gegevens, bedenk een filter dat een deel van de onnodige gegevens weggooit. Vaak is dit grep of grep -v . Gebruik de "Omhoog" -toets om het vorige commando uit de geschiedenis te halen, er een verzonnen filter aan toe te wijzen en het uit te voeren.

Ps axuww |grep `whoami`
- alleen processen van de huidige gebruiker.

Stap 3
Herhaal stap 2 totdat u de gewenste schone gegevens krijgt.

"
- alle processen met de gewenste naam (plus misschien overbodige zoals vim task-6-server.c, etc.),

Ps axuww |grep `whoami` | grep "\ " | grep -v vim ps axuww |grep `whoami` | grep "\ " | grep -v vim | grep -v minder
- alleen processen met de gewenste naam

Ps axuww |grep `whoami` | grep "\ " | grep -v vim |grep -v less |awk "(print $2)"

Pids van de vereiste processen, stap 3 voltooid

Stap 4
Pas een geschikte laatste handler toe. Met behulp van de "Omhoog" -toets halen we de vorige opdracht uit de geschiedenis en voegen we verwerking toe die de oplossing van het probleem zal voltooien:

  • |wc -l om het aantal processen te tellen;
  • >pids om pids naar een bestand te schrijven;
  • |xargs kill -9 kill-processen.

Taken voor opleiding

Wil je nieuwe vaardigheden oefenen? Probeer de volgende taken:
  • krijg een lijst van alle bestanden en mappen in je thuismap;
  • krijg een lijst van alle man-artikelen uit categorie 2 (systeemoproepen);
  • tel hoe vaak het woord grep voorkomt in de grep man-pagina;
  • tellen hoeveel processen er momenteel als root draaien;
  • vinden welk commando voorkomt in het maximale aantal hulpcategorieën (man);
  • tel hoe vaak het woord var voorkomt op de ya.ru-pagina.
Hint: je hebt find , grep -o , awk "(print $1)" , reguliere expressies in grep , curl -s nodig.

Wat ga je hierna studeren?

Als je de opdrachtregel leuk begint te vinden, stop dan niet, blijf je vaardigheden verbeteren.

Hier zijn enkele programma's die zeker van pas zullen komen als u op de opdrachtregel woont:

  • vinden met complexe opties
  • ter zake
  • bevind zich
  • telnet
  • netkat
  • tcpdump
  • rsync
  • scherm
  • zgrep, zless
  • zien
  • crontab -e
  • Verzend mail
Het is ook de moeite waard om na verloop van tijd een scripttaal te leren, zoals perl of python, of zelfs beide.

Wie heeft het nodig?

Is het de moeite waard om vandaag de opdrachtregel en shell-scripting te leren? Zeker de moeite waard. Ik zal slechts enkele voorbeelden geven van de eisen die Facebook stelt aan kandidaten die bij FB willen werken.