Basisprincipes van programmeren in de shell-opdrachtshell. Shell-talen (sh, bash, ksh en andere)

Zoals hierboven vermeld, is het voor het bouwen van willekeurige algoritmen noodzakelijk om operatoren voor conditiecontrole te hebben. Schelp bashen ondersteunt selectieverklaringen alsDananders en geval, evenals lusoperatoren voor,terwijl, tot, waardoor het verandert in krachtige taal programmeren.

5.8.1 Operatoren als En test(of )

Ontwerp voorwaardelijke operator in enigszins vereenvoudigde vorm ziet het er als volgt uit:

als lijst1 dan lijst2 anders lijst3 fi

Waar lijst1, lijst2 en lijst3 zijn reeksen opdrachten, gescheiden door komma's en eindigend met een puntkomma of een nieuwregelteken. Bovendien kunnen deze reeksen worden ingesloten beugel: (lijst).

Exploitant als controleert de waarde die wordt geretourneerd door opdrachten van lijst1. Als er meerdere opdrachten in deze lijst staan, wordt de waarde gecontroleerd die door het laatste commando in de lijst wordt geretourneerd. Als deze waarde 0 is, dan commando's van lijst2; als deze waarde niet nul is, worden de opdrachten van lijst3. De waarde die door een dergelijke samengestelde operator wordt geretourneerd als, is hetzelfde als de waarde die wordt geproduceerd door het laatste commando van de uitgevoerde reeks.

Volledig opdrachtformaat als heeft de vorm:

if lijst dan lijst [ elif lijst dan lijst ] ... [ else lijst ] fi

(hier betekenen de vierkante haakjes alleen dat wat daarin staat, niet noodzakelijkerwijs aanwezig is in de operator).

Als een uitdrukking die onmiddellijk daarna komt als of elif, een veelgebruikt commando test, wat ook kan worden aangegeven met vierkante haken. Team test evalueert een bepaalde uitdrukking en retourneert 0 als de uitdrukking waar is, en anders 1. De expressie wordt doorgegeven aan het programma test als argument. In plaats van schrijven

testuitdrukking,

U kunt de uitdrukking tussen vierkante haakjes plaatsen:

[uitdrukking].

Houd er rekening mee dat test en [ zijn twee namen van hetzelfde programma, en niet een of andere magische conversie uitgevoerd door de shell bashen(alleen voor de syntaxis [ moet een haakje sluiten worden opgenomen). Merk ook op dat in plaats van test qua ontwerp als elk programma kan worden gebruikt.

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

if [ -e tekstmode2.htm ] ; Dan

ls tekstmodus*

anders

pwd

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

5.8.2 Exploitant test en voorwaardelijk

Voorwaardelijke expressies die in de instructie worden gebruikt test, zijn gebaseerd op verificatie bestandskenmerken, tekenreeksvergelijkingen en gewone rekenkundige vergelijkingen. Complexe uitdrukkingen zijn opgebouwd uit de volgende unaire of binaire bewerkingen (“elementaire stenen”):

    Een bestand

Waar als er een bestand met de naam file bestaat.

    B-bestand

Waar als bestand bestaat en is speciaal bestand apparaat blokkeren.

    C-bestand

Waar als bestand bestaat en is een apparaatbestand met speciale tekens.

    D-bestand

Waar als bestand bestaat en is een map.

    E-bestand

Waar als het bestand de naam heeft bestand bestaat.

    F-bestand

Waar als het bestand de naam heeft bestand bestaat en is een normaal bestand.

    G-bestand

Waar als het bestand de naam heeft bestand bestaat en de groepswijzigingsbit ervan is ingesteld.

    H-bestand of -L-bestand

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

    K-bestand

Waar als het bestand de naam heeft bestand bestaat en het "sticky" bit ervan is ingesteld.

    P-bestand

Waar als het bestand de naam heeft bestand bestaat en is genaamd pijp(FIFO).

    R-bestand

Waar als het bestand de naam heeft bestand bestaat en heeft leesrechten ingesteld

    S-bestand

Waar als het bestand de naam heeft bestand bestaat en de omvang ervan is groter dan nul.

    Tfd

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

    U-bestand

Waar als het bestand de naam heeft bestand bestaat en de wijzigingsgebruikersbit is ingesteld.

    W-bestand

Waar als het bestand de naam heeft bestand bestaat en heeft schrijfrechten ingesteld.

    X-bestand

Waar als het bestand de naam heeft bestand bestaat en is uitvoerbaar.

    O-bestand

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

    G-bestand

Waar als het bestand de naam heeft bestand bestaat en behoort tot de groep die wordt geïdentificeerd door de effectieve groeps-ID.

    S-bestand

Waar als het bestand de naam heeft bestand bestaat en is een stopcontact.

    N-bestand

Waar als het bestand de naam heeft bestand bestaat en is veranderd sinds de laatste keer dat het werd gelezen.

    bestand1 -nt bestand2

Waar als het bestand bestand1 heeft een latere wijzigingstijd dan bestand2.

    bestand1 -ot bestand2

Waar als het bestand bestand1 ouder dan bestand2.

    bestand1 -ef bestand2

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

    O optnaam

Waar als de shell-optie is ingeschakeld optnaam. Voor een uitleg, zie de bash-manpagina.

    Z-snaar

Waar als de lengte van de string nul is.

    N-reeks

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 lijn tekenreeks1 lexicografisch voorafgaat aan de string tekenreeks2(voor de huidige landinstelling).

    tekenreeks1 > tekenreeks2

Waar als de lijn tekenreeks1 komt lexicografisch na de regel tekenreeks2(voor de huidige landinstelling).

    arg1 OParg2

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

Van deze elementaire voorwaardelijke expressies kun je zo complex bouwen als je wilt, met behulp van de gebruikelijke logische bewerkingen van NEGATION, AND en OR:

    !(uitdrukking)

Booleaanse ontkenningsoperator.

    expressie1 -een expressie2

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

    expressie1 -o expressie2

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

Dezelfde voorwaardelijke expressies worden gebruikt in operators terwijl En tot, die we hieronder zullen bekijken.

5.8.3 Operator geval

Operatorformaat geval is:

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

Team geval produceert eerst woorduitbreiding woord en probeert het resultaat te matchen met elk van de monsters patroonéén voor één. Nadat de eerste match is gevonden, worden er geen verdere controles uitgevoerd; een lijst met opdrachten volgens het patroon waarmee de match is gevonden. De door de operator geretourneerde waarde is 0 als er geen patroonovereenkomsten zijn gevonden. Anders wordt de waarde geretourneerd die is geproduceerd door de laatste opdracht in de overeenkomstige lijst.

Het volgende voorbeeld van het gebruik van de case-instructie is afkomstig uit het systeemscript /etc/rc.d/rc.sysinit.

geval "$UTC" in

ja|waar)

CLOCKFLAGS="$CLOCKFLAGS -u";

CLOCKDEF="$CLOCKDEF (utc)";

nee|onwaar)

CLOCKFLAGS="$CLOCKFLAGS --lokale tijd";

CLOCKDEF="$CLOCKDEF (lokale tijd)";

esac

Als de variabele resulteert in ja of true, dan wordt het eerste paar opdrachten uitgevoerd, en als de waarde nee of false is, wordt het tweede paar uitgevoerd.

5.8.4 Operator selecteren

Exploitant selecteren Hiermee kunt u interactieve interactie met de gebruiker organiseren. Het heeft het volgende formaat:

selecteer naam [in woord; ] doe lijst; klaar

Eerst vanuit het sjabloon woord er wordt een lijst met woorden gegenereerd die overeenkomen met het patroon. Deze reeks woorden wordt uitgevoerd met een standaardfout, waarbij elk woord wordt gevolgd door serienummer. Als het patroon woord weggelaten, worden positionele parameters op dezelfde manier afgeleid. Vervolgens wordt de standaard PS3-prompt gegeven en wacht de shell tot er een regel wordt ingevoerd bij standaardinvoer. Als de ingevoerde string een getal bevat dat overeenkomt met een van de weergegeven woorden, dan is de variabele naam krijgt een waarde toegewezen die gelijk is aan dat woord. Als er een lege regel wordt ingevoerd, worden de cijfers en bijbehorende woorden opnieuw weergegeven. Als er een andere waarde wordt ingevoerd, wordt de variabele naam toegewezen nulwaarde. De door de gebruiker ingevoerde string wordt opgeslagen in een variabele ANTWOORD. Lijst met opdrachten lijst uitgevoerd met de geselecteerde variabelewaarde naam.

Hier is een klein script:

#!/bin/sh

echo "Welk besturingssysteem heeft uw voorkeur?"

selecteer var in "Linux" "Gnu Hurd" "Gratis BSD" "Overig"; Doen

pauze

klaar

echo "Je zou $var kiezen"

Welk besturingssysteem heeft jouw voorkeur?
1)Linux
2) Gnu Hurd
3) Gratis BSD
4) Anders
#?

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

“Zou jij voor Linux kiezen”

5.8.5 Operator voor

Exploitant voor werkt een beetje anders dan in reguliere programmeertalen. In plaats van ervoor te zorgen dat de waarde van een variabele elke keer dat hij door de lus gaat met één toeneemt of afneemt, wijst hij elke keer dat hij door de lus gaat de volgende waarde uit een bepaalde lijst met woorden toe aan de variabele. Over het algemeen ziet het ontwerp er ongeveer zo uit:

voor naam in woorden, lijst gedaan.

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

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

klaar

In het algemeen voor verklaring heeft het formaat:

voor naam [in woord; ] doe lijst; klaar

Eerst wordt het woord geopenbaard woord in overeenstemming met de hierboven gegeven regels voor het openbaar maken van uitdrukkingen. Dan de variabele naam de resulterende waarden worden één voor één toegewezen en elke keer wordt een lijst met opdrachten uitgevoerd ist. Als " in woord" ontbreekt en vervolgens de lijst met opdrachten lijst wordt één keer uitgevoerd voor elke opgegeven positionele parameter.

Linux heeft een programma volg, die twee getallen als argumenten neemt en een reeks oplevert van alle getallen die zich tussen de gegeven getallen bevinden. Met dit commando kun je forceren voor V bashen werken op precies dezelfde manier als een vergelijkbare operator in conventionele programmeertalen. Om dit te doen, schrijft u gewoon de cyclus voor als volgt:

voor a in $(seq 1 10) ; Doen

kattenbestand_$a

klaar

Met deze opdracht wordt de inhoud van 10 bestanden weergegeven: " bestand_1", ..., "bestand_10".

5.8.6 Operatoren terwijl En tot

Exploitant terwijl werkt als als, waarbij alleen operators uit de lijst worden uitgevoerd lijst2 De lus gaat door zolang de voorwaarde waar is en wordt afgebroken als de voorwaarde niet waar is. Het ontwerp ziet er als volgt uit:

terwijl lijst1 lijst2 doet.

while [ -d mijnmap ] ; Doen

ls -l mijnmap >> logbestand

echo -- SEPARATOR -- >> logbestand

slapen 60

klaar

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

Exploitant tot gelijk aan Operator terwijl:

totdat lijst1 lijst2 doet.

Het verschil is dat het resultaat wordt geretourneerd bij het uitvoeren van een lijst met instructies lijst1, genomen met ontkenning: lijst2 uitgevoerd als de laatste opdracht in de lijst lijst1 retourneert een exit-status die niet nul is.

5.8.7 Functies

Syntaxis

Schelp bashen staat de gebruiker toe om te creëren inheemse functies. Functies gedragen en worden precies gebruikt als gewone shell-opdrachten, wat betekent dat we zelf nieuwe opdrachten kunnen maken. De functies zijn als volgt opgebouwd:

functienaam() (lijst)

En het woord functie niet noodzakelijkerwijs naam definieert de naam van de functie waarmee deze toegankelijk is, en de hoofdtekst van de functie bestaat uit een lijst met opdrachten lijst, gelegen tussen ( en ). Deze lijst met opdrachten wordt elke keer uitgevoerd als de naam wordt gebruikt 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 de functie te interpreteren (in tegenstelling tot het uitvoeren van shellscripts).

Argumenten

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

Als een ingebouwd commando voorkomt in de functietekst opbrengst, wordt de uitvoering van de functie onderbroken en wordt de besturing overgedragen naar het commando na de functieaanroep. Wanneer de uitvoering van de functie is voltooid, worden de positionele parameters en de speciale parameter weergegeven # de waarden die ze hadden voordat de functie startte, worden geretourneerd.

Lokale variabelen (lokaal)

Als we willen creëren lokale parameter, kunt u het trefwoord gebruiken lokaal. De syntaxis voor het opgeven ervan is precies hetzelfde als voor reguliere parameters, alleen wordt de definitie voorafgegaan door een trefwoord lokaal: lokaal naam=waarde.

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

volg()

lokale I=$1;

terwijl [ $2 != $I ]; Doen

echo -n "$I";

ik=$(($I + 1))

klaar;

echo $2

Let op de optie -N exploitant echo, wordt de overgang naar geannuleerd nieuwe lijn. Hoewel dit niet essentieel is voor de doeleinden die we hier in gedachten hebben, kan het nuttig zijn om de functie voor andere doeleinden te gebruiken.

Factoriële berekeningsfunctie feit

Nog een voorbeeld:

feit()

als [ $1 = 0 ]; Dan

echo 1;

anders

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

Dit is de faculteitsfunctie, een voorbeeld van een recursieve functie. Let op rekenkundige uitbreiding en commandovervanging.

V. Kostromin (kos op rus-linux dot net) - 5.8. Shell als programmeertaal

    Besturingssystemen Linux-familie, zoals elk ander besturingssysteem, vereist de aanwezigheid van een interactie-interface tussen de componenten van het computersysteem en de eindgebruiker, dat wil zeggen de aanwezigheid van een softwareniveau dat invoer van opdrachten en parameters levert om de gewenste resultaten te verkrijgen. Zo een programma niveau kreeg de naam "schelp" of, in het Engels - schelp.

Wat is een schaal?

Commandoshell ( schelp) zorgt voor interactie tussen de gebruiker en de Linux-besturingssysteemomgeving. Ze is gespecialiseerd softwareproduct, dat zorgt voor de uitvoering van opdrachten en het verkrijgen van de resultaten van de uitvoering ervan, of, om het heel simpel te zeggen: 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 zou bijvoorbeeld een commando-interpreter kunnen zijn commando.com besturingssysteem MS DOS of shell bashen operatiekamers Unix-systemen/Linux.

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

Interpretatie van de opdrachtregel.

Toegang tot opdrachten en de resultaten van hun uitvoering.

Ondersteuning voor variabelen, speciale tekens en gereserveerde woorden.

Verwerking van bestanden, standaard invoer- en uitvoerbewerkingen.

Implementatie van een speciale shell-programmeertaal.

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

sch- schelp Bourne , klassieke schaal voor Unix-besturingssysteem

bashen schelp Opnieuw Bourne(GNU Bourne-Again SHell). Misschien wel de meest voorkomende shell op dit moment in de Linux OS-omgeving.

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

csh- schelp C, met behulp van de syntaxis populaire taal programmering C

tcsh- shell-versie C met interactieve opdrachtregelbewerking.

Er kunnen verschillende shells op het systeem worden geïnstalleerd, en elke gebruiker kan zijn eigen standaardshell gebruiken. Dit alles gebeurt uiteraard automatisch tijdens het download- en gebruikersregistratieproces.

    Tijdens het laadproces van besturingssystemen uit de Linux-familie, na het laden van de systeemkernel, schakelt het systeem over naar de interactieve modus - de modus van interactie tussen de gebruiker en het besturingssysteem. Op Linux is het eerste proces dat tijdens het opstarten wordt gestart het init-programma. begin, dat de inhoud van het configuratiebestand leest /etc/inittab, bepaalt de lijst en kenmerken van terminals die beschikbaar zijn in het systeem en roept het interactieve login-programma op Getty, waarin u wordt gevraagd uw gebruikersnaam in te voeren. Na het invoeren van de gebruikersnaam en het wachtwoord wordt het programma Getty roept het programma op login, die de geldigheid controleert rekening, navigeert naar de thuismap van de gebruiker en draagt ​​de controle over aan het programma initiële lancering session, meestal een gebruikersshellprogramma, waarvan het specifieke type wordt bepaald door de inhoud van het bestand /etc/passwd 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 blijkt uit de inhoud van het bestand /etc/passwd, voor de gebruiker gebruiker1 de schaal zal worden gelanceerd sch(Bourne-shell), voor gebruiker interbasis- schelp csh(C-shell) en voor de gebruiker ongeveer- schelp bashen(weer Bourne) Nadat de shell is gestart, wordt een opdrachtprompt op het scherm weergegeven (meestal in de vorm van een dollarteken). $ als het werk wordt gedaan in de context van een regulier gebruikersaccount, of pond # , als de shell wordt gebruikt onder een rootgebruikersaccount ( wortel).

Bij het verlaten van de shell geeft de systeemkernel de controle over het programma terug begin, waarmee het aanmeldingsproces opnieuw wordt gestart en een gebruikersnaamprompt op de terminal wordt weergegeven. Het verlaten van de shell kan op twee manieren worden gedaan:

Via het team Uitgang uitgevoerd door de gebruiker

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

Interpretatie van de opdrachtregel.

    Gebruikersinvoer als reactie op een shell-prompt wordt meestal aangeroepen opdrachtregel of team. Een Linux-opdracht is een tekenreeks van de opdrachtnaam en argumenten, gescheiden door spaties. Argumenten voorzien de opdracht van aanvullende parameters die het gedrag ervan bepalen. Meestal gebruikt als argument opties En namen bestanden en mappen. Bijvoorbeeld opdrachtregel

ls -l bestand01 bestand02

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

Wanneer u meerdere opties gebruikt, kunnen deze worden gecombineerd. De volgende opdrachtopties zijn bijvoorbeeld identiek:

Ls-l-d
ls-ld

Commando's die deel uitmaken van de shell worden aangeroepen ingebouwd. Dergelijke commando's omvatten bijvoorbeeld cd, if, case, enz. Uiteraard kunnen ingebouwde commando's verschillen verschillende opties schelpen. Naast ingebouwde opdrachten is het mogelijk om programmamodules te gebruiken, dit zijn afzonderlijke uitvoerbare bestanden of bestanden scripts of scenario's- gewone tekstbestanden met opeenvolgend uitgevoerde regels met shell-opdrachten. Sommige scripts (scripts) kunnen worden uitgevoerd Linux-processen, zoals een taakplanner cron. Een taakplanner is doorgaans ontworpen om automatische uitvoering geplande systeembeheertaken. Taken cron zijn opdrachten 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 het uitvoeren van een script inhoudt, doet zich het probleem voor bij het kiezen van een shell die moet worden gestart als een onderliggend proces cron om opdrachten uit een scriptbestand te verwerken - de shell kan immers elke shell zijn, en de syntaxis van een script vereist in de regel het gebruik van de specifieke shell waarvoor het is geschreven. Om dit probleem te elimineren, is het in Linux-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 schaal bashen

#!/bin/sh- voor schaal sch

Teken # is een teken van een opmerking en de tekens die erop volgen, worden niet geïnterpreteerd als een commando. Met deze techniek kunt u expliciet opgeven welke shell moet worden gebruikt om de daaropvolgende bestandsinhoud te verwerken. Als het script geen vermelding bevat die expliciet de vereiste shell definieert, worden de instellingen van het account in de context waarvan het wordt uitgevoerd gebruikt. dit script. In dit geval is het mogelijk dat een script dat voor de shell is geschreven, bijvoorbeeld tch wordt ter uitvoering aan de shell doorgegeven bashen, waardoor de uitvoering ervan onmogelijk wordt.

Gebruik bij het uitvoeren van opdrachten of scripts omgevingsvariabelen (in het Engels - omgeving, waarvan de waarden kenmerkend zijn voor de softwareomgeving waarin opdrachten worden uitgevoerd. Dergelijke variabelen kunnen bevatten algemene instellingen systeem-, grafische of opdrachtshell-parameters, paden uitvoerbare bestanden enz. Waarden van omgevingsvariabelen worden ingesteld op systeemniveau (voor alle gebruikers) en op de specifieke gebruiker. Om omgevingsvariabelen op systeemniveau in te stellen, wordt de inhoud van de bestanden gebruikt:

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

/etc/bash.bashrc- stelt variabelen alleen 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 moet toevoegen ~/bak in een variabele PAD voor alle gebruikers plaatst u de volgende code in een van systeembestanden initialisatie van de omgeving (/etc/profile of /etc/bash.bashrc):

# Als het gebruikers-ID groter is dan of gelijk is aan 1000 en er een map ~/bin is en it

#is niet eerder toegevoegd aan de PATH-variabele,

# exporteer ~/bin naar $PATH.

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

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

Meestal in operatiekamers Linux-systemen, Voor serviceaccounts wordt een gebruikers-ID kleiner dan 1000 of kleiner dan 500 gebruikt. In dit voorbeeld wordt de omgevingsvariabele voor iedereen ingesteld lokale gebruikers systemen met een ID van 1000 of meer.

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

- ~/.bash_profile, ~/.bash_login enz. - shell-initialisatiebestanden van thuismap gebruiker.

- ~/.profiel- initialisatiebestand van het gebruikersprofiel. Wordt door veel shells gebruikt om omgevingsvariabelen te definiëren.

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

Als u bijvoorbeeld de gebruikersmap ~/bin wilt toevoegen aan het zoekpad van uitvoerbare bestanden die door de variabele zijn opgegeven PAD bijvoorbeeld naar een bestand ~/.profiel zet de lijn:

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

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

Vaker worden omgevingsvariabelewaarden ingesteld voor de huidige gebruikerssessie. Als u bijvoorbeeld een aangepaste map wilt toevoegen ~/bak in het zoekpad voor uitvoerbare bestanden:

export PATH=~/bin:$PATH

Nieuwe variabele waarde PAD duurt slechts totdat de huidige gebruikerssessie eindigt.

Om de waarde van een variabele te bekijken, kunt u het commando gebruiken echo $variabele, Bijvoorbeeld:

echo $PATH

Momenteel is de meest voorkomende schaal, zoals hierboven vermeld, bashen. Dit wordt voornamelijk veroorzaakt door het feit dat de schaal bashen is sch- verenigbaar commandoshell, waaraan wordt toegevoegd handige functies van Korn-schelpen ( ksh) en C-shell ( csh). Schelp bashen kan de meeste scripts uitvoeren die zijn geschreven onder een shell-programmeertaal zonder enige wijziging sch en probeert zo dicht mogelijk bij de standaard te komen POSIX, wat tot veel verbeteringen heeft geleid, zowel op het gebied van programmeren als 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, opdrachtshell-functies, enz. Algemeen, bashen past het beste bij de behoeften van de gemiddelde gebruiker, waardoor het het meest wordt gebruikt in de Linux-omgeving.

Bij het opstarten bashen zonder opdrachtregelparameters start de shell in de 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, standaard apparaat Het invoerapparaat 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 op het display weergegeven.

De commandotaal shell (vertaald als shell, shell) is eigenlijk een programmeertaal van zeer hoog niveau. In deze taal bestuurt de gebruiker de computer. Normaal gesproken begint u na het inloggen met de opdrachtshell te communiceren. Een teken dat de shell klaar is om opdrachten te ontvangen, is de prompt die op het scherm wordt weergegeven. In het eenvoudigste geval is het één dollar (“$”). Shell is niet noodzakelijk en de enige commandotaal (hoewel het wel de taal is die gestandaardiseerd is binnen het raamwerk van 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 maken commando taal. Kan tegelijkertijd met verschillende opdrachttalen werken op één exemplaar van het besturingssysteem. shell is een van de vele UNIX-opdrachten. Dat wil zeggen dat de commandoset “shell” het commando “sh” bevat, waarbij de “shell”-interpreter wordt aangeroepen. De eerste "shell" wordt automatisch aangeroepen wanneer u inlogt en geeft een programmeur weer. Hierna kunt u alle opdrachten voor uitvoering oproepen, inclusief de "shell" zelf, die een nieuwe shell voor u zal creëren in de oude. Dus als u bijvoorbeeld het bestand "file_1" in de editor voorbereidt:

Echo Hallo!

dan zal het normaal zijn tekstbestand, met daarin het commando "echo", dat, wanneer het wordt uitgevoerd, alles rechts ervan op het scherm weergeeft. U kunt het bestand "file_1" uitvoerbaar maken met behulp van het commando "chmod 755 file_1". Maar het kan gedaan worden door expliciet het commando "sh" ("shell") aan te roepen:

Sh-bestand_1

Sch< file1

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

Bestand_1

Omdat UNIX een systeem voor meerdere gebruikers is, kunt u dat zelfs doen persoonlijke computer parallel werken op bijvoorbeeld 12 schermen (wissel van scherm naar scherm ALT/functietoets), met op elk scherm een ​​nieuwe (of dezelfde) gebruiker met zijn eigen opdrachtshell. U kunt X-Window ook in grafische modus openen groot aantal windows, en elk venster kan zijn eigen gebruiker hebben met zijn eigen commandoshell... Het kernelement van de shell-taal is het commando.

Commandostructuren:

Commando's in de shell hebben meestal het volgende formaat:

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

Bijvoorbeeld:

Ls -ls /usr/bin

Waarbij ls de naam is van de uitgevende opdracht inhoud map, -ls - flags ("-" - teken van vlaggen, l - lang formaat, s - volume van bestanden in blokken), /usr/bin - map waarvoor de opdracht wordt uitgevoerd. Deze opdracht geeft de inhoud van de map weer in lang formaat /usr/bin, zal informatie over de grootte van elk bestand in blokken worden toegevoegd. Helaas wordt deze commandostructuur niet altijd gevolgd door een minteken, en de vlaggen bestaan ​​niet altijd uit één woord commando's "uitvoeren" als cc - de C-taalcompiler aanroepen, tar - werken met archieven, dd - een bestand kopiëren met conversie, find - zoeken naar bestanden en een aantal andere. In de regel wordt het eerste woord door de shell geaccepteerd. , als team. opdrachtregel

het eerste woord wordt door de shell gedecodeerd als een commando (aaneenschakeling), waardoor een bestand met de naam "cat" (het tweede woord) wordt weergegeven dat zich in de huidige map bevindt. Commandoomleiding Standaardinvoer (invoer) - "stdin" in UNIX OS wordt uitgevoerd vanaf het terminaltoetsenbord, en standaard uitvoer(uitvoer) - "stdout" wordt naar het terminalscherm geleid. Er is ook standaard bestand diagnostische berichten - "stderr", die iets later zal worden besproken. Een commando dat kan werken op standaardinvoer en -uitvoer heet FILTER. De gebruiker beschikt over handige middelen om invoer en uitvoer om te leiden naar andere bestanden (apparaten). De symbolen ">" en ">>" geven de uitvoeromleiding aan.

ls >file_1 De opdracht "ls" genereert een lijst met bestanden in de huidige map en plaatst deze in het bestand "file_1" (in plaats van deze naar het scherm af te drukken). Als het bestand "file_1" al eerder bestond, wordt het overschreven door het nieuwe bestand.

Pwd >>bestand_1<" и "<<" обозначают перенаправление ввода.

het pwd-commando vormt de volledige naam van de huidige map en plaatst deze aan het einde van het bestand "file_1", d.w.z. ">>" wordt aan het bestand toegevoegd als het niet leeg is. Symbolen "

Wc -l

telt en geeft het aantal regels in het bestand file_1 weer.<

Ed-bestand_2<<" (т. е. "!"). То есть ввод будет закончен, когда первым в очередной строке будет "!". Можно сочетать перенаправления. Так

het pwd-commando vormt de volledige naam van de huidige map en plaatst deze aan het einde van het bestand "file_1", d.w.z. ">>" wordt aan het bestand toegevoegd als het niet leeg is. Symbolen " zal het bestand "file_2" maken met behulp van de editor, rechtstreeks vanaf de terminal. Het einde van de invoer wordt bepaald door het teken rechts "

bestand_4

Wc -l >bestand_4

worden op dezelfde manier uitgevoerd: het aantal regels in het bestand "file_3" wordt geteld en het resultaat wordt in het bestand "file_4" geplaatst. Het middel dat de standaarduitvoer van het ene commando combineert met de standaardinvoer van een ander commando wordt een PIPELINE genoemd en wordt aangegeven door een verticale balk "|".

ls | wc -l

een lijst met bestanden in de huidige map wordt naar de invoer van het "wc"-commando gestuurd, die het aantal regels in de map weergeeft. De pijplijn kan ook meer dan twee opdrachten combineren, als ze allemaal, behalve mogelijk de eerste en de laatste, filters zijn:

Kat bestand_1 | grep -h resultaat | sorteer | cat -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 vervolgens ("cat -b") en druk het resultaat af in bestand "file_2". Omdat UNIX-apparaten worden vertegenwoordigd door speciale bestanden, kunnen ze worden gebruikt in omleidingen. Speciale bestanden bevinden zich in de map "/dev". Bijvoorbeeld: "lp" - print; "console" - console; "ttyi" - i-de terminal; "null" is een dummy (leeg) bestand (apparaat). Dan, bijvoorbeeld,

Ls > /dev/lp< /dev/null обнулит файл "file_1".

zal de inhoud van de huidige map afdrukken, en file_1

In dit geval wordt het bestand "file_1" gesorteerd en afgedrukt, en worden de laatste 20 regels ook op het scherm afgedrukt. Laten we teruggaan naar de uitvoeromleiding. Standaardbestanden zijn genummerd:

0 - standaard, 1 - standaard 2 - standaard. Als u geen foutmelding op het scherm wilt hebben, kunt u deze van het scherm omleiden naar het bestand dat u opgeeft (of het volledig weggooien door het om te leiden naar het bestand "lege apparaat" - /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” achtereenvolgens op het scherm zou moeten weergeven, het geeft u bijvoorbeeld het volgende

111111 222222 cat: f2: Bestand of map bestaat niet

waarbij 111111 222222 de inhoud is van bestand "file_1" en bestand "file_2" ontbreekt, wat de opdracht "cat" standaard rapporteert aan het standaard diagnosebestand, net als de standaarduitvoer die door het scherm wordt weergegeven. Als u een dergelijk bericht niet op het scherm wilt, kunt u het doorsturen naar het bestand dat u opgeeft:

Cat bestand_1 bestand_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 bestand "ff" sturen door gebruik te maken van in dit geval ontwerp

Cat bestand_1 bestand_2 >>ff 2>ff

U kunt niet alleen opgeven welk standaardbestand u wilt doorsturen, maar ook naar welk standaardbestand u wilt doorsturen.

Cat bestand_1 bestand_2 2>>ff 1>&2

Hier wordt eerst "stderr" omgeleid (in de toevoegmodus) naar bestand "ff", en vervolgens wordt de standaarduitvoer omgeleid naar "stderr", wat op dit punt bestand "ff" is. Dat wil zeggen, het resultaat zal vergelijkbaar zijn met het vorige. De constructie "1>&2" betekent dat u naast het nummer van het standaardbestand waarnaar u wilt doorverwijzen, ook "&" ervoor moet zetten; de hele structuur is zonder spaties geschreven.<- закрывает стандартный ввод. >- sluit standaarduitvoer. Commandobestanden. Er zijn verschillende opties om toe te staan ​​dat een tekstbestand als opdracht wordt gebruikt. Laten we een editor gebruiken om een ​​bestand met de naam "cmd" te maken dat één regel als deze bevat:

Datum; pwd; ls

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

$ sh cmd

$sh

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

Chmod 711 cmd

zal de beveiligingscode "rwx__x__x" maken. Dan een simpel telefoontje

zal dezelfde drie opdrachten uitvoeren. Het resultaat zal hetzelfde zijn als het bestand met de inhoud

Datum; pwd; ls

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

Foutopsporing in batchbestanden

SHELL gebruikt twee mechanismen voor het debuggen van batchbestanden. De eerste is: set -v drukt de regels af batchbestand zoals je ze leest. Deze modus wordt gebruikt bij het zoeken naar syntaxisfouten. Om het te gebruiken hoeft u het opdrachtbestand niet te wijzigen, bijvoorbeeld: sh -v proc... hier is proc de naam van het opdrachtbestand. De schakelaar -v kan worden gebruikt in combinatie met de schakelaar -n, die de uitvoering van volgende opdrachten verhindert (de opdracht set -n blokkeert de terminal totdat de EOF-vlag wordt ingevoerd). De opdracht set -x geeft opdrachten weer terwijl ze worden uitgevoerd, en de programmaregels worden naar de terminal uitgevoerd en hun waarden worden vervangen in plaats van de variabelen. Om de schakelopties -x en -v te annuleren, kunt u het set-commando gebruiken - en om te installeren, wijst u de corresponderende waarde toe aan een macrovariabele. SHELL-OMGEVING (VARIABELEN EN PARAMETERS) In de shell-taal kunt u batchbestanden schrijven en de opdracht "chmod" gebruiken om ze uitvoerbaar te maken. Hierna verschillen ze niet meer van andere UNIX OS-opdrachten.

Shell-variabelen

De naam van een shellvariabele is een reeks letters, cijfers en onderstrepingstekens die beginnen met een letter. De waarde van een shellvariabele is een reeks tekens. Het feit dat er slechts twee soorten gegevens in de shell aanwezig zijn: enerzijds een reeks tekens en een tekstbestand, maakt het eenvoudig om eindgebruikers bij het programmeren te betrekken die nog nooit eerder hebben geprogrammeerd, en anderzijds veroorzaakt een zeker intern protest onder veel programmeurs die gewend zijn aan een aanzienlijk grotere diversiteit en grotere flexibiliteit van taalkundige middelen. Het is echter interessant om te zien hoe hooggekwalificeerde programmeurs, nadat ze bekend zijn geworden met de 'spelregels' van de shell, er vele malen sneller programma's in schrijven dan in C, maar wat vooral interessant is, in sommige gevallen zijn deze programma's lopen zelfs sneller dan die geïmplementeerd in C. Een variabelenaam is vergelijkbaar met het traditionele idee van een identificatie, d.w.z. een naam kan een reeks letters, cijfers en onderstrepingstekens zijn, beginnend met een letter of 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 vereist omdat er een spatie in de tekenreeks staat.

Andere manieren om waarden aan shell-variabelen toe te wijzen zijn ook mogelijk. De opname bijvoorbeeld

DAT=`datum`

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

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

Wanneer u dit gedeelte van het opdrachtbestand uitvoert, wordt het bericht weergegeven

de tolk stopt en wacht tot er een waarde via het toetsenbord wordt ingevoerd. Als u bijvoorbeeld "753" heeft ingevoerd, wordt dit de waarde van de variabele "x". Eén "lees"-commando kan waarden aan meerdere variabelen tegelijk lezen (toewijzen). Als er meer variabelen in "read" staan ​​dan er zijn ingevoerd (gescheiden door spaties), krijgen de overige variabelen een lege string toegewezen. Als er meer verzonden waarden zijn dan variabelen in de opdracht "lezen", worden de extra waarden genegeerd. Bij toegang tot een shellvariabele moet u de naam laten voorafgaan door het symbool "$". Dus de commando's echo $var_2 echo var_2 zullen op het scherm verschijnen

UNIX OS var_2 Ontsnappen

Laten we de ontsnappingstechnieken die in de schaal worden gebruikt eens nader bekijken. Dubbele aanhalingstekens (" "), enkele aanhalingstekens (" ") en backslash (\) worden gebruikt als ontsnappingsmechanismen. Hun actie wordt duidelijk uit de voorbeelden: je 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 mislukken vanwege de spaties) Dan

Echo A = $A B = $B C = $C echo D = $D E = $E F = $F evaluatie echo geëvalueerd A = $A evaluatie echo geëvalueerd B = $B evaluatie echo geëvalueerd C = $C

Wordt op het scherm weergegeven

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 die te maken hebben met het ontsnappen van regelfeeds. Laat de variabele "string" de waarde krijgen van een 2x3 "array": 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" Vervolgens er zijn drie opties voor het schrijven van de variabele in het "echo" echo commando $string echo "$string" echo "$string" zal respectievelijk drie verschillende resultaten opleveren: abc def $string abc def en de reeks commando's echo "str_1 str_2" > file_1 echo "str_1 str_2" > file_2 cat file_1 file_2 geeft opeenvolgend weer identieke bestanden file_1 en file_2: str_1 str_2 str_1 str_2 Merk ook op dat de backslash (\) niet alleen ontsnapt aan het teken dat erop volgt, waardoor u speciale karakters net zoals karakters die zichzelf vertegenwoordigen (het kan ook aan zichzelf ontsnappen - \\), maar in een opdrachtbestand kunt u met een backslash regels samenvoegen tot één regel (ontsnappen aan het einde van een regel). Bijvoorbeeld het eerder gegeven voorbeeld van de opdrachtregel:

een lijst met bestanden in de huidige map wordt naar de invoer van het "wc"-commando gestuurd, die het aantal regels in de map weergeeft. De pijplijn kan ook meer dan twee opdrachten combineren, als ze allemaal, behalve mogelijk de eerste en de laatste, filters zijn:

zou in een batchbestand kunnen worden geschreven, bijvoorbeeld

Kat bestand_1 | grep -h\resultaat | sorteer | cat -b > bestand_2

Overigens biedt het transportbandsymbool ook het effect van het voortzetten van de opdrachtregel. In dit geval kan het een mooier resultaat opleveren, zoals dit:

Kat bestand_1 |

grep -h resultaat |

sorteer |

cat -b > bestand_2

Manipulaties met shell-variabelen Ondanks het feit dat shell-variabelen over het algemeen als strings worden opgevat, dat wil zeggen dat “35” geen getal is, maar een string van twee tekens “3” en “5”, kunnen ze in een aantal gevallen verschillend worden geïnterpreteerd, bijvoorbeeld als gehele getallen. De opdracht "expr" heeft verschillende mogelijkheden. Laten we er 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=`expr $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

4 0 0 0

De vermenigvuldigingsbewerking ("*") moet worden geëscaped, omdat dit pictogram in de shell wordt gezien als een speciaal teken, wat betekent dat elke reeks tekens op deze plaats kan worden vervangen. Met het commando "expr" zijn niet alleen (gehele) rekenkundige bewerkingen mogelijk, maar ook stringbewerkingen: A=`expr "cocktail" : "haan"` ; echo $A B=`expr "cocktail" : "staart"` ; echo $B C=`expr "cocktail" : "koken"` ; echo $C D=`expr "cock" : "cocktail"` ; echo $D

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

Parameters kunnen worden doorgegeven aan het opdrachtbestand. De schaal gebruikt positionele parameters (dat wil zeggen dat de volgorde waarin ze verschijnen belangrijk is). In het commandobestand beginnen de variabelen die overeenkomen met de parameters (vergelijkbaar met shell-variabelen) met het symbool "$", gevolgd door een van de cijfers van 0 tot 9: Laat "examp-1" worden aangeroepen met de parameters "cock" en "staart". Deze parameters vallen in de nieuwe omgeving onder standaard namen"1" en "2". De (standaard) variabele met de naam "0" slaat de naam van de opgeroepen berekening op. Bij toegang tot parameters wordt het getal voorafgegaan door het dollarteken "$" (net als bij toegang tot variabelen): $0 komt overeen met de naam van dit commandobestand; $1 is de eerste parameter in volgorde; $2 tweede parameter, enz. Omdat het aantal variabelen waaraan parameters kunnen worden doorgegeven beperkt is tot één cijfer, d.w.z. 9e ("0", zoals al opgemerkt, heeft een speciale betekenis), en vervolgens voor verzending meer parameters wordt het speciale commando "shift" gebruikt. De opdracht "set" biedt een unieke benadering van parameters. Fragmenteren bijvoorbeeld

Stel een b in met echo eerst=$1 tweede=$2 derde=$3

cat -b > bestand_2

Eerste=een tweede=b derde=c

die. het commando "set" stelt de parameterwaarden in. Dit kan erg handig zijn. De opdracht "datum" wordt bijvoorbeeld weergegeven huidige datum, zeg "Ma 01 mei 12:15:10 2000", bestaande uit vijf woorden, en dan

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

cat -b > bestand_2

ma 01 2000

Met het commando "set" kunt u ook de uitvoering van het programma besturen, bijvoorbeeld: set -v-regels worden naar de terminal uitgevoerd en door de shell gelezen. set +v annuleert de vorige modus. set -x drukt opdrachten af ​​naar de terminal voordat deze worden uitgevoerd. set +x annuleert de vorige modus. Het "set"-commando zonder parameters geeft de status van de softwareomgeving aan de terminal weer.

Shell-vervangingen

Voordat opdrachten in batchbestanden direct worden geïnterpreteerd en uitgevoerd, wordt de shell uitgevoerd verschillende soorten vervangingen: 1. VERVANGING VAN RESULTATEN. Alle opdrachten tussen aanhalingstekens worden uitgevoerd en het resultaat wordt op hun plaats vervangen. 2. VERVANGING VAN WAARDEN VAN PARAMETERS EN VARIABELEN. Dat wil zeggen dat woorden die beginnen met "$" worden vervangen door de overeenkomstige waarden van variabelen en parameters. 3. lacunes interpreteren. Ontsnapte spaties worden genegeerd. 4. GENERATIE VAN BESTANDSNAMEN. Woorden worden gecontroleerd op de aanwezigheid van speciale tekens ("*", "?"") en de bijbehorende generaties worden uitgevoerd. Softwareomgeving Elk proces heeft een omgeving waarin het draait. Shell gebruikt een aantal van deze omgevingsvariabelen. Als u de opdracht "set" zonder parameters typt, wordt op het scherm informatie weergegeven over een aantal standaardvariabelen die bij het inloggen zijn gemaakt (en vervolgens worden doorgegeven aan al uw nieuwe processen "geërfd"), evenals variabelen die door uw processen zijn gemaakt en geëxporteerd . Het specifieke type en de inhoud van de informatie-uitvoer hangt in grote mate af van welke versie van UNIX wordt gebruikt en hoe het systeem is geïnstalleerd.

Uitvoering resultaat opdrachten instellen zonder parameters (niet compleet):

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 commentaar geven op de waarden van de variabelen. HOME=/root is de naam van de homedirectory waar de gebruiker terechtkomt na het inloggen. Dat wil zeggen, nadat ik de naam en het wachtwoord correct heb ingevoerd, kom ik in de map "/root" terecht. PATH=/bin:/usr/bin:.:/usr/local/bin:/usr/bin/X11 - deze variabele specificeert de reeks bestanden waarnaar de shell zoekt bij het zoeken naar een commando. Bestandsnamen worden hier gescheiden door dubbele punten. De kijkvolgorde komt overeen met de volgorde van de namen op het parcours. Maar in eerste instantie vindt het zoeken plaats tussen de zogenaamde ingebouwde commando's. De ingebouwde commando's omvatten de meest gebruikte commando's, zoals "echo", "cd", "pwd", "date". Hierna doorzoekt het systeem de directory “/bin”, die de commando’s “sh”, “cp”, “mv”, “ls”, enz. kan bevatten. Dan de directory "/usr/bin" met de commando's "cat", "ss", "expr", "nroff", "man" en vele anderen. Vervolgens vindt de zoekopdracht plaats in de huidige map (".", of een andere aanduiding "leeg", d.w.z. ""), waar de door u geschreven opdrachten zich hoogstwaarschijnlijk bevinden. Na het typen van de opdrachtregel en het indrukken van "shell" herkent (na het uitvoeren van de noodzakelijke vervangingen) de naam die overeenkomt met de opdracht en zoekt ernaar in de mappen vermeld in PATH. Als de opdracht buiten deze mappen wordt geplaatst, wordt deze niet gevonden. Als er meerdere commando's met dezelfde naam zijn, wordt het commando dat zich in de eerst bekeken map bevindt, aangeroepen. PATH kan, net als andere variabelen, eenvoudig worden gewijzigd door mappen toe te voegen, te herschikken of te verwijderen. IFS= (Internal Field Separator) geeft tekens weer die dienen om woorden (velden) van elkaar te scheiden. Dit zijn “spatie”, “tab” en “line feed”, hier is dus links van de opdracht niets zichtbaar en zijn er twee regels bezet. LOGNAME=root - loginnaam (“gebruikersnaam”). MAIL=/var/spool/mail/root - de naam van het bestand waarin (e-mail)mail wordt ontvangen. PWD=/root - naam van de huidige map PS1=$(PWD): " " - type map. In dit geval zal de prompter de naam van de huidige map weergeven, gevolgd door een dubbele punt en een spatie. Dat wil zeggen, er zal "/root: " zijn. PS2=> - deze prompt (hier ">") wordt gebruikt als een uitnodiging om door te gaan met het invoeren (op de volgende regel) van een onvoltooide opdracht. Typ bijvoorbeeld het openingshaakje "(" en druk na het indrukken van V volgende regel je zult deze prompter zien. Als u niet weet wat u vervolgens moet doen, typt u het haakje sluiten ")" en het verdwijnt. SHELL=/bin/sh - Deze variabele specificeert de shell die de gebruiker gebruikt. In dit geval wordt er gebruik van gemaakt standaard schaal("sh"). De initiële omgeving wordt automatisch geïnstalleerd bij het inloggen met behulp van bestanden als "/etc/rc" en "/etc/.profile". Eén manier om eenvoudig de omgeving te wijzigen (bijvoorbeeld opdrachtzoekpad, programmatype, shelltype, schermkleur, enz.) is door deze informatie in uw thuismap te plaatsen in een gespecialiseerd ".profile"-bestand ($(HOME)/ . profiel), waarbij de vereiste waarden worden toegewezen omgevingsvariabelen. Dat wil zeggen, roep dit bestand naar de editor en schrijf wat je maar wilt). Vervolgens wordt dit bestand elke keer dat u inlogt automatisch uitgevoerd en wordt er een nieuwe omgeving geïnstalleerd. Dit bestand MOET in uw HOME-map(invoergidsen). Houd er rekening mee dat bestandsnamen die met een punt beginnen over het algemeen een speciale status hebben. Ze worden dus niet op het scherm weergegeven met een eenvoudig "ls"-commando - u moet dit commando aanroepen met de vlag "-a". Ze worden overigens niet zonder onderscheid vernietigd door het commando “rm *”. Mezelf shell-tolk wijst automatisch waarden toe aan de volgende variabelen (parameters): ? de waarde die door de laatste opdracht is geretourneerd; $ procesnummer; ! achtergrondprocesnummer;

  1. het aantal positionele parameters dat aan de schaal wordt doorgegeven;
  • lijst met parameters als één regel;

@ lijst met parameters, als een reeks woorden; - vlaggen doorgegeven aan de schaal. Wanneer u toegang krijgt tot deze variabelen (dat wil zeggen, wanneer u ze gebruikt in een opdrachtbestand - shell-programma), moet u "$" vooraan zetten. 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 een computer wordt uitgevoerd, initieert een of meer processen die automatisch de getallen in volgorde ontvangen. Als u het procesnummer als bestandsnaam gebruikt, kunt u er dus zeker van zijn dat elk nieuw bestand een nieuwe naam krijgt (deze wordt niet geschreven in de plaats van een bestaande naam). Het voordeel is ook het grootste nadeel van deze methode voor het benoemen van bestanden. Het is niet bekend welke namen aan de bestanden worden toegewezen. En als u binnen het raamwerk van dit proces een bestand kunt vinden “zonder te kijken”, dat wil zeggen door het te openen met $$, dan kunnen dergelijke bestanden gemakkelijk verloren gaan. Dit creëert extra problemen bij het debuggen van programma's. De tolk oproepen Nadat de gebruiker in het systeem is geregistreerd (met behulp van het login-commando), wordt de SHELL-taaltolk gebeld. Als de registratiedirectory van de gebruiker een .profile-bestand bevat, voert de tolk dit bestand uit voordat ten minste één opdracht van de terminal wordt ontvangen (er wordt aangenomen dat het .profile-bestand opdrachten bevat). Bij het aanroepen kunnen de volgende sleutels worden opgegeven: -c string Commando's worden uit de opgegeven string gelezen. -s Commando's worden gelezen vanuit standaardinvoer. Tolkberichten worden naar een standaard diagnostisch bestand geschreven. -i Interactieve bedrijfsmodus. Als het eerste teken van de parameter "0" een - teken is, worden de opdrachten uit het .profile-bestand gelezen.

PROGRAMMASTRUCTUREN===

Zoals in elke programmeertaal kan shell-tekst commentaar bevatten. Hiervoor wordt het symbool "#" gebruikt. Alles wat op de regel (in het commandobestand) links van dit teken 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 de opdrachtuitvoering bepalen. Bij dergelijke operatoren is het vaak nodig om de voorwaarde te controleren, die de richting bepaalt waarin de berekeningen doorgaan.

Test("")-opdracht

Het testcommando controleert of aan een bepaalde voorwaarde is voldaan. Shell-taalselectie- en lusinstructies worden gegenereerd met behulp van deze (ingebouwde) opdracht. Twee mogelijke opdrachtformaten:

Testconditie

[ voorwaarde ]

we zullen de tweede optie gebruiken, d.w.z. In plaats van het woord ‘test’ vóór de voorwaarde te schrijven, zullen we de voorwaarde tussen haakjes plaatsen, wat vaker voorkomt bij programmeurs. In feite zal de shell dit commando herkennen aan het openingshaakje "[" als het woord dat overeenkomt met het "test" commando. Er moeten spaties zijn tussen de haakjes en de voorwaarde die ze bevatten. Er moeten ook spaties staan ​​tussen de waarden en het vergelijkings- of bewerkingssymbool. VOORWAARDEN VOOR BESTANDSCONTROLE: -f bestand bestand "bestand" is een normaal bestand; -d bestand bestand "bestand" - map; -с bestand bestand "bestand" is een speciaal bestand; -r bestand heeft toestemming om het bestand "bestand" te lezen; -w bestand heeft toestemming om naar bestand "bestand" te schrijven; -s bestand bestand "bestand" is niet leeg.

VOORWAARDEN VOOR HET TESTEN VAN STRINGS: str1 = str2 strings "str1" en "str2" komen overeen; str1 != str2 strings "str1" en "str2" zijn niet hetzelfde; -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 $?

1

Daarnaast zijn er twee standaard conditiewaarden die gebruikt kunnen worden in plaats van condition (hiervoor zijn geen haakjes nodig). VOORWAARDEN VOOR HET VERGELIJKEN VAN GEHEELDEN: 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 is 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 behulp van standaard logische bewerkingen: ! (not) keert de waarde van de exitcode om. -o (of) komt overeen met logische "OR". -a (en) komt overeen met logische "AND". Voorwaardelijke verklaring "als" Over het algemeen heeft de "if" -instructie de structuur

Indien voorwaarde, lijst dan

Hier kan "elif", een verkorte versie van "else if", samen met de volledige versie worden gebruikt, d.w.z. bijlage toegestaan

Als [ $1 -gt $2 ]

dan pwd else echo $0: Hallo!

Als u vervolgens if-1 12 11 aanroept, wordt /home/sae/STUDY/SHELL geproduceerd en if-1 12 13 produceert if-1: Hallo!

Beloperator ("casus")

De selectieoperator "case" heeft de structuur:

Kofferkoord erin

sjabloon) lijst met opdrachten;;

sjabloon) lijst met opdrachten;; ... sjabloon) lijst met opdrachten;; Hier zijn "case", "in" en "esac" functiewoorden. De "string" (dit kan een enkel teken zijn) wordt vergeleken met het "patroon". Vervolgens wordt de "opdrachtenlijst" van de geselecteerde regel uitgevoerd. De ";;" aan het einde van de selectieregels ziet er ongebruikelijk uit, maar schrijf hier ";". het zou een vergissing zijn. Voor elk alternatief kunnen meerdere opdrachten worden uitgevoerd. Als deze opdrachten op één regel worden geschreven, dan is het symbool ";" zal worden gebruikt als opdrachtscheidingsteken. Gebruikelijk

laatste regel

selectie heeft het patroon "*", wat in de "case"-structuur "elke waarde" betekent. Deze regel wordt geselecteerd als de waarde van de variabele (hier $z) niet overeenkomt met een van de eerder geschreven patronen, begrensd door het haakje ")". De waarden worden bekeken in de volgorde waarin ze zijn geschreven.

Opgesomde lusoperator ("for")

De lusoperator "for" heeft de structuur:

Voor naam

do lijst met uitgevoerde opdrachten waarbij "for" een hulpwoord is dat het type lus definieert, "do" en "done" zijn hulpwoorden die de hoofdtekst van de lus benadrukken. Laat het commando "lsort" worden weergegeven door een batchbestand

Voor i in file_1 file_2 file_3 doe proc_sort $i gedaan

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

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

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

Lusinstructie met ware voorwaarde ("while")

do lijst met uitgevoerde opdrachten waarbij "while" een hulpwoord is dat het type lus met een ware voorwaarde bepaalt. De lijst met opdrachten in de lusbody (tussen “do” en “done”) wordt herhaald totdat de voorwaarde waar blijft (dat wil zeggen, de voltooiingscode van de laatste opdracht in de lusbody is “0”) of de lus niet wordt onderbroken van binnenuit door speciale commando's ("break", "continue" of "exit"). Wanneer u voor het eerst de lus betreedt, moet de voorwaarde waar zijn. Met het commando "break [n]" kunt u een lus doorbreken. Als "n" ontbreekt, is dit gelijk aan "break 1". "n" geeft het aantal geneste lussen aan waaruit moet worden afgesloten, bijvoorbeeld "break 3" - verlaat drie geneste lussen. In tegenstelling tot het commando "break" stopt 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 zijn. "Doorgaan met 2" betekent bijvoorbeeld het verlaten van het begin van de tweede (geteld vanaf de diepte) geneste lus. Met de opdracht "exit [n]" kunt u de procedure geheel afsluiten met de retourcode "0" of "n" (als de parameter "n" is opgegeven). Deze opdracht kan in meer dan alleen lussen worden gebruikt. Zelfs bij een lineaire reeks opdrachten kan het bij het debuggen nuttig zijn om de (huidige) berekening op een bepaald punt te stoppen.

Lusinstructie met valse voorwaarde ("tot")

De lusoperator "tot" heeft de structuur:

Tot conditie

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

Tot vals doen

lees x als [ $x = 5 ] echo dan genoeg ; break else echo nog wat fi

Hier is het programma met eindeloze lus wacht tot er woorden zijn ingevoerd (herhaalt de zin "nog wat meer" op het scherm) totdat "5" is ingevoerd. Hierna wordt "genoeg" uitgegeven en stopt het commando "break" met het uitvoeren van de lus.

Lege operator

De lege instructie heeft het formaat

:

Doet niets. Retourneert de waarde "0".

Functies in de schaal

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

Naam() (opdrachtenlijst)

waarna de functie bij naam wordt aangeroepen. Wanneer de functie wordt uitgevoerd, wordt er geen nieuw proces gemaakt. Het draait in de omgeving van het overeenkomstige proces. De argumenten van de functie worden de positionele parameters; de naam van de functie is de nulparameter. U kunt de uitvoering van een functie onderbreken met behulp van de operator "return [n]", waarbij (optioneel) "n" de returncode is.

Afhandeling onderbreken ("trap")

Het kan nodig zijn om de uitvoering van het programma te beschermen tegen onderbrekingen. Meestal komt u de volgende onderbrekingen tegen die overeenkomen met signalen: 0 verlaat de tolk, 1 hangt op (verbreekt de verbinding met de externe abonnee), 2 onderbreking van , 9 vernietiging (niet onderschept), 15 einde executie. Ter bescherming tegen interrupts is er een "trap"-opdracht, die het formaat heeft:

Vang signalen van de "opdrachtenlijst" op

Als er interrupts optreden in het systeem, waarvan de signalen gescheiden door een spatie in de “signalen” worden vermeld, dan zal de “commandolijst” worden uitgevoerd, waarna (als het “exit”-commando niet in de commandolijst is uitgevoerd) de besturing zal plaatsvinden. keer terug naar het onderbrekingspunt en de uitvoering van het opdrachtbestand zal doorgaan. Als u bijvoorbeeld bestanden in “/tmp” moet verwijderen voordat u de uitvoering van een opdrachtbestand onderbreekt, dan kunt u dit doen met het commando “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, het opdrachtbestand afgesloten.

  • 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 besturingssysteem(nou ja, strikt genomen is dat zo 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 (de uitnodiging beïnvloeden, de map wijzigen, omgevingsvariabelen instellen) zijn ook niet bepaald 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 externe server- gebruik 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 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; Zoekopdracht specifieke tekst in het helpartikel: 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, etc.)
  • 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 is 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 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.

Een dergelijke 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 gemaakt. 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 precies 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), schrijf dan uw oplossing op 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 sectie ‘Een oneliner-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 ... ;

Analyse

  • 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.

Opleidingstaken

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 er momenteel namens worden uitgevoerd root-gebruiker ;
  • 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, zoals 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.

=====================================================

LABORATORIUMWERK nr. 1 (uitvoeringstijd - 3 uur)

Onderwerp: "Inleiding totschelp

1. Inleiding tot shell

Shell is een opdrachtinterpreter (opdrachtprocessor) die fungeert als interface tussen de gebruiker en de Unix-kernel. Solaris biedt drie belangrijke opdrachtprocessors:

    De standaard Bourne-shell is /sbin/sh

    C-opdrachtprocessor -- /bin/csh

    Korn-shell-- ./bin/ksh

Naast de genoemde biedt Solaris extra shells:

    J-shell -- /sbin/jsh

    Beperkte Korn l -- / usr/ bin/rsh

    T-shell -- /usr/bin/tcsh

    GNU Bourne opnieuw -- /usr/bin/bash

    Z-shell – usr/bin/zsh

De keuze van de opdrachtprocessor is een kwestie van persoonlijke voorkeur.

2. Voer opdrachten uit

Elk commando in Unix bestaat uit de naam van het programma dat moet worden gestart (commando), opties (sleutels) en argumenten die aan het programma worden doorgegeven. De opdrachtregel wordt gescheiden door spaties of tabs.

Voorbeeld

$ /bin/ping –t 10 192.168.2.13

argument

schelp uitnodiging

Als het pad naar het uitvoerbare bestand niet is opgegeven bij het starten van een programma, doorzoekt het besturingssysteem achtereenvolgens de mappen die zijn opgegeven in de PATH-variabele. Als er een programma met dezelfde naam in de map staat die wordt bekeken, wordt dit gestart voor uitvoering. Er wordt niet naar programma's gezocht in de huidige werkmap, tenzij deze is opgegeven in de PATH-variabele.

! Om veiligheidsredenen wordt aanbevolen dat de beheerder de huidige directory en de thuisdirectory (persoonlijk) van de gebruiker niet toevoegt aan de PATH-variabele.

Voorbeelden

Voer een programma uit dat het volledige pad specificeert

$ / usr/ lokaal/ bak/ Mijn_ programma

Een programma uitvoeren vanuit een hogere (bovenliggende) map

$ ../ lokaal/ bak/ Mijn_ programma

Een programma uitvoeren vanuit de huidige directory

$ ./ Mijn_ programma

3. Speciale tekens in de shell

Sommige schelpkarakters hebben een speciale betekenis.

3.1. Sjablonen voor het genereren van bestandsnamen

? (vraagteken) komt overeen met elk teken behalve de eerste punt;

(vierkante haakjes) een groep karakters definiëren (één karakter uit de groep wordt geselecteerd);

- (minteken) definieert het bereik van geldige tekens;

! (uitroepteken) wijst de volgende groep karakters af;

* (sterretje-symbool) komt overeen met een willekeurig aantal tekens, behalve de eerste punt.

3.2. I/O-omleidingssymbolen

< - invoeromleiding;

>, >> - uitvoeromleiding;

2>, 2>> - doorsturen van foutmeldingen;

| - transportband.

3.3. Vervangende karakters

$naam_variabeleQ - variabele vervanging;

$(opdracht) of `team` - opdrachtvervanging;

~ - tilde-substitutie.

4. Zoeken

Om snel naar bestanden en mappen te zoeken, gebruikt u de opdracht Whereis; voor een diepere zoekopdracht gebruikt u de opdracht find (zoek naar bestanden die aan de opgegeven vereisten voldoen;).

5. Teksteditor vi

De teksteditor vi is een universele editor die in elke Unix aanwezig is. Naast het bewerken van tekstbestanden kan de vi-editor worden gebruikt om de opdrachtregel te bewerken.

De vi-editor heeft 3 bedieningsmodi (zie afbeelding).

Inloggen op vi-editor

Afrit vi

Het “~”-teken (tilde) op de eerste positie markeert lege (niet-bestaande) regels van het bestand.

De hoofdmodus is de commandomodus, waarin commando's worden ingevoerd door op een bepaalde reeks toetsen te drukken (ze worden op geen enkele manier op het scherm weergegeven).

Door tekst bladeren in de opdrachtmodus gebeurt met behulp van pijlen en toetsen (links), (omlaag), (omhoog), (naar rechts).

Sommige vi-opdrachten worden in de tabel vermeld.

De huidige regel verwijderen

De huidige regel naar de buffer kopiëren

Cursorbeweging

Door de cursor gemarkeerde tekens invoeren in de buffer

Voeg onderaan een nieuwe regel in

Bovenaan een nieuwe regel invoegen

Toevoegen na de cursor

Voeg toe na de huidige regel

Invoegen vóór de cursor

Invoegen vóór de huidige regel

Een teken vervangen door een teken dat via het toetsenbord is ingevoerd

Tekst plakken vanaf het klembord

. (punt)

Herhaal de laatst uitgevoerde opdracht

Laatste commando annuleren

Maak alle wijzigingen op de huidige regel ongedaan

Een teken boven de cursor verwijderen

In de invoermodus worden alle op het toetsenbord getypte tekens in de tekst ingevoegd.

In de laatste regelmodus verschijnt de opdracht die u invoert op de laatste regel van het scherm.

6. Hulp

Unix heeft een elektronische directory met een beschrijving van het doel van commando's, hun syntaxis, gebruiksvoorbeelden, enz. De directory wordt aangeroepen door het man-commando:

7. Basis shell-opdrachten

WHO– het weergeven van informatie over actieve gebruikers;

echo– berichten naar de terminal sturen;

spandoek– berichten in hoofdletters naar de terminal sturen;

man– het online helpsysteem bellen;

datum – uitvoer van de huidige datum;

schrijven– overdracht van berichten naar de terminal van een andere gebruiker;

bericht– het toestaan/verbieden van de weergave van berichten van andere gebruikers;

mail– het verzenden/ontvangen van post;

nieuws– kennismaking met systeemnieuws;

pwd– weergave van de absolute routenaam van de huidige werkmap;

CD– het wijzigen van de werkmap;

ls– informatie weergeven over de inhoud van de directory;

mkdir– het maken van een catalogus;

rmdir– een map verwijderen;

aanraken– het bijwerken van de tijdstempel van het bestand;

cp– bestanden kopiëren;

kat– het combineren en weergeven van de inhoud van bestanden;

meer– Pagina-voor-pagina weergave van de bestandsinhoud.

mv – een bestand verplaatsen of hernoemen;

rm– bestandsverwijdering;

alias– het aanmaken van een pseudoniem;

tr– karakterconversie;

Uitgang– voltooiing van de stroom schelp-A;

tee– onderschepping van pijplijnresultaten;

snee – velden uit een rij selecteren;

grep– zoeken op sjabloon;

pr– voer het bestand uit naar standaarduitvoer in een gespecificeerd formaat;

soort– sorteren;

hoofd– uitvoer van de eerste regels van het bestand;

staart– uitvoer van de laatste regels van het bestand;

WC– het tellen van het aantal tekens, woorden en regels;

lezen, echo - variabele waarden lezen en uitvoeren;

test- het evalueren van de betekenis van een uitdrukking;

uitspr, laten- berekening van rekenkundige uitdrukkingen;

8. Schelp-programma's

Met Shell kunt u een reeks opdrachten in een bestand opslaan en deze vervolgens uitvoeren. Om een ​​bestand uit te voeren met een shell-programma voor uitvoering, moet u het uitvoerrecht toevoegen aan de toegangsrechten:

$ chmod +x programmabestandsnaam

Vertakkingen in shell-programma's worden georganiseerd met behulp van de volgende operatoren:

als-dan-anders

Lusoperatoren:

OEFENINGEN

1. Welke van de volgende opdrachten zorgt ervoor dat er een welkomstbericht op het scherm wordt weergegeven? Welke niet? Waarom?

$echo hallo

$ echo hallo

$ echo HALLO, WERELD

$ spandoek Hallo

$ BANNER HALLO, WERELD

2. Druk een bericht af over meerdere regels met behulp van opdrachten echo En spandoek.

3. Druk de datum in twee regels af: op de eerste regel dag, maand, jaar, op de tweede regel huidige tijd, waarbij u de uitvoer van commentaar voorziet.

4. Met behulp van de opdracht schrijven, stuur een bericht naar de console. Stuur tegelijkertijd berichten naar meerdere terminals.

5. Met behulp van de opdracht bericht, bepaal of berichten zijn toegestaan ​​op uw terminal. Berichten verbieden. Wat zal de reactie van het systeem zijn als iemand u een bericht probeert te sturen?

6. Bepaal je naam THUIS- catalogus.

7. Blader door de substructuur van de map, beginnend bij de map /export/home, met behulp van de opdrachten cd, ls En pwd.

8.. Creëer in jouw THUIS-directory-submappen van het formulier:

fruitbloemen

appel peer druiven roos violet paardenbloem

donkergroen

9. In je eentje zijn THUIS-directory, maak de volgende submappen aan met behulp van één opdrachtregel:

A/B/C/D

10. In je eentje zijn THUIS-directory, verwijder alle submappen van de map A.

11. Terwijl je binnen bent THUIS-map, maak een bestand Macintosh in de bestaande catalogus appel en verschillende bestanden in mappen donker En groente. Log in op de map Fverlaagt. Terwijl u zich in de map bevindt Fverlaagt, kopieer alle submappen Fruit samen met de bestanden daarin in een speciaal gemaakte map mand.

12. Terwijl u zich in het telefoonboek bevindt Fverlaagt, verwijder de map Fruit.

13. Lees het bestand .profiel met behulp van commando's kat En meer.

14. Creëer binnen THUIS-directory tekstbestand mijnbestand van meerdere regels met behulp van de opdracht kat. Maak een tekstbestand MjFile, door er dezelfde regels in te schrijven. Hoeveel bestanden heb je gekregen? Waarom?

15. Bekijk de inhoud van het bestand dat is gemaakt in taak 2.2 mijnbestand. Kopieer het bestand mijnbestand archiveren mijnkopie. Bekijk de inhoud van beide bestanden.

16. Verplaats het bestand mijnkopie naar de catalogus bloemen.

17. Terwijl je binnen bent THUIS-catalogus, maak een link Mjlink per bestand mijnkopie bevindt zich in de map bloemen. Bekijk het linkbestand.

18. Voeg een regel toe aan het bestand Mijnlink. Welke van de bestanden Mijnlink,Mijnkopiëren,Mijnbestand veranderd? Waarom?

19. Met welk commando kun je het aantal links bepalen? Bepaal het aantal links voor bestanden Mijnlink,Mijnkopiëren,Mijnbestand.

Verwijder het bestand mijnkopie. Wat is er met het linkbestand gebeurd? Bepaal het aantal links voor bestanden Mijnlink,Mijnbestand.

20. Maak een alias richt, waarmee de inhoud van de huidige map in een uitgebreid formaat wordt afgedrukt.

21. Log uit en log opnieuw in. Werkt alias? richt? Wat moet er worden gedaan om ervoor te zorgen dat de bijnaam tussen sessies niet verloren gaat?

22. Maak een alias punt, waarmee een lijst met bestanden in de werkmap wordt afgedrukt waarvan de namen met een punt beginnen.

23. Gebruik van de opdracht aanraken, maak bestanden in een nieuwe map met namen zodat tegelijkertijd:

Sjabloon A* 5 bestanden overeenkomen;

Sjabloon * A kwam overeen met 4 bestanden;

Sjabloon ??.? gematchte 3 bestanden;

Sjabloon * aa* kwam overeen met 2 bestanden;

Sjabloon??? komt overeen met 1 bestand.

24. Welk commando moet je invoeren om het volgende te doen:

a) geef de namen van alle bestanden weer, beginnend met een punt;

b) geef de namen weer van alle bestanden die eindigen op “.txt”;

c) geef de namen weer van alle bestanden die het woord bevatten "Mijn";

25. Vervang in het ene bestand alle kleine letters door hoofdletters, en in een ander bestand alle hoofdletters door kleine letters. Verwijder eventuele dubbele spaties uit het bestand.

26. Maak een bestand met de naam * . Verwijder alleen dit bestand. Wees voorzichtig bij het gebruik van tekens voor het genereren van bestandsnamen!

27. Maak een bestand met een spatie in de naam. Hoe verwijder je zo'n bestand?

28. Het commando gebruiken kat verdubbel de inhoud van een bestand door de originele inhoud aan het einde van hetzelfde bestand toe te voegen. Ga naar de map bloemen. Toevoegen aan bestand Spisok lijst met directory-inhoud bloemen. Bekijk de inhoud van het bestand

29. Probeer te lezen met behulp van de opdracht kat niet-bestaand bestand. Wat is de reactie van het systeem? Doe hetzelfde door foutmeldingen om te leiden naar een bestand mijn fout. Wat zie je op het scherm? Bekijk het bestand mijn fout.

30. Maak een pijplijn om alleen de namen en machtigingen weer te geven van de bestanden die zich momenteel in uw werkmap bevinden.

31. Wijzig de gebouwde pijplijn zodat de lijst in een bestand wordt opgeslagen Spisok jouw THUIS-directory, en alleen het aantal bestanden in de lijst werd op het scherm weergegeven.

32. Geef de inhoud van een bestand weer /etc/passwd, gesorteerd op gebruikersnaamveld.

33. Maak een alias ingelogdop, waarmee een alfabetisch geordende lijst met namen wordt weergegeven van gebruikers die op het systeem werken.

33. Geef de huidige datum in hoofdletters weer met behulp van opdrachten datum En spandoek.

34. Wijs toe aan een variabele IK BEN Uw registratienaam. Lanceer er nog een schelp. Zie je deze variabele? Wat moet u doen om het in het gegenereerde bestand te zien schelp? Verander de waarde van een variabele IK BEN in de gegenereerde schelp. Kom uit de verwekte schelp. Kijk naar de waarde van deze variabele in de bron schelp. Verklaar het resultaat.

35. Schrijf schelp-programma informatie, waarin de gebruiker wordt gevraagd naam, adres, datum, maand en geboortejaar in te voeren en deze informatie in de omgekeerde volgorde weer te geven

36. Schrijf schelp- een programma dat een prompt voor het invoeren van een getal weergeeft en het ingevoerde getal in een variabele opslaat Y en druk een bericht af “Y is groter dan 7”, als waarde Y meer dan 7, en “J welniet groter dan 7” anders.

37. Schrijf een shellprogramma dat de volgende statistieken weergeeft:

a) uw naam;

b) het aantal argumenten waarmee het wordt gelanceerd;

c) drukt elk van zijn argumenten en de lengte van het argument in karakters af;

38. Schrijf schelp- een programma dat het aantal argumenten op de opdrachtregel bepaalt en een foutmelding weergeeft als het aantal argumenten niet drie is, of de argumenten zelf als het aantal drie is.

39. Schrijf schelp- een programma dat u vraagt ​​een gebruikers-ID in te voeren, de ID te vergelijken met de ID's die in het systeem worden gebruikt en de volledige naam weer te geven THUIS-directory of, in het geval van een ongeldige ID, een foutmelding weergeven.

40. Schrijf een shellprogramma Hallo, dat het volgende antwoord geeft op opdrachtregelargumenten:

Argument "-D"- het programma voert de opdracht uit datum;

Argument “-l”- het programma geeft de inhoud van de huidige map weer;

    Als er geen argumenten of ongeldige argumenten op de opdrachtregel staan, drukt het programma hulp af over de opties.

41. Schrijf een programma woorden, waardoor de gebruiker wordt gevraagd één woord tegelijk in te voeren totdat hij het woord invoert einde. Onthoud alle woorden die u hebt ingevoerd. Na het invoeren van een woord einde alle ingevoerde woorden op het scherm weergeven.

42. Wijzig de systeemprompt zodat deze de volledige padnaam van de huidige werkmap bevat .

43. Schrijf een programma virus, dat een uitvoerbare kopie van zichzelf maakt met een andere naam en zichzelf vervolgens verwijdert.

44. Schrijf een programma virus2 , dat in de huidige map zoekt naar commandotaalprogramma's en aan hun tekst een commando toevoegt om het woord weer te geven Besmet!”.

45. Schrijf een programma virus3 , dat zijn eigen code toevoegt aan de commandotaalprogramma's die het vindt om andere programma's te infecteren.

46. ​​Schrijf een programma virus4 , door uw virus zo aan te passen dat bij infectie de infecterende code uit het infecterende programma wordt verwijderd.

47. Schrijf een programma antivirusprogramma, waarmee alle shell-programma's worden gevonden die met uw virus zijn geïnfecteerd.

48. Pas het ontwikkelde programma zo aan dat het niet alleen geïnfecteerde programma's vindt in de opgegeven directory, maar deze ook “geneest” door de geïnfecteerde versie op te slaan in een nieuw bestand met de uitgang toegevoegd aan de naam . vir, en het verwijderen van het uitvoeringskenmerk uit een dergelijk bestand.

49. Schrijf een programma virus5 , wat:

a) zou shell-programma's in de huidige map en de submappen ervan alleen met een virus infecteren als de gebruiker de opdracht invoerde ls;

b) zich als een team zou gedragen ls, zonder iets over uw werk op de terminal te onthullen.

50. Schrijf een virus6-programma op basis van de programma's virus2 -virus5 , waarvan de infecterende code niet kon worden gedetecteerd door het programma dat u hebt ontwikkeld antivirusprogramma, en infectie zou optreden voor elke waarde van de variabele PAD.

51. Schrijf een programma supervirus, waarvan de lancering uw bestanden infecteert met het virus dat in de vorige taak is ontwikkeld, en elke keer dat u zich aanmeldt bij het systeem, wordt er een poging gedaan om de bestanden van uw vrienden te infecteren. Programma supervirus wist zichzelf na de eerste lancering.

52. Schrijf een programma superantivirus, dat alle bestanden in de opgegeven map en de submappen ervan detecteert en volledig “geneest” (als de juiste optie is opgegeven) van alle ontwikkelde virussen.