Shell-basisprincipes. Basisprincipes van programmeren in de shell-opdrachtshell. Voordelen van de opdrachtregel

Wat is een schil en waarom is het nodig?

De opdrachtshell in elk Unix-achtig systeem, inclusief GNU/Linux, is dat wel regulier programma, zowel gelanceerd in een tekstconsole (die steeds minder wordt gebruikt) als in een grafische omgeving - in het venster van een terminalemulator, beschikbaar op elk Linux-systeem.

Zijn taak is eenvoudig en voor de hand liggend: een regel (of regels) met invoer accepteren, deze analyseren en, op basis van de resultaten van deze analyse, dienovereenkomstig reageren - een commando uitvoeren, een programma uitvoeren, een diagnostisch bericht weergeven, enz.

In bijna alle Linux-distributies krijgen gebruikers standaard de opdracht opdracht toegewezen. bash-schaal(Bourne Again SHell is een andere Bourne-shell; Steve Bourne is de auteur van de eerste opdrachtshell in Unix - sh). In feite is het een onofficiële standaard geworden, met verbeteringen eraan functionaliteit gaat continu door. Er zijn andere opdrachtshells - tcsh ( C-shell-versie), ksh (Korn Shell), zsh, enz. – elk heeft zijn eigen voor- en nadelen, evenals zijn eigen fangroepen. Bash is echter bekender bij een breed scala aan gebruikers met verschillende ervaringsniveaus, en daarom heb ik ervoor gekozen. Het is ook vermeldenswaard dat, ongeacht de capaciteiten van de verschillende granaten, ze allemaal compatibel zijn met hun ideologische voorloper: de Bourn Shell (sh). Met andere woorden, een script geschreven voor sh zal correct werken in elke moderne shell (het omgekeerde is over het algemeen niet waar).

Voordelen van de opdrachtregel

De vraag kan rijzen: waarom zou je je druk maken over de opdrachtregel als er handige en mooie grafische interfaces zijn? Daar zijn veel redenen voor. Ten eerste zijn niet alle bewerkingen handiger of sneller uit te voeren GUI. Ten tweede volgt elk programma het fundamentele principe van Unix-systemen: doe het duidelijk bepaald werk en doe het goed. Met andere woorden, u begrijpt altijd wat er gebeurt als u een bepaald hulpprogramma uitvoert (als iets niet helemaal duidelijk is, kunt u de manhandleiding raadplegen). Ten derde bestudeert de gebruiker, door commando's onder de knie te krijgen, de combinaties ervan en de combinaties van hun parameters uit te proberen, het systeem en verwerft waardevolle informatie. praktische ervaring. U krijgt toegang tot deze effectieve hulpmiddelen, zoals pijplijnen waarmee u een reeks opdrachten voor gegevensverwerking kunt organiseren, middelen om invoer/uitvoer om te leiden, en bovendien kunt u rechtstreeks programmeren in commandoshell. Misschien is het de moeite waard om dieper op programmeren in te gaan, vooral omdat veel systeemscripts in Linux (bijvoorbeeld scripts voor het starten van systeemservices) voor de shell zijn geschreven.

Commandshell als programmeertaal

De opdrachtshell kan dus worden beschouwd als een programmeertaal en als software-omgeving gelijktijdig uitvoeren. Natuurlijk is deze taal niet gecompileerd, maar geïnterpreteerd. Het maakt het gebruik van variabelen mogelijk: systeem of eigen. De volgorde van uitvoering van programmaopdrachten wordt gewijzigd met behulp van condition checking-constructies en het selecteren van de juiste optie: if-then-else en case. Met While-, until- en for-lussen kunt u repetitieve acties automatiseren. Het is mogelijk om groepen commando's te combineren in logische blokken. U kunt zelfs echte functies schrijven die er parameters aan doorgeven. Zo zijn alle tekens en kenmerken van een volwaardige programmeertaal beschikbaar. Laten we proberen hier dubbel voordeel uit te halen: naast het leren van de basisprincipes van programmeren, zullen we ons dagelijkse werk automatiseren.

Hallo, Wereld! Eenvoudig back-upsysteem

Over de noodzaak van regelmatig back-up Iedereen kent de gegevens, maar gebruikers hebben nooit genoeg tijd voor deze saaie operatie. De oplossing is simpel: organiseren automatische creatie reservekopieën. Dit zal onze eerste shell-programmeringstaak zijn.

#!/bin/bash # # Maak een back-up van mappen en bestanden uit de thuismap # Dit batchscript kan automatisch worden uitgevoerd met behulp van cron # cd $HOME if [ ! -d archives ] then mkdir archives fi cur_date=`date +%Y%m%d%H%M` if [ $# -eq 0 ] ; then tar czf archive$(cur_date).tar.gz projecten bin else tar czf archive$(cur_date).tar.gz $* fi if [ $? = 0] ; dan mv archive$(cur_date).tar.gz $HOME/archives echo "$cur_date – Back-up succesvol voltooid." else echo "$cur_date - FOUT tijdens back-up." fi

Elk opdrachtscript (script is een script, zoals opdrachtshellprogramma's worden genoemd) begint met een identificatieregel, waarin de opdrachtinterpreter expliciet wordt gespecificeerd, die het volledige pad ernaartoe aangeeft. Het volledige pad is een opeenvolgende lijst van alle mappen, beginnend bij de root, die moeten worden ingevoerd om bij het doelbestand te komen, en uiteraard de naam van dit bestand. Het vastleggen van het volledige pad is uiterst belangrijk om elk bestand in de bestandssysteemhiërarchie uniek te identificeren.

Er volgen vier regels commentaar. Zodra de shell het teken "#" tegenkomt, beschouwt hij alle daaropvolgende tekens als commentaar en negeert deze volledig tot het einde huidige lijn. Daarom kunt u een opmerking niet vanaf het allereerste begin van de regel starten, maar deze begeleiden met een of ander commando.

Na de opmerkingen is er een lege regel. Het betekent niets voor de opdrachtshell en er wordt geen actie ondernomen. In scenario's lege regels meestal ingevoegd om de programmacode gemakkelijker leesbaar te maken.

Eindelijk kwamen we bij het eerste “echte” team. Hiermee kunt u de map wijzigen (Change Directory), d.w.z. verplaats van de huidige map naar een andere map die als argument aan de opdracht is doorgegeven. In de meeste gevallen wordt de doelmap expliciet gespecificeerd, bijvoorbeeld cd /tmp of cd projecten, maar in ons geval wordt de vooraf gedefinieerde systeemvariabele HOME gebruikt - deze bevat het volledige pad naar de thuismap van de huidige gebruiker onder wiens naam de opdrachtscript wordt uitgevoerd. Dit elimineert de noodzaak om elke keer dat we van gebruiker wisselen codewijzigingen aan te brengen, omdat de opdracht iedereen terugstuurt naar hun persoonlijke directory. Het dollarteken "$" vóór de naam van een variabele betekent dat u de waarde in die variabele moet extraheren en deze op de opdrachtregel moet vervangen door de naam ervan. Er moet vooral worden opgemerkt dat in commando taal brievenbusschelpen zijn belangrijk, d.w.z. THUIS, Thuis en thuis zijn drie verschillende variabelen. In overleg, in brieven hoofdletter De namen van systeemvariabelen worden aangegeven: HOME, PATH, EDITOR, etc. Deze conventie verhindert niet dat gebruikers hun eigen variabelen met namen creëren hoofdletters, maar waarom zou je je leven ingewikkelder maken door algemeen aanvaarde normen en regels te overtreden? Het wordt ook niet aanbevolen om de waarden van systeemvariabelen te wijzigen, tenzij dit absoluut noodzakelijk is. Over het algemeen volgen we een eenvoudige regel: we gebruiken systeemvariabelen voor alleen-lezen doeleinden, en als we onze eigen variabelen nodig hebben, schrijven we de naam ervan in kleine letters.

Ons eerste bevel zou korter kunnen worden geschreven:

cd-~

Hier betekent het symbool "~" ook thuismap huidige gebruiker. Veteranen opdrachtregel nog bondiger uitgedrukt:

CD

Het idee is dat wanneer het cd-commando geen argument krijgt, het naar de homedirectory verandert.

Het volgende is het klassieke softwareontwerp voor het controleren van de omstandigheden en het nemen van de juiste beslissing. Algemeen schema is dit:

als<условие>Dan<одна или несколько команд>fi

Het laatste woord van het construct (indien in omgekeerde volgorde) fungeert als een haakje sluiten, d.w.z. grenzen van de lijst met opdrachten die worden uitgevoerd als de voorwaarde waar is. De aanwezigheid van fi is verplicht, zelfs als er maar één team op de lijst staat.

Om een ​​voorwaarde te controleren, wordt in de regel het testcommando of de alternatieve notatievorm tussen vierkante haken gebruikt. Met andere woorden, records

als [! -d archief ] if test ! -d archieven

absoluut gelijkwaardig. Ik geef de voorkeur aan vierkante haakjes omdat deze de grenzen van de geteste aandoening duidelijker definiëren. Zowel de rechter- als de linkerhaakjes moeten door spaties van de voorwaarde worden gescheiden.

De criteria voor het controleren van de voorwaarde worden bepaald door verschillende vlaggen. Het testcommando herkent een zeer grote lijst ervan. In ons voorbeeld wordt de vlag -d gebruikt, waarmee we kunnen controleren of de naam die na de vlag is opgegeven, overeenkomt met een map in de echte wereld. De volgende vlaggen worden het vaakst gebruikt bij het werken met bestanden:

F – bestaat het regulier bestand met een bepaalde naam;

R – of het opgegeven bestand het recht heeft om ervan te lezen;

W – of het opgegeven bestand het recht heeft om ernaar te schrijven;

X – of het opgegeven bestand het recht heeft om het uit te voeren;

S – of het opgegeven bestand een grootte heeft die niet nul is.

In ons geval wordt de voorwaarde voorafgegaan door uitroepteken, wat de werking van logische negatie aangeeft, dus de betekenis van de geteste voorwaarde wordt volledig tegengesteld. Laten we proberen de betekenis van deze opdrachten in gewoon Russisch op te schrijven:

als [! -d archieven ] Als de archiefmap niet bestaat (in huidige map), begin dan met het uitvoeren van het opdrachtblok: mkdir archives maak de archiefmap aan (in de huidige map) en voltooi het uitvoeren van het opdrachtblok.

Zoals je kunt zien, bleek alles niet zo ingewikkeld te zijn. Met een beetje oefening kun je soortgelijke ontwerpen gemakkelijk zelf lezen en maken. Het commando voor het maken van een map is zo voor de hand liggend dat er geen verdere uitleg nodig is.

Op de volgende regel maken we onze eigen lokale variabele, cur_date. In de overgrote meerderheid van de gevallen worden variabelen gecreëerd door simpelweg een specifieke waarde toe te kennen, bijvoorbeeld:

ten=10 string="Dit is een regel tekst"

Maar in ons voorbeeld wordt een kleine truc gebruikt. Houd er rekening mee dat na het gelijkteken - het toewijzingssymbool - de opdracht tussen aanhalingstekens wordt geschreven. Met deze vorm van notatie kunt u aan een variabele niet de string zelf toewijzen, maar het resultaat van de uitvoering ervan. Hier is de uitvoer van het datumcommando dat terugkeert huidige datum en tijd in een formaat dat wordt gedefinieerd door een lijst met parameters:

%Y – huidig ​​jaar in volledige vorm, d.w.z. uit vier cijfers (bijvoorbeeld 2009);

%m – nummer van de huidige maand (bijvoorbeeld 09 – voor september);

%d – huidig ​​dagnummer;

%H - huidig ​​uur in 24-uursformaat;

%M – huidige minuut.

Dus als u de opdracht uitvoert

cur_date=`datum +%Y%m%d%H%M`

op 10 september 2009 om 22:45 uur krijgt de variabele cur_date de stringwaarde "200909102245" toegewezen. Het doel van deze truc is om een ​​unieke, niet-herhalende naam voor het archiefbestand te creëren. Als u van plan bent om binnen één minuut meerdere exemplaren van het programma uit te voeren, kunt u het unieke karakter van de namen verbeteren door de huidige seconden toe te voegen. Hoe? Bestudeer de handleiding van het datumhulpprogramma (man date) - er is niets ingewikkelds aan.

Voordat we beginnen met het maken van een archiefbestand, moeten we bepalen welke mappen we daarin gaan opslaan. Voor meer flexibiliteit kunnen we een set mappen opgeven die standaard moeten worden gearchiveerd, maar we bieden ook de mogelijkheid om deze set te vervangen door een lijst met mappen die als argument aan ons opdrachtscript worden doorgegeven. Voor dit doel worden speciale commandoshell-variabelen gebruikt: $# – het aantal parameters dat aan het script wordt doorgegeven en $* – alle doorgegeven parameters, geschreven in één regelformaat.

als [ $# -eq 0 ] ; Dan

Controleer de voorwaarde “als het aantal doorgegeven parameters nul is” en voer vervolgens het volgende commando uit. Merk op dat het trefwoord then op de voorwaarderegel kan worden geschreven, gescheiden van de voorwaardelijke expressie door een puntkomma.

tar czf archive$(cur_date).tar.gz projectenbak

De opdracht om een ​​archiefbestand te maken en dit bestand te comprimeren. Het tar-hulpprogramma zelf voert geen compressie uit, maar verzamelt alleen alles gespecificeerde bestanden en mappen in één enkel tar-bestand. Hiervoor is de eerste vlag bedoeld: c (create). Compressie wordt uitgevoerd door een extern programma - hier is het gzip, aangeroepen door de tweede vlag - z. Als uw systeem meer dan effectief programma bzip2-compressie kunt u hiervan profiteren door de opdracht als volgt te wijzigen:

tar cjf archive$(cur_date).tar.bz2 projectenbak

De derde vlag f geeft aan dat wat volgt de naam is van het archiefbestand, dus dit is altijd de laatste in de lijst met vlaggen. Houd er rekening mee dat bij het vervangen de naam van de variabele wordt ingesloten beugel. Dit wordt gedaan om de variabele expliciet te markeren op de lijn eromheen, waardoor veel potentiële problemen worden geëlimineerd. Extensies archief bestand worden niet automatisch toegewezen; je vult alles wat je nodig hebt zelf in. Ik heb projecten en bin gespecificeerd als de standaardmappen om te archiveren, maar je kunt hier de namen van je meest waardevolle mappen opschrijven.

Het sleutelwoord else opent een alternatieve uitvoeringstak. De commando's van dit blok beginnen te werken als de conditiecontrole het resultaat 'false' retourneert (in ons voorbeeld: 'het aantal doorgegeven parameters is niet nul', d.w.z. de door de gebruiker opgegeven mapnamen). In dit geval ziet het commando er als volgt uit:

tar czf archief$(cur_date).tar.gz $*

Hier worden de standaardmappen vervangen door een mapnaamreeks die extern wordt geaccepteerd. Het is mogelijk om ze allemaal te accepteren en te verwerken externe parameter afzonderlijk, maar het is handiger voor ons om de hele reeks door te geven.

Aan het einde van het programma wordt nog een controle uitgevoerd. In Unix-omgevingen retourneren alle opdrachten een voltooiingsstatuscode. Als de opdracht succesvol was, retourneert deze code 0, anders is de afsluitcode niet nul. Om het succes van het vorige archiveringscommando te controleren, zullen we een andere speciale variabele $? gebruiken, die altijd de waarde van de voltooiingscode van het meest recente commando bevat. Als in de variabele $? bevat 0, d.w.z. Het back-upbestand is met succes gemaakt en vervolgens verplaatsen we het naar de archiefmap:

mv archief$(cur_date).tar.gz $HOME/archives

en geef het bijbehorende bericht weer:

echo "$cur_date – Back-up succesvol voltooid."

Als uit de controle blijkt dat de voltooiingscode van de archiveringsactie niet nul is, wordt een foutmelding weergegeven:

echo "$cur_date - FOUT tijdens back-up."

Hiermee is ons opdrachtscript voltooid.

Om de werking van ons programma te controleren, dient u het bovenstaande op te slaan broncode in een bestand met de naam bckp, bijvoorbeeld, en maak het vervolgens voor het gemak uitvoerbaar:

chmod 750 bckp

en rennen:

./bcp

om een ​​back-up te maken van de standaardmappen, en

./bckp docs progs werkt

om een ​​reservekopie te maken van de genoemde mappen (geef de namen op van de mappen die daadwerkelijk op uw systeem aanwezig zijn, anders ontvangt u een foutmelding).

U kunt het bckp-bestand in een van de mappen plaatsen die zijn opgegeven in de systeemPATH-variabele. De meest geprefereerde locaties zijn /usr/local/bin of $HOME/bin als je die hebt. Hierna kunt u bckp als systeemopdracht uitvoeren.

Hoe u geplande back-upbewerkingen kunt automatiseren

Een paar woorden over back-upautomatisering. Voor dit doel dient het systeem cron-planner, die werkinstructies uit een speciaal crontabbestand leest. Om dergelijke instructies te definiëren, moet u uw crontab-bestand maken en bewerken met behulp van de opdracht:

crontab-e

Instructies zijn geschreven in een strikt gedefinieerd formaat (velden worden gescheiden door spaties):

minuten uren dag_van_maand maand dag_van_week opdracht

Eén optie voor het plannen van back-upbewerkingen kan er als volgt uitzien:

30 23 10,20,30 * * /usr/local/bin/bckp

Dit betekent dat het back-upscript (u moet het volledige pad naar dit bestand opgeven) op de 10e, 20e en 30e van elke maand om 23:30 uur wordt uitgevoerd, ongeacht de dag van de week. (Asterisken geven het gehele toegestane bereik van waarden aan, in dit geval: elke maand - in het 4e veld, elke dag van de week - in het 5e veld)

Houdt u uw resultaten liever per week bij en draait uw systeem 24 uur per dag, dan is het verstandig om back-ups tijdens kantooruren te plannen. minimale belasting:

0 5 * * 3,5 /usr/local/bin/bckp

Hier back-ups wordt elke maand om 5:00 uur aangemaakt op woensdag en vrijdag (sterretje in het 4e veld), ongeacht de datum (sterretje in het 3e veld).

Je kunt alle fijne kneepjes van planning lezen in de man 5 crontab-handleiding.

Resultaten en conclusies

Het back-upscript dat in dit artikel wordt besproken, heeft bescheiden functionele eigenschappen. Maar dat was niet zijn punt hoofdtaak, maar zodat de lezer begrijpt wat er op de opdrachtregel kan worden gedaan, en niet alleen het voorgestelde kopieert en uitvoert batchbestand, en raakte geïnteresseerd in het uitbreiden van de functies ervan, en begon onderzoek te doen naar de immense mogelijkheden die commandoshells bieden. En als iemand, na het lezen van dit artikel, de hier gegeven code probeert te verbeteren, of zijn eigen versie schrijft, of zijn eigen onafhankelijke idee implementeert, dan zal ik van mening zijn dat het hoofddoel is bereikt.

Bronnen om te downloaden

static.content.url=http://www.site/developerworks/js/artrating/

ArtikelID=458335

ArticleTitle=Basisprincipes van commandocommando's schelp

  • Handleiding

Waarom en voor wie is het artikel?

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

Er zal geen hervertelling van mana (documentatie) plaatsvinden, en het artikel annuleert of vervangt op geen enkele manier het lezen ervan. In plaats daarvan zal ik het hebben over de belangrijkste zaken (commando's, technieken en principes) die je vanaf het allereerste begin moet begrijpen als je gaat werken in Unix-shell zodat het werk efficiënt en prettig verloopt.

Het artikel gaat over volwaardige unix-achtige omgevingen, met een volledig functionele shell (bij voorkeur zsh of bash) en een vrij breed scala aan standaard programma's.

Wat is schaal

Shell (shell, ook bekend als "opdrachtregel", ook bekend als CLI, ook bekend als "console", ook bekend als "terminal", ook bekend als "zwart venster met witte letters") is een tekstinterface voor communicatie met het besturingssysteem (nou ja, strikt genomen bedoel ik dit is programma, dat een dergelijke interface biedt, maar nu is dit verschil onbeduidend).

Over het algemeen ziet het werken via een shell er als volgt uit: de gebruiker (dat wil zeggen jij) voert een commando in via 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 ingevoerd worden.

Typisch uitzicht schella:

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

Waar worden opdrachtregelsystemen gevonden?

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

Welke problemen zijn redelijkerwijs op te lossen met een shell?

Natuurlijke taken waarvoor de schelp geschikt, nuttig en onmisbaar is:
  • interactief werken in de terminal:
    • compilatie uitvoeren, opdrachten uitvoeren via make;
    • vergelijking van tekstbestanden;
    • snelle ad-hoc data-analyse (aantal unieke IP’s in het log, verdeling van records per uren/minuten, etc.);
    • eenmalige massa-acties (het beëindigen van veel processen; als u met een versiebeheersysteem werkt, kunt u een aantal bestanden ongedaan maken of oplossen);
    • diagnostiek van wat er in het systeem gebeurt (semaforen, vergrendelingen, processen, descriptors, schijfruimte, enz.);
  • scripting:
    • installatiescripts, waarvoor u niet kunt vertrouwen op de aanwezigheid van andere tolken - dit is niet voor beginners;
    • functies voor het aanpassen van de interactieve shell (van invloed op de uitnodiging, het wijzigen van de directory, setting omgevingsvariabelen) - ook niet echt voor beginners;
    • eenmalige scripts zoals massale bestandshercodering;
    • maakbestanden.

Absoluut eerste stappen

Laten we aan de slag gaan: meld u aan en meld u af

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

Als u op een machine werkt waarop Ubuntu is geïnstalleerd, moet u het Terminal-programma starten. Wanneer u klaar bent, kunt u eenvoudig het venster sluiten.

Op MacOS: start ook Terminal.

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

Wie ben ik, waar ben ik?

Voer de volgende opdrachten uit:
  • hostnaam - toont de naam van de machine (server) waarop u zich momenteel bevindt;
  • whoami - toont uw login (uw naam in het systeem);
  • tree -d / |less - pseudo-grafische weergave van de directorystructuur 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 moet je in een map bevinden (=huidige map, werkmap). De huidige werkmap wordt waarschijnlijk weergegeven in uw prompt.
  • ls - lijst met bestanden in de huidige map; ls /home - lijst met bestanden in de opgegeven map;

Commandogeschiedenis (geschiedenis)

Een belangrijke eigenschap van een volwaardige opdrachtregel is de opdrachtgeschiedenis.

Voer verschillende opdrachten uit: hostnaam, ls, pwd, whoami. Druk nu op de omhoog-toets. Het vorige commando verschijnt in de invoerregel. U kunt de toetsen omhoog en omlaag gebruiken om vooruit en achteruit door de geschiedenis te bladeren. Wanneer u bij de hostnaam komt, drukt u op Enter - de opdracht wordt opnieuw uitgevoerd.

Commando's uit de geschiedenis kunnen niet alleen herhaaldelijk worden uitgevoerd, maar ook worden bewerkt. Blader door de geschiedenis naar het ls-commando, voeg de schakelaar -l eraan toe (het blijkt ls -l , er staat een spatie vóór 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 voorkomende handelingen bij het werken op de opdrachtregel, dus wen er maar aan.

Kopieer en plak

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

Het mooie van tekst is dat deze kan worden gekopieerd en geplakt, en dit geldt ook op de opdrachtregel.

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

Als je eenmaal hebt geleerd hoe je man moet gebruiken, zorg er dan voor dat je voorbeeldopdrachten uit de help kunt kopiëren en uitvoeren. Om dit te controleren, zoek je de sectie VOORBEELDEN in de help van het datumprogramma, kopieer en voer het eerste gegeven voorbeeld uit (voor het geval dat: de. dollarteken maakt geen deel uit van de opdracht, dit is een symbolische afbeelding van een invoerprompt).

Hoe u precies tekst uit de terminal kopieert en in de terminal plakt, hangt af van uw systeem en de instellingen ervan, dus geef op universele instructies, helaas, het zal niet werken. Probeer dit op Ubuntu: kopiëren - selecteer gewoon met de muis, plak - met de middelste muisknop. Als het niet werkt, of als je een ander systeem hebt, kijk dan op internet of vraag het aan meer ervaren vrienden.

Sleutels en opties

Terwijl je de geschiedenis van opdrachten hebt verkend, ben je al tegengekomen dat de opdracht ls minstens twee opties heeft. Als je het zo noemt, wordt er een eenvoudige lijst weergegeven:

Akira@latitude-e7240: ~/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:

Akira@latitude-e7240: ~/shell-survival-quide> ls -l totaal 332 -rw-rw-r-- 1 akira akira 198 13 februari 11:48 Makefile -rw-rw-r-- 1 akira akira 15107 februari 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 erg typische situatie: als speciale modifiers (toetsen, opties, parameters) aan de opdrachtaanroep worden toegevoegd, verandert het gedrag van de opdracht. Vergelijk: tree / en tree -d / , hostnaam en hostnaam -f .

Bovendien kunnen opdrachten bestandsnamen, mapnamen of gewoonweg namen aannemen tekstreeksen. Poging:

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

man

man - Hulp bij de opdrachten en programma's die beschikbaar zijn op uw machine, evenals systeemoproepen en de standaard C-bibliotheek.

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

Vooruit en achteruit scrollen doe je met de knoppen “omhoog”, “omlaag”, “PageUp”, “PageDown” en het verlaten van de helpweergave gebeurt met de knop q; Zoeken naar specifieke tekst in een Help-artikel: druk op / (schuine streep naar voren), voer de tekst in om te zoeken en druk op Enter. Ga naar volgende gebeurtenissen - toets n.

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

  • 1 - uitvoerbare programma's en shell-opdrachten (wc, ls, pwd, enz.);
  • 2 - systeemoproepen(vork, dup2, enz.)
  • 3 - bibliotheekfuncties (printf, scanf, cos, exec).
Het is noodzakelijk om aan te geven uit welke categorie het certificaat moet worden getoond in geval van samenvallende namen. Man 3 printf beschrijft bijvoorbeeld de functie van standaard bibliotheek C, en man 1 printf - consoleprogramma met dezelfde naam.

U kunt een lijst bekijken met alle Help-artikelen die op uw computer beschikbaar zijn met behulp van de opdracht man -k. (de punt maakt ook deel uit van de komada).

minder

Wanneer binnen klein raam de terminal moet heel veel bekeken worden lange tekst(de inhoud van een bestand, een lange man, enz.), ze gebruiken speciale "pager" -programma's (van het woord pagina, dat wil zeggen paginaflippers). De meest populaire scroller is minder, en deze zorgt ervoor dat je kunt scrollen als je manpagina's leest.

Probeer het gedrag te vergelijken:

Cat /etc/bash.bashrc cat /etc/bash.bashrc |less

U kunt het bestand rechtstreeks naar de pager overbrengen in de parameters:

Minder /etc/bash.bashrc

Omhoog en omlaag scrollen - knoppen "omhoog", "omlaag", "PageUp", "PageDown", afsluiten - knop q. Zoeken naar specifieke tekst: druk op / (schuine streep naar voren), voer de tekst in waarnaar u wilt zoeken en druk op Enter. Ga naar volgende gebeurtenissen - toets n. (Herkent u de instructies over de mens? Geen wonder, er wordt ook minder gebruikt om hulp te tonen.)

Rechten

Elk bestand of map is gekoppeld aan een reeks “rechten”: 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, bestandseigenaargroep en alle andere gebruikers.

U kunt bestandsrechten bekijken met ls -l . Bijvoorbeeld:

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

Als u tijdens het werken de melding toestemming geweigerd krijgt, betekent dit dat u niet voldoende rechten heeft op het object waarmee u wilde werken.

Lees meer in man chmod.

STDIN, STDOUT, transportbanden (buizen)

Bij elk lopend programma horen er 3 standaard stroom gegevens: invoergegevensstroom STDIN, uitvoergegevensstroom STDOUT, foutuitvoerstroom STDERR.

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

> wc goede dag vandaag goede dag 2 5 24
In dit geval hebt u een tekst van twee regels aan de STDIN van het programma toegevoegd en drie cijfers ontvangen 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.

Je kunt het je zo voorstellen: het programma is een pijp waarin STDIN stroomt en STDOUT eruit stroomt.

De belangrijkste eigenschap van de Unix-opdrachtregel is dat “pipe”-programma’s met elkaar kunnen worden verbonden: de uitvoer (STDOUT) van het ene programma kan als invoergegevens (STDIN) worden doorgegeven aan een ander programma.

Deze constructie van verbonden programma's wordt in het Engels een pijp genoemd, of in het Russisch een transportband of pijp.

Het combineren van programma's in een pipeline doe je met het symbool | (verticale balk)

Voer het commando head -n3 /etc/passwd |wc uit, het zal er ongeveer zo uitzien:

> hoofd -n3 /etc/passwd |wc 3 3 117
Wat er gebeurde is dat het hoofdprogramma drie regels tekst naar STDOUT uitvoerde, die onmiddellijk naar de invoer van het wc-programma gingen, dat op zijn beurt het aantal tekens, woorden en regels in de resulterende tekst telde.

U kunt zoveel programma's als u wilt combineren in een pijplijn. U kunt bijvoorbeeld nog een wc-programma aan de vorige pijplijn toevoegen, dat telt hoeveel woorden en letters er in de uitvoer van de eerste wc stonden:

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

Het maken van pijpleidingen (pipes) is een veel voorkomende taak bij het werken op de opdrachtregel. Voor een voorbeeld van hoe dit in de praktijk gebeurt, leest u de paragraaf ‘Een éénlijns pijplijn creëren’.

I/O-omleiding

De uitvoer (STDOUT) van een programma kan niet alleen via een pipeline naar een ander programma worden overgedragen, maar ook eenvoudigweg 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 ervan met cat /tmp/today.txt

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

Als u een bestand niet wilt overschrijven, maar liever 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 doorgeven aan het programma in plaats van STDIN. Poging:

WC

Wat te doen als iets onduidelijk is

Mocht je systeemgedrag tegenkomen dat je niet begrijpt, of een bepaald resultaat wilt bereiken, maar niet weet hoe, dan raad ik je aan om in de volgende volgorde te werk te gaan (dit geldt overigens niet alleen voor shells):
  • Formuleer de vraag of taak zo duidelijk mogelijk - er is niets moeilijker dan het oplossen van “iets waarvan ik niet weet 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 manpagina's (als u begrijpt welke manpagina's in uw geval geschikt zijn) - misschien vindt u geschikte voorbeelden van het gebruik van commando's, de noodzakelijke opties of links naar andere commando's;
  • denk na: is het mogelijk om de taak een beetje te veranderen? - misschien krijg je, door de omstandigheden enigszins te veranderen, een probleem waarvan je al weet hoe je het moet oplossen;
  • stel je duidelijk geformuleerde vraag in een zoekmachine - wellicht is het antwoord te vinden op Stack Overflow of andere sites;
Als niets van het bovenstaande helpt, 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 zonde om het niet te vragen.

Als u een moeilijk probleem oplost (zelf, met behulp van internet of andere mensen), noteer dan uw oplossing voor het geval hetzelfde probleem zich opnieuw voordoet voor u of uw vrienden. Je kunt het opnemen in een eenvoudig tekstbestand, in Evernote, of publiceren op sociale netwerken.

Werkwijzen

Kopiëren en plakken- van manpagina's, van artikelen op StackOverflow, enz. De opdrachtregel bestaat uit tekst, doe hier uw voordeel mee: kopieer en gebruik voorbeeldopdrachten, noteer succesvolle bevindingen als aandenken, publiceer ze op Twitter en blogs.

Haal de vorige opdracht uit de geschiedenis, voeg nog een opdracht toe aan de pijplijn, voer uit en herhaal.Cm. Zie ook de paragraaf “Een one-liner pijplijn creëren”.

Basiscommando's

  • ga naar een andere map: cd ;
  • de inhoud van bestanden bekijken: kat, minder, kop, staart;
  • bestandsmanipulatie: cp, mv, rm;
  • mapinhoud bekijken: ls , ls -l , ls -lS ;
  • mapstructuur: tree , tree -d (map kan als parameter worden doorgegeven);
  • bestanden zoeken: vind . -naam ... ;

Analyses

  • wc, wc -l;
  • sort -k - sorteer op het opgegeven veld;
  • sort -n - numerieke sortering;
  • diff - bestandsvergelijking;
  • grep, grep -v, grep -w, grep "\ ", grep -E - zoeken naar tekst;
  • uniq , uniq -c - string-uniqisatie;
  • awk - in de awk "(print $1)" optie, om alleen het eerste veld van elke regel over te laten, kan $1 worden gewijzigd in $2, $3, enz.;

Systeemdiagnostiek

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

Mogelijk beschikt u niet over bepaalde programma's; deze moeten extra worden geïnstalleerd. Bovendien zijn sommige opties van deze programma's alleen beschikbaar voor bevoorrechte gebruikers (root).

Bulk- en semi-automatische uitvoering

Sla dit gedeelte in eerste instantie over; u zult deze opdrachten en constructies nodig hebben als u met eenvoudige shell-scripting aan de slag gaat.
  • test - controlevoorwaarden;
  • terwijl u regel voor regel STDIN leest;
  • xargs - vervanging van strings van STDIN in parameters van het opgegeven programma;
  • seq - generatie van reeksen natuurlijke getallen;
  • () - combineer de uitvoer van verschillende opdrachten;
  • ; - doe het ene na het andere;
  • && - uitvoeren als de eerste opdracht succesvol is voltooid;
  • || - uitvoeren als het eerste commando mislukt;
  • tee - dupliceer de programma-uitvoer naar STDOUT en naar een bestand op schijf.

Gemengd

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

Het creëren van een one-liner pijplijn

Laten we eens kijken naar een voorbeeld van een echte taak: we moeten alle taak-6-server-processen beëindigen die als 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. Launch.

Stap 2.
Bekijk de ontvangen gegevens met je ogen, bedenk een filter dat een deel van de onnodige gegevens weggooit. Dit is vaak grep of grep -v . Gebruik de toets "Omhoog" om het vorige commando uit de geschiedenis te halen, wijs er een uitgevonden filter aan toe en voer het uit.

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

Stap 3.
Herhaal stap 2 totdat u de schone gegevens krijgt die u nodig hebt.

"
- alle processen met de vereiste naam (plus misschien extra processen zoals vim task-6-server.c, enz.),

Ps axuww |grep `whoami` | grep "\ " | grep -v vim ps axuww |grep `whoami` | grep "\ " | grep -v vim |grep -v minder
- verwerkt alleen de vereiste naam

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

PID's van de benodigde processen, stap 3 voltooid

Stap 4.
Pas een geschikte eindbehandelaar toe. Met behulp van de toets "Omhoog" halen we het vorige commando uit de geschiedenis en voegen we een verwerking toe die de oplossing voor 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.

Trainingstaken

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

Wat moet je verder studeren?

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

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

  • vinden met complexe opties
  • apropos
  • lokaliseren
  • telnet
  • netkat
  • tcpdump
  • rsync
  • scherm
  • zgrep, zless
  • visudo
  • crontab-e
  • stuur een e-mail
Bovendien is het na verloop van tijd de moeite waard om een ​​soort scripttaal onder de knie te krijgen, bijvoorbeeld perl of python, of zelfs beide.

Wie heeft dit nodig?

Is het zelfs de moeite waard om vandaag de dag de opdrachtregel en shell-scripting te leren? Zeker de moeite waard. Ik zal slechts een paar voorbeelden geven van de eisen die Facebook stelt aan kandidaten die een baan bij FB willen krijgen.
  • Handleiding

Waarom en voor wie is het artikel?

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

Er zal geen hervertelling van mana (documentatie) plaatsvinden, en het artikel annuleert of vervangt op geen enkele manier het lezen ervan. In plaats daarvan zal ik het hebben over de belangrijkste dingen (opdrachten, technieken en principes) die je vanaf het allereerste begin moet begrijpen als je in de Unix-shell werkt, zodat het werk effectief en plezierig kan zijn.

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

Wat is schaal

Shell (shell, ook bekend als "opdrachtregel", ook bekend als CLI, ook bekend als "console", ook bekend als "terminal", ook bekend als "zwart venster met witte letters") is een tekstinterface voor communicatie met het besturingssysteem (nou ja, strikt genomen bedoel ik dit is programma, dat een dergelijke interface biedt, maar nu is dit verschil onbeduidend).

Over het algemeen ziet het werken via een shell er als volgt uit: de gebruiker (dat wil zeggen jij) voert een commando in via 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 ingevoerd worden.

Typisch schaaltype:

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

Waar worden opdrachtregelsystemen gevonden?

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

Welke problemen zijn redelijkerwijs op te lossen met een shell?

Natuurlijke taken waarvoor de schelp geschikt, nuttig en onmisbaar is:
  • interactief werken in de terminal:
    • compilatie uitvoeren, opdrachten uitvoeren via make;
    • vergelijking van tekstbestanden;
    • snelle ad-hoc data-analyse (aantal unieke IP’s in het log, verdeling van records per uren/minuten, etc.);
    • eenmalige massa-acties (het beëindigen van veel processen; als u met een versiebeheersysteem werkt, kunt u een aantal bestanden ongedaan maken of oplossen);
    • diagnostiek van wat er in het systeem gebeurt (semaforen, vergrendelingen, processen, descriptors, schijfruimte, enz.);
  • scripting:
    • installatiescripts, waarvoor u niet kunt vertrouwen op de aanwezigheid van andere tolken - dit is niet voor beginners;
    • functies voor het aanpassen van de interactieve shell (van invloed op de uitnodiging, het wijzigen van de directory, het instellen van omgevingsvariabelen) - ook niet helemaal voor beginners;
    • eenmalige scripts zoals massale bestandshercodering;
    • maakbestanden.

Absoluut eerste stappen

Laten we aan de slag gaan: meld u aan en meld u af

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

Als u op een machine werkt waarop Ubuntu is geïnstalleerd, moet u het Terminal-programma starten. Wanneer u klaar bent, kunt u eenvoudig het venster sluiten.

Op MacOS: start ook Terminal.

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

Wie ben ik, waar ben ik?

Voer de volgende opdrachten uit:
  • hostnaam - toont de naam van de machine (server) waarop u zich momenteel bevindt;
  • whoami - toont uw login (uw naam in het systeem);
  • tree -d / |less - pseudo-grafische weergave van de directorystructuur 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 moet je in een map bevinden (=huidige map, werkmap). De huidige werkmap wordt waarschijnlijk weergegeven in uw prompt.
  • ls - lijst met bestanden in de huidige map; ls /home - lijst met bestanden in de opgegeven map;

Commandogeschiedenis (geschiedenis)

Een belangrijke eigenschap van een volwaardige opdrachtregel is de opdrachtgeschiedenis.

Voer verschillende opdrachten uit: hostnaam, ls, pwd, whoami. Druk nu op de omhoog-toets. Het vorige commando verschijnt in de invoerregel. U kunt de toetsen omhoog en omlaag gebruiken om vooruit en achteruit door de geschiedenis te bladeren. Wanneer u bij de hostnaam komt, drukt u op Enter - de opdracht wordt opnieuw uitgevoerd.

Commando's uit de geschiedenis kunnen niet alleen herhaaldelijk worden uitgevoerd, maar ook worden bewerkt. Blader door de geschiedenis naar het ls-commando, voeg de schakelaar -l eraan toe (het blijkt ls -l , er staat een spatie vóór 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 voorkomende handelingen bij het werken op de opdrachtregel, dus wen er maar aan.

Kopieer en plak

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

Het mooie van tekst is dat deze kan worden gekopieerd en geplakt, en dit geldt ook op de opdrachtregel.

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

Als je eenmaal hebt geleerd hoe je man moet gebruiken, zorg er dan voor dat je voorbeeldopdrachten uit de help kunt kopiëren en uitvoeren. Om dit te controleren, zoek je de sectie VOORBEELDEN in de help van het datumprogramma, kopieer en voer het eerste gegeven voorbeeld uit (voor het geval dat: de. dollarteken maakt geen deel uit van de opdracht, dit is een symbolische afbeelding van een invoerprompt).

Hoe u precies tekst uit de terminal kopieert en in de terminal plakt, hangt af van uw systeem en de instellingen ervan, dus het is helaas niet mogelijk om universele instructies te geven. Probeer dit op Ubuntu: kopiëren - selecteer gewoon met de muis, plak - met de middelste muisknop. Als het niet werkt, of als je een ander systeem hebt, kijk dan op internet of vraag het aan meer ervaren vrienden.

Sleutels en opties

Terwijl je de geschiedenis van opdrachten hebt verkend, ben je al tegengekomen dat de opdracht ls minstens twee opties heeft. Als je het zo noemt, wordt er een eenvoudige lijst weergegeven:

Akira@latitude-e7240: ~/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:

Akira@latitude-e7240: ~/shell-survival-quide> ls -l totaal 332 -rw-rw-r-- 1 akira akira 198 13 februari 11:48 Makefile -rw-rw-r-- 1 akira akira 15107 februari 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 heel typische situatie: als u speciale modifiers (toetsen, opties, parameters) aan een opdrachtaanroep toevoegt, verandert het gedrag van de opdracht. Vergelijk: tree / en tree -d / , hostnaam en hostnaam -f .

Bovendien kunnen opdrachten bestandsnamen, mapnamen of eenvoudigweg tekstreeksen als parameters aannemen. Poging:

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

man

man - Hulp bij de opdrachten en programma's die beschikbaar zijn op uw machine, evenals systeemoproepen en de standaard C-bibliotheek.

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

Vooruit en achteruit scrollen doe je met de knoppen “omhoog”, “omlaag”, “PageUp”, “PageDown” en het verlaten van de helpweergave gebeurt met de knop q; Zoeken naar specifieke tekst in een Help-artikel: druk op / (schuine streep naar voren), voer de tekst in om te zoeken en druk op Enter. Ga naar volgende gebeurtenissen - toets n.

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

  • 1 - uitvoerbare programma's en shell-opdrachten (wc, ls, pwd, enz.);
  • 2 - systeemoproepen (fork, dup2, enz.)
  • 3 - bibliotheekfuncties (printf, scanf, cos, exec).
Het is noodzakelijk om aan te geven uit welke categorie het certificaat moet worden getoond in geval van samenvallende 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 met alle Help-artikelen die op uw computer beschikbaar zijn met behulp van de opdracht man -k. (de punt maakt ook deel uit van de komada).

minder

Wanneer u zeer lange tekst in een klein terminalvenster moet bekijken (de inhoud van een bestand, een lange man, enz.), Worden speciale "pager" -programma's gebruikt (van het woord pagina, dat wil zeggen paginaflippers). De meest populaire scroller is minder, en deze zorgt ervoor dat je kunt scrollen als je manpagina's leest.

Probeer het gedrag te vergelijken:

Cat /etc/bash.bashrc cat /etc/bash.bashrc |less

U kunt het bestand rechtstreeks naar de pager overbrengen in de parameters:

Minder /etc/bash.bashrc

Omhoog en omlaag scrollen - knoppen "omhoog", "omlaag", "PageUp", "PageDown", afsluiten - knop q. Zoeken naar specifieke tekst: druk op / (schuine streep naar voren), voer de tekst in waarnaar u wilt zoeken en druk op Enter. Ga naar volgende gebeurtenissen - toets n. (Herkent u de instructies over de mens? Geen wonder, er wordt ook minder gebruikt om hulp te tonen.)

Rechten

Elk bestand of map is gekoppeld aan een reeks “rechten”: 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, bestandseigenaargroep en alle andere gebruikers.

U kunt bestandsrechten bekijken met ls -l . Bijvoorbeeld:

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

Als u tijdens het werken de melding toestemming geweigerd krijgt, betekent dit dat u niet voldoende rechten heeft op het object waarmee u wilde werken.

Lees meer in man chmod.

STDIN, STDOUT, transportbanden (buizen)

Er zijn 3 standaard datastromen geassocieerd met elk uitvoerend programma: invoergegevensstroom STDIN, uitvoergegevensstroom STDOUT, foutuitvoerstroom STDERR.

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

> wc goede dag vandaag goede dag 2 5 24
In dit geval hebt u een tekst van twee regels aan de STDIN van het programma toegevoegd en drie cijfers ontvangen 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.

Je kunt het je zo voorstellen: het programma is een pijp waarin STDIN stroomt en STDOUT eruit stroomt.

De belangrijkste eigenschap van de Unix-opdrachtregel is dat “pipe”-programma’s met elkaar kunnen worden verbonden: de uitvoer (STDOUT) van het ene programma kan als invoergegevens (STDIN) worden doorgegeven aan een ander programma.

Deze constructie van verbonden programma's wordt in het Engels een pijp genoemd, of in het Russisch een transportband of pijp.

Het combineren van programma's in een pipeline doe je met het symbool | (verticale balk)

Voer het commando head -n3 /etc/passwd |wc uit, het zal er ongeveer zo uitzien:

> hoofd -n3 /etc/passwd |wc 3 3 117
Wat er gebeurde is dat het hoofdprogramma drie regels tekst naar STDOUT uitvoerde, die onmiddellijk naar de invoer van het wc-programma gingen, dat op zijn beurt het aantal tekens, woorden en regels in de resulterende tekst telde.

U kunt zoveel programma's als u wilt combineren in een pijplijn. U kunt bijvoorbeeld nog een wc-programma aan de vorige pijplijn toevoegen, dat telt hoeveel woorden en letters er in de uitvoer van de eerste wc stonden:

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

Het maken van pijpleidingen (pipes) is een veel voorkomende taak bij het werken op de opdrachtregel. Voor een voorbeeld van hoe dit in de praktijk gebeurt, leest u de paragraaf ‘Een éénlijns pijplijn creëren’.

I/O-omleiding

De uitvoer (STDOUT) van een programma kan niet alleen via een pipeline naar een ander programma worden overgedragen, maar ook eenvoudigweg 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 ervan met cat /tmp/today.txt

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

Als u een bestand niet wilt overschrijven, maar liever 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 doorgeven aan het programma in plaats van STDIN. Poging:

WC

Wat te doen als iets onduidelijk is

Mocht je systeemgedrag tegenkomen dat je niet begrijpt, of een bepaald resultaat wilt bereiken, maar niet weet hoe, dan raad ik je aan om in de volgende volgorde te werk te gaan (dit geldt overigens niet alleen voor shells):
  • Formuleer de vraag of taak zo duidelijk mogelijk - er is niets moeilijker dan het oplossen van “iets waarvan ik niet weet 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 manpagina's (als u begrijpt welke manpagina's in uw geval geschikt zijn) - misschien vindt u geschikte voorbeelden van het gebruik van commando's, de noodzakelijke opties of links naar andere commando's;
  • denk na: is het mogelijk om de taak een beetje te veranderen? - misschien krijg je, door de omstandigheden enigszins te veranderen, een probleem waarvan je al weet hoe je het moet oplossen;
  • stel je duidelijk geformuleerde vraag in een zoekmachine - wellicht is het antwoord te vinden op Stack Overflow of andere sites;
Als niets van het bovenstaande helpt, 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 zonde om het niet te vragen.

Als u een moeilijk probleem oplost (zelf, met behulp van internet of andere mensen), noteer dan uw oplossing voor het geval hetzelfde probleem zich opnieuw voordoet voor u of uw vrienden. Je kunt het opnemen in een eenvoudig tekstbestand, in Evernote, of publiceren op sociale netwerken.

Werkwijzen

Kopiëren en plakken- van manpagina's, van artikelen op StackOverflow, enz. De opdrachtregel bestaat uit tekst, doe hier uw voordeel mee: kopieer en gebruik voorbeeldopdrachten, noteer succesvolle bevindingen als aandenken, publiceer ze op Twitter en blogs.

Haal de vorige opdracht uit de geschiedenis, voeg nog een opdracht toe aan de pijplijn, voer uit en herhaal.Cm. Zie ook de paragraaf “Een one-liner pijplijn creëren”.

Basiscommando's

  • ga naar een andere map: cd ;
  • de inhoud van bestanden bekijken: kat, minder, kop, staart;
  • bestandsmanipulatie: cp, mv, rm;
  • mapinhoud bekijken: ls , ls -l , ls -lS ;
  • mapstructuur: tree , tree -d (map kan als parameter worden doorgegeven);
  • bestanden zoeken: vind . -naam ... ;

Analyses

  • wc, wc -l;
  • sort -k - sorteer op het opgegeven veld;
  • sort -n - numerieke sortering;
  • diff - bestandsvergelijking;
  • grep, grep -v, grep -w, grep "\ ", grep -E - zoeken naar tekst;
  • uniq , uniq -c - string-uniqisatie;
  • awk - in de awk "(print $1)" optie, om alleen het eerste veld van elke regel over te laten, kan $1 worden gewijzigd in $2, $3, enz.;

Systeemdiagnostiek

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

Mogelijk beschikt u niet over bepaalde programma's; deze moeten extra worden geïnstalleerd. Bovendien zijn sommige opties van deze programma's alleen beschikbaar voor bevoorrechte gebruikers (root).

Bulk- en semi-automatische uitvoering

Sla dit gedeelte in eerste instantie over; u zult deze opdrachten en constructies nodig hebben als u met eenvoudige shell-scripting aan de slag gaat.
  • test - controlevoorwaarden;
  • terwijl u regel voor regel STDIN leest;
  • xargs - vervanging van strings van STDIN in parameters van het opgegeven programma;
  • seq - generatie van reeksen natuurlijke getallen;
  • () - combineer de uitvoer van verschillende opdrachten;
  • ; - doe het ene na het andere;
  • && - uitvoeren als de eerste opdracht succesvol is voltooid;
  • || - uitvoeren als het eerste commando mislukt;
  • tee - dupliceer de programma-uitvoer naar STDOUT en naar een bestand op schijf.

Gemengd

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

Het creëren van een one-liner pijplijn

Laten we eens kijken naar een voorbeeld van een echte taak: we moeten alle taak-6-server-processen beëindigen die als 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. Launch.

Stap 2.
Bekijk de ontvangen gegevens met je ogen, bedenk een filter dat een deel van de onnodige gegevens weggooit. Dit is vaak grep of grep -v . Gebruik de toets "Omhoog" om het vorige commando uit de geschiedenis te halen, wijs er een uitgevonden filter aan toe en voer het uit.

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

Stap 3.
Herhaal stap 2 totdat u de schone gegevens krijgt die u nodig hebt.

"
- alle processen met de vereiste naam (plus misschien extra processen zoals vim task-6-server.c, enz.),

Ps axuww |grep `whoami` | grep "\ " | grep -v vim ps axuww |grep `whoami` | grep "\ " | grep -v vim |grep -v minder
- verwerkt alleen de vereiste naam

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

PID's van de benodigde processen, stap 3 voltooid

Stap 4.
Pas een geschikte eindbehandelaar toe. Met behulp van de toets "Omhoog" halen we het vorige commando uit de geschiedenis en voegen we een verwerking toe die de oplossing voor 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.

Trainingstaken

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

Wat moet je verder studeren?

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

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

  • vinden met complexe opties
  • apropos
  • lokaliseren
  • telnet
  • netkat
  • tcpdump
  • rsync
  • scherm
  • zgrep, zless
  • visudo
  • crontab-e
  • stuur een e-mail
Bovendien is het na verloop van tijd de moeite waard om een ​​soort scripttaal onder de knie te krijgen, bijvoorbeeld perl of python, of zelfs beide.

Wie heeft dit nodig?

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

Elk universeel besturingssysteem moet veel sleutelen aan de gebruiker en zijn eigen taken. Slechts een klein deel van deze activiteit kan voor eens en altijd in de kernel worden geprogrammeerd. Het grootste deel van de logica voor het beheren van taken en het systeem zelf moet beschikbaar zijn voor de beheerder in de vorm van een project, anders zal hij eenvoudigweg niet kunnen begrijpen wat er in het systeem gebeurt, laat staan ​​het veranderen. Het is de moeite waard om eens nader te kijken naar de tool die in UNIX wordt gebruikt om het algoritme voor veel delen van het systeem in te stellen: de commando tolk, schelp . Het blijkt dat de shell niet alleen goed presteert in dialoog met de gebruiker, maar ook in de manier waarop script uitvoerder, en hoe manier om interactie te organiseren tussen taken in het systeem.

Laten we beginnen met het feit dat de schaal volwaardig is programmeertaal, en, zoals veel tolken, van een redelijk hoog niveau. Als de taak eenmalig is (er zijn geen vereisten voor snelheid, compatibiliteit en draagbaarheid) en vrij abstract is (er is geen verband met een specifieke complexe datastructuur), kan deze hoogstwaarschijnlijk worden opgelost, het schrijven van een opdrachtscript- shell-programma.

Aan de andere kant kan men zich bij het oplossen van problemen in een systeem niet beperken tot algoritmische volledigheid. De Turing-machine [9] is bijvoorbeeld uiterst eenvoudig en algoritmisch compleet, maar weinigen zouden eraan denken een dialoog met de gebruiker te organiseren of het besturingssysteem zelf te besturen op basis van zijn model. Hier moet aan worden herinnerd dat de shell ook een opdrachtuitvoerder is: hij communiceert gemakkelijk met UNIX en hulpprogramma's. Dit betekent dat we, door het aan te vullen met een mechanisme voor gecontroleerde interactie van commando's met het systeem en met elkaar, een goede integrator (of shell - wat in feite de vertaling is van het woord schelp).

Het beste is dat een dergelijke programmeerbare schil niet te ver buiten het bereik van Y zal gaan: als we, als erfenis van de interactieve incarnatie van de schil, gemakkelijk kunnen overgaan tot de oplossing van de subtaak om elk UNIX-hulpprogramma, het is absoluut niet nodig om het in de taal te dupliceren, en alleen algoritmische en coördinatieabstracties zullen daar blijven.

Scenario

Voordat we de mogelijkheden van de shell vanuit twee invalshoeken bekijken, moeten we eerst dit probleem oplossen. Laten we zeggen dat we een programma hebben geschreven in de taal van een of andere tolk, bijvoorbeeld /bin/sh, en dit naar een bepaald bestand hebben geschreven, bijvoorbeeld /home/george/myscript (als /home/george de huidige map is, kun je gebruiken een korter pad: myscript). Hoe kan ik dit script nu uitvoeren? Van man sh weten we dat we hiervoor kunnen vluchten commando tolk met de parameter - bestandsnaam:

$ cat myscript echo "Hallo, George!" $ /bin/sh mijnscript Hallo, George!

Is het mogelijk om de naam te missen van het programma dat het script interpreteert? Over het algemeen niet: UNIX heeft veel verschillende tolken met verschillende syntaxis, bijvoorbeeld de tekstverwerker akelig, streamen teksteditor sed, universeel programmeertalen Python en Perl en nog veel meer. Al deze talen hebben de mogelijkheid om regelcommentaar in de scripttekst in te voegen, die begint met het teken "#" en eindigt aan het einde van de regel. Als een script begint met "#!", negeert een van deze tolken daarom de gehele eerste regel als commentaar. Het systeem ziet "#!" aan het begin van het bestand begrijpt dat dit een script is. Vanaf het derde teken tot het einde van de regel leest het de naam van het programma waarnaar het dit bestand stuurt voor uitvoering. Dit betekent dat als de eerste regel in /home/george/myscript #!/bin/sh is, je deze veilig uitvoerbaar kunt maken (de use-bit instellen) en deze kunt uitvoeren:

$ chmod +x mijnscript $ cat mijnscript #!/bin/sh echo "Hallo, $1!" $ ./myscript George Hallo, George!

Strikt genomen, na "#!" het kan van alles zijn, bijvoorbeeld de naam van het programma dat we hebben geschreven met enkele vereiste parameters; UNIX zal het starten en eraan doorgeven als opdrachtregelopties vereiste parameters (indien aanwezig), vervolgens de naam van het script en alles wat daarna komt (in ons voorbeeld George ). Als na "#!" er zal een niet-bestaand bestand zijn, het systeem zal het uitgeven foutmelding:

$ cat myscript #!/bad/sh echo "Hallo, $1!" $ ./mijnscript ./mijnscript: niet gevonden

Houd er rekening mee dat dit bericht vermoedelijk impliceert dat het scriptbestand zelf niet is gevonden. Als je de achtergrond van het fenomeen niet kent, lijkt de situatie verdacht. Het is een feit dat bij het uitvoeren van een programma UNIX Altijd geeft er één parameter door (die index 0 heeft) - de naam van dit programma. Maar als het script wordt uitgevoerd, ontvangt de handler als nulparameter niet zijn eigen naam, maar de naam van het script. En wanneer het systeem deze handler niet vindt, wordt deze onder een nieuwe naam in de foutmelding vermeld.

Schelpennesten

En nog een belangrijke opmerking. Aanvankelijk was er slechts één in UNIX commando tolk, geschreven door Stephen Bourne, en het heette simpelweg “shell” (d.w.z. shell, en de naam van het hulpprogramma is kortweg sh). Het was een heel eenvoudig programmaatje, het werkte perfect als systeemintegrator, maar in alle andere opzichten was het nogal zwak. En zo kwam het bij de makers van 3BSD op dat ze een compleet nieuw systeem nodig hadden commando tolk, handiger bij het werken op de opdrachtregel, met nieuwe programmeermogelijkheden en een nieuwe syntaxis die dicht bij de C-taal ligt, die al bekend is bij elke UNIX-programmeur. De resulterende shell heette C-shell (vanwege de commandosyntaxis; de naam van het hulpprogramma is csh), het was veel krachtiger dan de oude, het omvatte het werken met geschiedenis, het invullen van bestandsnamen, taakbeheer; arrays en nog veel meer verschenen.

De shell-programmeertaal heeft verschillende constructies die uw programma's flexibiliteit geven:

  • Met commentaren kunt u de functies van het programma beschrijven;
  • Met "here document" kunt u regels in de shell van het programma opnemen die zullen worden omgeleid als invoer voor enkele van de shell-opdrachten van het programma;
  • met het exit-commando kunt u het programma op het gewenste punt beëindigen en return-codes gebruiken;
  • Met de for- en while-lusconstructies kunt u een groep opdrachten in een lus herhalen;
  • voorwaardelijke opdrachten if en case voeren een groep opdrachten uit als aan een bepaalde voorwaarde is voldaan;
  • Met het break-commando kunt u een lus onvoorwaardelijk verlaten.

9.3.1. Opmerkingen

Om commentaar in het programma te plaatsen, gebruikt u het #-teken. Als er na een opdracht een #-teken verschijnt, wordt de opdracht zelf uitgevoerd en wordt de opmerking genegeerd. Opmaak van commentaarregel:

#opmerking

9.3.2. "Hier document"

Met "Here document" kunt u regels in een shell-programma plaatsen die worden omgeleid als opdrachtinvoer in dat programma. Dit is een manier om invoer te geven voor een commando in een shell-programma zonder een apart bestand te gebruiken. De invoer bestaat uit een omleidingsteken<< и разделителя, который указывает начало и конец строк ввода. В качестве разделителя может использоваться один символ или строка символов. Чаще всего это знак!.

Het opdrachtformaat is als volgt:

Commando<...invoerregels... scheidingsteken

9.3.3. Gebruik ed in een shell-programma

"Here document" suggereert een manier om ed in een shell-programma te gebruiken. Stel dat u een shell-programma wilt maken dat de ed-editor aanroept, globale wijzigingen in een bestand aanbrengt, de wijzigingen in het bestand schrijft en vervolgens ed afsluit. Het volgende scherm toont de inhoud van het ch.text-programma dat deze taken uitvoert:

$ cat ch.text echo Typ de bestandsnaam read file1 echo Typ de exacte tekst die moet worden gewijzigd.<

lees oude_tekst echo Typ de exacte nieuwe tekst om het bovenstaande te vervangen.

lees new_text ed - $file1

Let op het - (minteken) in de opdracht ed. Deze optie voorkomt dat de tekenteller op het scherm wordt afgedrukt. Let ook op het formaat van het ed-commando voor globale vervanging:
G/$oude_tekst/s//$nieuwe_tekst/g
Het programma gebruikt 3 variabelen: file1, old_text, new_text. Wanneer dit programma wordt uitgevoerd, gebruikt het de leesopdracht om de waarden van deze variabelen te verkrijgen. Deze variabelen bevatten de volgende informatie:
bestand - naam van het bestand dat zal worden bewerkt;

oude_tekst - tekst die zal worden gewijzigd;

nieuwe_tekst - nieuwe tekst. Variabelen worden in het programma geïntroduceerd, hier stuurt het document de globale vervangingsopdracht, schrijfopdracht en end-opdracht om naar de ed-opdracht. Voer het ch.text-programma uit. Krijg het volgende scherm: $ch.text Typ de bestandsnaammemo Typ de exacte tekst die u wilt wijzigen. Beste Jan: $

Typ de exacte nieuwe tekst in om bovenstaande te vervangen.

Waar het om gaat:

$ kattenmemo

Waar het om gaat:

9.3.4. Voltooiingscodes

De meeste shell-opdrachten retourneren codes die aangeven of de opdracht met succes is voltooid. Als de retourwaarde 0 (nul) is, is de opdracht met succes voltooid. Returncodes worden niet automatisch afgedrukt, maar kunnen worden verkregen als de waarde van de speciale shell $?

9.3.4.1. Voltooiingscodes controleren

Nadat u een opdracht interactief hebt uitgevoerd, kunt u de afsluitcode zien wanneer u typt: Beschouw het volgende voorbeeld:

$ cat hallo Dit is bestand hallo.

$echo$?

0 $ cat hallo cat: kan hello $ echo $ niet openen?

$ 2

Voor variabel in een_lijst_van_waarden Doen commando_1 commando_2 . .

.

laatste opdracht

klaar

Voor elke iteratie van de lus wordt het volgende element van de lijst toegewezen aan de variabele die is opgegeven in de for-instructie. Er kan overal in opdrachten binnen een do-instructie naar deze variabele worden verwezen. Bij het samenstellen van elke sectie met opdrachten moet u ervoor zorgen dat er voor elke actie een corresponderende actie wordt uitgevoerd aan het einde van de lus.

De variabele kan elke naam hebben. Als uw variabele bijvoorbeeld var heet, zal een verwijzing naar $var in de opdrachtenlijst de waarde beschikbaar maken. Als de operator in wordt weggelaten, zal de waarde voor var de set argumenten zijn die in de opdracht is gespecificeerd en die beschikbaar zijn in de speciale parameter $*. De lijst met opdrachten tussen de trefwoorden do en done wordt voor elke waarde uitgevoerd. Wanneer de opdrachten voor het laatste element van de lijst worden uitgevoerd, voert het programma de onderstaande regel uit. 9.3.5.2. terwijl verklaring

Exploitant

terwijl lus commando_1 . Doen commando_1 . .

gebruikt 2 groepen commando's. Het zal de reeks opdrachten in de tweede groep (de do ... done-lijst) uitvoeren totdat het laatste commando in de eerste groep (de while-lijst) waar retourneert, wat betekent dat de uitdrukking na de do kan worden uitgevoerd.

Het algemene formaat van de while-lusinstructie is: Terwijl

Het programma enter.name gebruikt bijvoorbeeld een while-lus om een ​​lijst met namen in een bestand in te voeren. Het programma bestaat uit de volgende opdrachtregels:

Het algemene formaat van de while-lusinstructie is: $ cat enter.naam terwijl je x leest, echo $x>>xfile done $<^d>Na enkele toevoegingen krijgen we het volgende programma:

echo Typ de naam van elke persoon in en vervolgens een

echo Sluit de lijst met namen af ​​met een

while read x do echo $x>>xfile done echo xfile bevat de volgende namen: cat xfile $ Merk op dat nadat de lus is voltooid, het programma de onderstaande opdrachten uitvoert. De eerste twee echo-opdrachten gebruiken speciale tekens, dus u moet aanhalingstekens gebruiken om aan de speciale betekenis te ontsnappen. Het volgende scherm toont de uitvoer van enter.name:<^d>$enter.naam Typ de naam van elke persoon in en vervolgens een <^d>Sluit de lijst met namen af ​​met een

Maria Lou

Janice

xfile bevat de volgende namen: Mary Lou Janice $

Nadat de lus is voltooid, drukt het programma alle namen in het x-bestand af.

9.3.6. Gebruik /dev/null

9.3.7. Voorwaardelijke uitspraken

als...dan verklaring

Het if-commando vertelt het shell-programma om de reeks commando's daarna uit te voeren als het laatste commando in de lijst met commando's van de if-instructie met succes is voltooid. Als constructies eindigen met het fi-trefwoord.

Het algemene formaat van de if-constructie is:

Als commando_1 . Dan commando_1 . fi

Het zoekshellprogramma demonstreert bijvoorbeeld het gebruik van de if ... then-constructie. Het zoekprogramma gebruikt het grep-commando om naar een woord in een bestand te zoeken. Als grep succesvol is, geeft het programma het gevonden woord weer. Het scherm ziet er als volgt uit:

$ katten zoeken echo Typ het woord en de bestandsnaam.

lees word-bestand als grep $word $file dan echo $word in $file fi $ zit

Dit programma geeft de uitvoer van het grep-commando weer. Als je de reactie van het systeem op de grep-opdracht in je programma wilt opslaan, gebruik dan het bestand /dev/null, waarbij je de if-opdrachtregel als volgt wijzigt:

Als grep $word $file > /dev/null

Voer nu de zoekopdracht uit. Het zal alleen reageren met het bericht dat is opgegeven na het echo-commando.

Als commando_1 . De if ... then ... else-constructie kan een alternatieve reeks opdrachten uitvoeren na de else als de if-reeks onwaar is. Het formaat van deze constructie is als volgt: commando_1 . .linten commando_1 . fi

anders

$ katten zoeken Met deze constructie kunt u het zoekprogramma verbeteren, zodat het u zowel het gevonden als het niet gevonden woord vertelt. In dit geval ziet het zoekprogramma er als volgt uit:

echo Typ het woord en de bestandsnaam.

lees word-bestand als grep $word $file > /dev/null dan echo $word in $file anders zit echo $word NIET in $file fi $

opdracht testen Het testcommando wordt gebruikt om een ​​lus te organiseren. Het test bepaalde voorwaarden op waarheid en is nuttig voor het organiseren van voorwaardelijke constructies. Als de voorwaarde waar is, wordt de lus voortgezet. Als de voorwaarde onwaar is, eindigt de lus en wordt het volgende commando uitgevoerd. Enkele voorbeelden van het gebruik van het testcommando: Test -r-bestand true als het bestand bestaat en leesbaar is; test -w bestand true als het bestand bestaat en beschrijfbaar is; test -x bestand

Voorbeeld. Laten we een shell-programma maken dat alle uitvoerbare bestanden van de huidige map naar uw bin-map verplaatst. Om dit te doen, gebruiken we de opdracht test -x om uitvoerbare bestanden te selecteren. Het mv.file-programma ziet er als volgt uit:

$ cat mv.bestand echo type in het mappad leespad voor bestand do if test -x $file then mv $file $path/$file fi done $

Met de case ... esac-constructie kunt u een van de verschillende patronen selecteren en vervolgens een lijst met opdrachten voor dat patroon uitvoeren. De patroonexpressie moet beginnen met het trefwoord in en er moet een haakje rechts achter het laatste teken van elk patroon worden geplaatst. De reeks opdrachten voor elk patroon eindigt met twee tekens;;. De case-constructie moet worden afgesloten met het sleutelwoord esac.

Het algemene formaat van de casusconstructie is:

Casuswoord in patroon1) opdrachtregel 1 . ;;. opdrachtregel 1 . ;;laatste opdrachtregel opdrachtregel 1 . ;; *)opdrachtregel 1 . ;;patroon2)

.

.

laatste opdrachtregel

patroon3)

esac

De casusconstructie probeert een woord te vinden met het patroonpatroon in de eerste patroonsectie. Als de zoekopdracht succesvol is, voert het programma de opdrachtregels uit na het eerste patroon tot aan de overeenkomstige tekens;;.

Als het eerste sjabloon niet wordt gevonden, wordt de overgang naar het tweede sjabloon uitgevoerd. Als er een patroon wordt gevonden, houdt het programma geen rekening met de resterende patronen, maar gaat het verder met de opdracht die volgt op esac. De * wordt gebruikt als patroon om naar een willekeurig woord te zoeken en geeft u dus een reeks opdrachten die worden uitgevoerd als er geen ander patroon wordt gevonden. Daarom wordt het asterisk (*)-patroon als laatste patroon in de casusconstructie geplaatst, zodat de andere patronen eerst worden gecontroleerd. Dit zal u helpen onjuiste en onverwachte invoer te detecteren. Sjablonen kunnen metatekens *, ?, . Dit biedt programmaflexibiliteit.

Laten we eens kijken naar een voorbeeld. Het set.term-programma stelt de TERM-variabele in op basis van het type terminal dat u gebruikt. De volgende opdrachtregel wordt gebruikt:

Het break-commando stopt onvoorwaardelijk de uitvoering van elke lus waarin het wordt aangetroffen en geeft de controle door aan het commando na de sleutelwoorden done, fi of esac.

In het vorige voorbeeld set.term programma kon je het break commando gebruiken in plaats van echo om het programma af te sluiten, zoals in het volgende voorbeeld:

Als het eerste sjabloon niet wordt gevonden, wordt de overgang naar het tweede sjabloon uitgevoerd. Als er een patroon wordt gevonden, houdt het programma geen rekening met de resterende patronen, maar gaat het verder met de opdracht die volgt op esac. De * wordt gebruikt als patroon om naar een willekeurig woord te zoeken en geeft u dus een reeks opdrachten die worden uitgevoerd als er geen ander patroon wordt gevonden. Daarom wordt het asterisk (*)-patroon als laatste patroon in de casusconstructie geplaatst, zodat de andere patronen eerst worden gecontroleerd. Dit zal u helpen onjuiste en onverwachte invoer te detecteren. echo Als je een TTY 4420 hebt, typ dan 4420 echo Als je een TTY 5410 hebt, typ dan 5410 echo Als je een TTY 5420 hebt, typ dan 5420, lees term case term in 4420) TERM-T4 ;;

5410) TERM-T5;;