Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • Erori
  • Comenzi shell Ubuntu. Cum să automatizezi operațiunile de backup programate

Comenzi shell Ubuntu. Cum să automatizezi operațiunile de backup programate

De îndată ce vine vorba de dispozitiv Linuxși munca mai mult sau mai puțin profesională cu acest OS, în exemple linia de comandă apare imediat și începe să domine. Din care este ușor de concluzionat că aceasta este interfața principală (și standard) de gestionare a sistemului în Linux. Probabil că același cititor priceput se va întreba - cine execută comenzile introduse Linie de comanda? Răspunsul „sistem” va fi incorect: în Linux nu există niciun obiect separat numit „sistem”. Un sistem este un sistem deoarece este format din numeroase componente care interacționează între ele.

Răspunsul corect, ca de obicei, se dovedește a fi mai complex. Este nevoie de un sistem de operare în special pentru ca programele să poată fi scrise fără să se gândească la detaliile computerului și părților sale, pornind de la procesor și hard disk (să zicem, la nivel de „fișier deschis”, și nu secvența de comenzi pentru misca capul hard disk). Sistemul de operare gestionează hardware-ul în sine și oferă programelor un „limbaj” de un nivel destul de ridicat de abstractizare care acoperă toate nevoile lor, așa-numitele. API. Dar un astfel de limbaj nu este potrivit pentru comenzile utilizatorului, deoarece este încă la nivel prea scăzut (pentru a rezolva chiar și cea mai simplă sarcină de utilizator, trebuie efectuate mai multe astfel de operațiuni) și poate fi folosit doar prin scrierea unui program (cel mai adesea în limbajul C). Este necesar să se inventeze un limbaj de control al sistemului diferit - de nivel superior și mai convenabil - pentru utilizator. Toate comenzile care pot fi introduse pe linia de comandă sunt formulate în acest limbaj.

Din care este ușor pentru cititorul priceput să tragă concluzia că proces aceste comenzi, care le traduc în limba sistemului de operare, trebuie să fie și ele program special, și cu acesta utilizatorul conduce un dialog atunci când lucrează cu linia de comandă. Așa este: acest program este numit interpret de linie de comandă sau shell de comandă("coajă"). Se numește „shell” tocmai pentru că întregul control al sistemului are loc ca și cum „din interiorul” acestuia: utilizatorul comunică cu acesta într-o limbă convenabilă pentru el (folosind o linie de comandă text) și comunică cu alte părți ale sistemului. sistem într-o limbă convenabilă. lor limba (prin apelarea funcțiilor programate).

Desigur, există mai multe interprete de comenzi în Linux. Cel mai simplu dintre acestea, care a apărut în versiunile timpurii ale UNIX, a fost numit sh, sau „Bourne Shell” - după numele autorului său, Stephen Bourne. De-a lungul timpului, a fost - ori de câte ori a fost posibil - înlocuit cu unul mai puternic, bash, „Bourne Again Shell” (2) bash este superior sh în orice, mai ales în capacități editare Linie de comanda. Pe lângă sh și bash, „The Z Shell”, zsh, poate fi instalat pe sistem. cel mai un interpret de comandă puternic astăzi (fără glumă, 22 de mii de linii de documentație) sau tcsh, o versiune actualizată și, de asemenea, foarte puternică a vechiului „C Shell”, a cărui sintaxă de comandă este similară cu limbajul de programare C.

Sintaxa liniei de comandă

Deci, care este acest limbaj mai ușor de utilizat? Mai presus de toate, comunicarea în această limbă seamănă cu un dialog scris cu sistemul - schimbul de texte unul câte unul. Un enunț de utilizator în această limbă este o comandă, fiecare comandă este o linie separată. Încă neapasat introduce, șirul poate fi editat și apoi trecut în shell. Coajă dezasambla comanda primită - o traduce în limbajul obiectelor și funcțiilor sistemului și apoi o trimite sistemului pentru execuție.

Rezultatul executării multor comenzi este, de asemenea, text care este emis ca „răspuns” către utilizator. Deși acest lucru nu este necesar, echipa își poate desfășura munca complet în tăcere. În plus, dacă au apărut anumite circumstanțe speciale (cum ar fi o eroare) în timpul execuției comenzii, shell-ul va include în răspunsul către utilizator. mesaje de diagnostic.

Comandă și parametri

Cea mai simplă comandă constă dintr-un „cuvânt”, de exemplu, comanda cal, care afișează calendarul lunii curente.

$cal
iunie 2008
Dumi Luni Mar Mier Joi Vin S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

$

Exemplul 1. comanda cal


Ce se întâmplă dacă trebuie să te uiți la calendarul pentru luna următoare? Așa este, nu ar trebui să inventați o comandă separată pentru aceasta, cal va face față destul de bine acestei sarcini, doar comportamentul său trebuie să fie ușor modificat:

$ cal 7 2008
iulie 2008
Dumi Luni Mar Mier Joi Vin S
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

Exemplul 2. comandă cal cu parametri


Se pare că comanda cal 7 2008 constă din cel puțin două părți - comanda cal în sine și „toate celelalte”. Acest rest care urmează comenzii este apelat parametrii(sau argumente), și sunt introduse pentru a modifica comportamentul comenzii. În cele mai multe cazuri, atunci când analizați linia de comandă primul cuvântul este considerat numele comenzii, iar restul sunt parametrii acesteia.

Cuvinte

Când analizează linia de comandă, shell-ul folosește conceptul delimitator(delimitator). Un delimitator este un caracter care separă cuvintele; deci linia de comandă este secvența cuvinte(care contează) și separatoare(ceea ce nu contează). Pentru shell, delimitatorii sunt caracterul spațiu, caracterul tabulator și caracterul newline. Numărul de separatori dintre două cuvinte adiacente nu contează.

Pentru ca separatorul să fie interior cuvinte (și șirul delimitat rezultat a fost trecut ca unu parametru), întregul subșir necesar trebuie să fie înconjurat cu ghilimele simple sau duble: $ echo Unu Doi Trei
Unu, doi, trei
$ echo One „Doi trei”
Unu, doi, trei
$ echo „Unul
>
> Oh. Deci, ce urmează?
> O, am uitat ghilimele!"

Exemplul 3. Citate pe linia de comandă


Toate acestea înseamnă că comanda are atâția parametri ca cuvinte din punctul de vedere al shell-ului îl urmează pe linia de comandă. Primul cuvânt din triplu este transmis comenzii ca prim parametru, al doilea - ca al doilea etc. În primul caz, comanda ecou a fost transmisă Trei parametri - „Unul”, „Doi” și „Trei”. Le-a scos afară, despărțindu-le cu un spațiu. În al doilea caz, parametrii au fost Două: „Unul” și „Doi Trei”. Ca urmare, acestea Două parametrii au fost de asemenea afișați separați printr-un spațiu. În al treilea caz, parametrul a fost doar unu- de la apostroful de deschidere „Unul” la apostroful de închidere „...am uitat!” " Tot timpul în care am tastat, bash a dat cu ajutor un prompt „>” - un semn că tastarea liniei de comandă a continuat, dar în modul de introducere a conținutului ghilimelelor.

Chei

Pentru a rezolva probleme diferite, aceleași acțiuni trebuie efectuate ușor diferit. De exemplu, pentru a sincroniza munca în puncte diferite pe tot globul, este mai bine să folosiți aceeași oră pentru toată lumea (Greenwich Mean Time) și să vă organizați propria zi de lucru - ora locală (ținând cont de schimbarea fusului orar și diferența dintre ora de iarnă și cea de vară). Ambele ori sunt afișate de comanda dată, doar pentru a funcționa în ora Greenwich este nevoie de parametrul suplimentar „-u” (alias „--universal”).


Luni 16 iunie 18:03:44 MSD 2008
$date -u
Luni, 16 iunie 14:03:46 UTC 2008

Exemplul 4. comanda data cu cheie


Acest tip de parametri sunt numiti modificatori de execuție sau chei(Opțiuni) . Cheia aparține acestei comenzi specifice și nu are nicio semnificație în sine, cum diferă de alți parametri (de exemplu, nume de fișiere, numere) care au proprii adică independent de orice comandă. Fiecare comandă poate recunoaște un anumit set de taste și își poate schimba comportamentul în consecință. Ca rezultat, „același” comutator, de exemplu „-s”, poate însemna lucruri complet diferite pentru diferite comenzi.

Nu există un standard strict pentru formatul cheii, dar există acorduri pe care este indecent să le încălcați în timpul nostru. În primul rând, dacă parametrul începe cu „-”, acesta este - cheie cu o singură literă. „ - ” este de obicei urmat de un caracter, cel mai adesea o literă, indicând acțiunea sau proprietatea pe care această tastă o dă comenzii. Acest lucru face mai ușor să distingeți cheile de alți parametri - atât pentru utilizator când tastează linia de comandă, cât și pentru programator, autorul comenzii.

În al doilea rând, este de dorit ca numele cheii să fie plin de înțeles- de regulă, aceasta este prima literă a numelui acțiunii sau proprietății desemnate de cheie. De exemplu, comutatorul „ -a ” la om și cine vine de la cuvântul „ A ll" (totul) și schimbă modul în care funcționează aceste comenzi, astfel încât să înceapă să arate informații care sunt de obicei păstrate tăcute. Și în cal și cine comandă sensul comutatorului „-m” este diferit:

$cine -m
methody tty1 20 septembrie 13:56 (localhost)
$ cal -m
iunie 2008
Luni Mar Mier Joi Vin Sam Dum
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30

Exemplul 5. Folosind comutatorul „-m” în diferite comenzi


Pentru cine comutatorul „-m” înseamnă „ M e”, adică „Eu”, și ca urmare cine lucrează similar cu whoami. Iar pentru cal, tasta „-m” este o comandă pentru afișarea unui calendar, numărând ca prima zi luniM astăzi"), așa cum se obișnuiește în Rusia.

Se numește proprietatea unei chei de a fi, pe de o parte, extrem de scurtă și, pe de altă parte, informativă abreviere. Nu numai comutatoarele, ci și numele celor mai comune comenzi Linux au această proprietate.

În al treilea rând, uneori un comutator modifică comportamentul unei comenzi în așa fel încât interpretarea parametrului care urmează acelui comutator pe linia de comandă se schimbă și ea. Arată ca o cheie eu insumi primește un parametru, astfel încât cheile de acest tip sunt apelate parametrice. De regulă, parametrii lor sunt nume de fișiere pentru diverse aplicații, caracteristici numerice și altele valorile, care trebuie transmise echipei. - ora 00:00
data: data nu poate fi setată: operațiunea nu este permisă
Luni, 16 iunie 00:00:00 MSK 2008
$date
Luni 16 iunie 18:30:53 MSK 2008

Exemplul 6. Folosind data -s


Opțiunea „-s” a comenzii date vă permite să setați timpul sistemului la valoarea care este specificată ca parametru al acestei chei. Cu toate acestea, în în acest exemplu această operațiune a eșuat, așa cum demonstrează rezultatul mesaj de eroare. Sunt necesare privilegii pentru a schimba ceasul sistemului administrator de sistem, iar în exemplul nostru această comandă a fost executată ca un utilizator obișnuit. Cu toate acestea, data arăta în continuare ora care trebuia setată, chiar dacă ceasul sistemului a rămas neschimbat.

Abrevierea cheilor este greu de menținut atunci când echipa le are prea mult mult. Câteva scrisori alfabet latin(de exemplu, „s” sau „o”) sunt folosite foarte des și ar putea servi ca abreviere pentru mai multe comenzi simultan, dar unele (de exemplu, „z”) sunt folosite rar, este dificil de găsit un nume semnificativ pentru ei. Pentru un astfel de caz mai este altul lungime completă format: cheia începe cu Două un semn „-” urmat de complet numele entității pe care o denotă. Acesta este, de exemplu, comutatorul „--help” (analog cu „-h”): $ cap --ajutor
Utilizare: cap [CHEIE]... [FIȘIER]...
Imprimă primele 10 linii ale fiecărui FIȘIER la ieșire standard.
Dacă sunt specificate mai multe FIȘIERE, imprimă mai întâi un antet cu numele fișierului.
Dacă FILE nu este specificat sau este specificat ca -, citește intrarea standard.

Argumentele care sunt necesare pentru tastele lungi sunt necesare și pentru tastele scurte.
-c, --bytes=[-]N imprimă primii N octeți ai fiecărui fișier;
ultimii octeți ai fiecărui fișier
-n, --lines=[-]N imprimă primele N linii ale fiecărui fișier, nu 10;
dacă N este precedat de `-", imprimați totul, cu excepția N
ultimele rânduri ale fiecărui fișier
-q, --quiet, --silent nu imprimă anteturi cu nume de fișiere
-v, --verbose imprimă întotdeauna antetele cu nume de fișiere
--help arată acest ajutor și ieși
--version arată informații despre versiune și ieșire

N poate avea un sufix multiplicator: b 512, k 1024, m 1024*1024.

Vă rugăm să raportați erori la: .

Exemplul 7. Cheie-ajutor


Puteți vedea că unele taste de cap au atât formate cu o singură literă, cât și cu cuvinte întregi, iar unele au doar formate cu cuvinte întregi. Acesta este ceea ce se întâmplă de obicei: cheile utilizate frecvent au o abreviere, dar cele rare nu. Valori parametrice cuvânt întreg Se obișnuiește să se transmită cheile nu folosind următorul parametru de linie de comandă, ci folosind construcția „=”. sens” imediat după cheie.

În al patrulea rând, există câteva acorduri mai puțin rigide, dar populare sens chei. Comutați „-h” (“ H elp") de obicei (dar, din păcate, nu întotdeauna) provoacă lansarea comenzilor informatie scurta. În cele din urmă, poate fi necesar să spuneți echipei parametru, nu cheie, incepand cu "-". Pentru a face acest lucru, trebuie să utilizați comutatorul „--”: $ head -1 -nume fișier-cu-
head: opțiune invalidă --f
Încercați `head --help" pentru mai multe descriere detaliata.
$ head -1 -- -filename-with-
Prima linie a fișierului -filename-with-

Exemplul 8. Parametrul nu este o cheie care începe cu „-”


Comutatorul „-” (primul „-” este un semn al unei taste, al doilea este cheia însăși) împiedică, în general, comanda să interpreteze toți parametrii ulterioare ai liniei de comandă ca comutatoare, indiferent dacă încep cu „-” sau nu . Numai după „ -- ” head a fost de acord că -filename-with- este un nume de fișier.

Rezumat

Din toate cele de mai sus, este clar că fiecare comandă are propriul său limbaj mic - constă din acele chei și parametri obligatorii și opționali pe care comanda îi acceptă și interpretează. Pentru a oferi o privire de ansamblu rapidă asupra capabilităților comenzii, oferă diverse documentații Linux rezumat- o listă concisă a tuturor parametrilor de comandă posibili. Arata cam asa:

Cal [-smjy13] [an]

Exemplul 9. Sinopsis pentru comanda cal


Sinopsisul dă oficializate descrierea modului de utilizare a obiectului (cu în acest caz,- cum și cu ce parametri să rulați comanda cal). Parametrii sunt enumerați în aceeași ordine în care trebuie introduși pe linia de comandă, parametrii opționali sunt de obicei dați între paranteze drepte, parametrii obligatorii sunt dați deloc fără paranteze, iar pentru compactitate cheile sunt colectate într-un singur parametru, în care fiecare litera este o cheie separată. Exemplul de mai sus arată astfel: comanda cal nu are parametrii necesari, există comutatoare (opționale) (-s, -m, etc.) și un parametru opțional de an, care poate fi precedat de o lună opțională (dar luna nu poate fi specificată fără un an).

De unde vin comenzile?

După ce a terminat de citit secțiunea anterioară, cititorul priceput ar fi trebuit să se gândească la ceva de genul acesta: da, ei bine, am rezolvat puțin cu comenzile și parametrii (adică, gramatica liniei de comandă), acum înarmați-ne cu o listă cu toate comenzile Linux. (cu alte cuvinte, un dicționar), și noi Să ne apucăm de treabă. De ce nu este publicată nicăieri o astfel de listă? Mai exact, există multe liste diferite de comenzi și toate sunt evident incomplete și nu sunt de acord cu totul. Răspunsul la această întrebare are două părți.

Partea 1: Comenzi și utilitare

Shell, interpretul de comenzi, este un „shell” nu numai pentru utilizator, ci și pentru comenzi: el însuși nu execută aproape nicio comandă, ci le transmite sistemului. Sarcina sa este să analizeze linia de comandă, să extragă comanda și parametrii din ea și apoi să ruleze utilitate- un program al cărui nume se potrivește cu numele comenzii.

Dacă te uiți „din interior” interpretorului de comandă, atunci lucrul cu linia de comandă merge cam așa: utilizatorul introduce o linie (comandă), shell-ul o citește, uneori o convertește în anumite reguli, împarte șirul rezultat într-o comandă și parametri, apoi lansează utilitarul, transmițându-i acești parametri. Utilitarul, la rândul său, analizează parametrii, identifică cheile dintre ei și face ceea ce i s-a cerut, afișând simultan date pentru utilizator și apoi se încheie. La finalizarea utilitarului, lucrarea interpretorului de comenzi „recedat în fundal” se reia, citește din nou linia de comandă, o analizează, apelează comanda... Aceasta continuă până când utilizatorul dă o comandă shell-ului Sfârşitîn sine (folosind comanda de deconectare sau caracterul de control Ctrl+D).

Cu toate acestea, shell-ul încă execută unele comenzi (mai mici) în mod independent, fără a apela nicio utilitate. Unele dintre cele mai utile comenzi sunt încorporate în bash, chiar dacă sunt disponibile ca utilități (de exemplu, echo). Comanda încorporată funcționează în același mod, dar din moment ce durează mult mai puțin timp pentru execuție, interpretul de comenzi o va alege dacă este posibil. În bash, tipul unei comenzi poate fi determinat folosind comanda type. Comenzile native ale lui Bash sunt apelate incorporat(comandă încorporată), iar pentru utilitare se afișează cale, care conține numele directorului în care se află fișierul cu programul corespunzător și numele acestui program. Tasta „-a” (“ A ll", desigur), face ca tipul să iasă Toate opțiunile posibile pentru interpretarea comenzii și comutatorul „-t” - afișează tipul comenzii în loc de cale.

$typedate
informațiile sunt /bin/date
$tip ecou
echo este un shell încorporat
$ tip -a ecou
echo este un shell încorporat
echo este /bin/echo
$ tip -a -t echo
incorporat
fişier

Exemplul 10. Definirea tipului de comandă


Există puține comenzi native în interpretul de comenzi. Practic, aceștia sunt operatori de limbaj de programare și alte mijloace de control al interpretului în sine. Toate comenzile care fac o muncă semnificativă pentru utilizator sunt reprezentate în Linux ca utilitati individuale. Iată prima parte a răspunsului la întrebarea despre toată lumea comenzi Linux: Sunt tot atâtea câte programe (utilități) sunt scrise pentru Linux. Lista lor este o listă de utilități instalate pe sistem și în sisteme diferite va fi diferit.

Partea 2: există un ghid pentru toate

Fiecare obiect de sistem: toate utilitati, Toate demoni Linux, toate funcțiile miezuriȘi biblioteci, structura majoritara fișierele de configurare În cele din urmă, multe concepte speculative, dar importante, trebuie să fie însoțite de documentație care să le descrie scopul și metodele de utilizare. Prin urmare, utilizatorul sistemului nu este necesar memora toate opțiunile posibile pentru a interacționa cu acesta. Suficient a intelege principiile de bază ale structurii sale și să poată găsi informații de referință. Einstein a spus asta despre asta: „De ce să vă amintiți ceva care poate fi întotdeauna căutat într-o carte de referință?”

Cel mai variat informatii utile continute in pagini de manual (pagini de manual). Fiecare pagină a manualului (pentru concizie, pur și simplu „manual”) este dedicată unui singur obiect al sistemului. Pentru a vizualiza pagina de manual, trebuie să lansați comanda man un obiect : $ man cal
CAL(1) Manual de comenzi generale BSD CAL(1)

NUME
cal - afișează un calendar

REZUMAT
cal [-smjy13] [an]

DESCRIERE
Cal afișează un calendar simplu. Dacă argumentele nu sunt specificate,
este afișată luna curentă. Opțiunile sunt următoarele:
. . .

Exemplul 11. Vizualizarea paginii de manual


„Pagina de manual” ocupă de obicei mai mult de o pagină ecran. Pentru a face lectura mai convenabilă, man lansează un vizualizator de text pagină cu pagină - mai puțin. Operarea programului mai puțin este simplă: paginile sunt răsucite cu o bară de spațiu, iar când te-ai săturat de citit, trebuie să apeși „q” (Ieșire). De asemenea, puteți întoarce paginile folosind tastele. Pagină sus / In josul paginii, a trece prin unu poate fi folosită linia înainte introduce sau o săgeată în jos și o linie înapoi - o săgeată în sus. Trecerea la începutul și sfârșitul textului se realizează folosind comenzile „g” și respectiv „G” (Go). Lista plina ceea ce puteți face cu text în mai puțin este afișat folosind comanda „H” (Ajutor).

Pagina de manual este formată din câmpuri- secțiuni standard care descriu obiectul din diferite părți. Când studiați manualul pentru prima dată, ar trebui să începeți cu câmpurile NUME (o scurtă descriere a obiectului) și DESCRIERE (o descriere detaliată a obiectului, suficientă pentru a-l utiliza). Unul dintre cele mai importante câmpuri din manual se află la sfârșitul textului. Dacă, în timp ce citește NUME sau DESCRIERE, utilizatorul își dă seama că nu a găsit ceea ce căuta în manual, poate dori să vadă dacă există alte manuale sau alte surse de informare pe aceeași temă. O listă cu astfel de surse este conținută în câmpul VEZI ȘI:

$man om
. . .
VEZI SI
apropos(1), whatis(1), less(1), groff(1), man.conf(5).
. . .

Exemplul 12. VEZI ȘI câmpul manualului


În câmpul VEZI ȘI au existat link-uri către manuale despre less, groff (program de formatare a paginii de manual), structură Fișier de configurare for man , precum și cele două comenzi însoțitoare whatis și apropos , care vă ajută să găsiți manualul de care aveți nevoie. Ambele lucrează cu o bază de date formată din câmpurile NUME ale tuturor paginilor de manual din sistem. Diferența dintre ele este că whatis caută numai printre numele obiectelor (în stânga părți ale câmpurilor NUME) și, apropo, în întreaga bază de date. Ca rezultat, whatis are o listă scurte descrieri obiecte cu nume, inclusiv cuvântul căutat, și apropos - o listă în care acest cuvânt menționat.

Pot exista mai multe obiecte în sistem diverse tip, dar cu același nume. Numele coincid adesea, de exemplu apeluri de sistem(funcții miezuri) și utilitare care vă permit să utilizați aceste funcții din linia de comandă. Când se face referire la un manual pentru un obiect sistem, se obișnuiește ca imediat după numele obiectului să se pună între paranteze numărul secțiunii care conține manualul pentru acest obiect: man(1) , less(1) , passwd(5). ). Acest format facilitează recunoașterea faptului că este vorba despre un manual.

Sistemul manual Linux are nouă secțiuni, fiecare conținând pagini de manual pentru obiecte anumit tip. Toate secțiunile conțin un manual numit „intro”, în care vedere generala iar exemplele arată cu ce fel de obiecte sunt legate aceasta sectiune. O listă de secțiuni cu nume poate fi obținută cu comanda whatis intro.

În mod implicit, omul trece prin toate secțiunile și arată găsit prima dată management cu prenume. Pentru a vizualiza manualul pentru un obiect dintr-o anumită secțiune, trebuie să specificați numărul secțiunii ca prim parametru al comenzii man, de exemplu, man 8 passwd .

O altă sursă de informații despre Linux și programele sale componente este subsistemul info help. Pagina manuală, în ciuda abundenței de link-uri de diferite tipuri, rămâne un text „liniar”, structurat doar logic. Documentul informativ este un adevărat hipertext, în care sunt multe pagini mici combinate într-un copac. Fiecare secțiune a documentului informativ are întotdeauna un cuprins, din care puteți merge direct la subsecțiunea dorită, de unde vă puteți întoarce oricând înapoi. În plus, documentul informativ poate fi citit ca continuu text, astfel încât fiecare subsecțiune are legături către subsecțiunile anterioare și ulterioare. Se poate ghici asta ghid detaliat Cum să navigați între pagini în info poate fi obținut cu comanda info info. Comanda info, introdusă fără parametri, oferă utilizatorului o listă cu toate documentele info instalate în sistem.

Dacă un obiect de sistem nu are documentație nici în format man sau în format info, nu este bine. În acest caz, se poate spera că a făcut-o Documentatie explicativa, care, din păcate, nu are un format standard, cu atât mai puțin link-uri către manuale pentru alte obiecte de sistem. O astfel de documentație (precum și exemple de utilizare a obiectului) este de obicei plasată în directorul /usr/share/doc/ nume_obiect .

Documentația este scrisă în mare parte în limba engleză simplă. Dacă engleza nu este limba maternă pentru autorul documentației, va fi doar mai simplu. Tradiția scrierii în limba engleză provine din contribuția considerabilă a Statelor Unite la dezvoltarea informaticăîn general și Linux în special. În plus, engleza devine limba de comunicare internațională în toate domeniile, nu doar computerele. Necesitatea de a scrie într-un limbaj care va fi mai mult sau mai puțin de înțeles pentru majoritatea utilizatorilor se explică prin dezvoltarea constantă a Linux. Nu este că pagina de manual nu poate fi tradusă, ci că va trebui tradusă de fiecare dată, când obiectul pe care îl descrie se schimbă! De exemplu, lansarea unei noi versiuni a unui produs software este însoțită de o modificare a capabilităților și caracteristicilor sale de operare și, în consecință, de o nouă versiune a documentației. Apoi traducere Această documentație se transformă într-o „țintă în mișcare”, o sarcină Sisyphean.

Cu toate acestea, unele dintre cele mai actuale manuale există încă în traducere în limba rusă. Cele mai recente versiuni ale unor astfel de traduceri în limba rusă sunt colectate în pachetul man-pages-ru - trebuie doar să instalați acest pachet, iar acele manuale pentru care există o traducere vor fi afișate implicit de către man în limba rusă.

variabile de mediu

Pe lângă parametrii trecuți pe linia de comandă, în Linux există o altă modalitate de a modifica comportamentul programului - pentru aceasta utilizați variabile de mediu. Pentru a explica principiul de funcționare a variabilelor de mediu, este necesară o scurtă excursie în mecanismul de interacțiune între procese în Linux.

Programul care rulează este numit în Linux proces. Sistemul oferă fiecărui proces lansat un anumit spațiu de informații, pe care acest proces are dreptul să îl modifice după bunul plac - acesta este mediu inconjurator(în mediu englezesc). Regulile de utilizare a acestui spațiu sunt simple: puteți defini depozite de date numite în el ( variabile de mediu), în care puteți scrie orice informații doriți (alocați valoarea unei variabile de mediu) și ulterior să citiți aceste informații (înlocuiți valoarea variabilei).

Procesele sunt actorii principali într-un sistem. Atunci când utilizatorul emite comenzi pe linia de comandă, noi procese pentru a executa aceste comenzi (utilități externe etc.) sunt lansate de un alt proces - același interpret de comenzi care comunică cu utilizatorul și primește comenzi de la acesta.

Se numește crearea unui proces de către altul generarea procesuluiși are loc în două etape: mai întâi este creat copie exactă original, părintească proces (apel de sistem fork()), iar apoi copia procesului este înlocuită cu una nouă, filiale(apel de sistem exec()). Ceea ce este important pentru noi acum este că în timpul acestei înlocuiri, toate proprietățile procesului original și, în special, mediul înconjurător, sunt păstrate.

Să revenim la munca interpretorului de comenzi: atunci când execută o comandă, lansează utilitarul dorit ca proces copil, așteaptă finalizarea acestuia (folosind un alt apel de sistem, wait()), analizează rezultatul și continuă să lucreze. Utilitarul lansat primește două tipuri de informații de la procesul părinte (interpretul de comenzi): opțiunile liniei de comandă(nu în forma în care utilizatorul le-a introdus, ci după procesare conform regulilor interpretului de comenzi, sub forma unei liste secvențiale) și mediu inconjurator, adică toate variabilele și valorile acestora care au fost definite în mediul procesului părinte.

Se poate folosi aceeași utilitate același lucru fel, dar într-un mediu schimbat - și produc rezultate diferite. Utilizatorul poate schimba în mod explicit mediul pentru un proces care rulează, atribuind o anumită valoare unei variabile de mediu pe linia de comandă inainte de Numele echipei. Interpretul de comandă, văzând „=” în interiorul primului cuvânt al liniei de comandă, ajunge la concluzia că aceasta este o operație de atribuire, nu un nume de comandă și își amintește cum să schimbi mediul comenzii care urmează.

$date
Luni 16 iunie 18:28:30 MSK 2008
$ LC_TIME=C dată
Luni 16 iunie 18:28:51 MSK 2008

Exemplul 13. Utilitarul de dată utilizează variabila de mediu LC_TIME


Variabila de mediu LC_TIME specifică utilizarea unei anumite limbi atunci când se afișează data și ora, iar valoarea „C” corespunde limbii „sistem standard” (cel mai adesea engleză).

Variabile pe care coajă bash defineste după lansări, nu aparțin mediului și, prin urmare, nu sunt moștenite de procesele copil. Pentru a varia bash a fost înconjurat, are nevoie export comanda de export: $LC_TIME=C
$date
Luni 16 iunie 18:29:17 MSK 2008
$ export LC_TIME=C
$date
Luni 16 iunie 18:29:38 MSK 2008

Exemplul 14. Exportarea variabilelor shell în mediu


În timpul unei sesiuni de utilizator, interpretul de comenzi primește un mediu destul de bogat, la care adaugă propriile setări. Cele mai multe variabile predefinite sunt folosite fie de shell-ul propriu-zis, fie de utilitățile de sistem, așa că schimbarea lor face ca shell-ul sau utilitarele să se comporte ușor diferit. Vizualizați mediul în bash posibilă utilizare setați comenzi.

Valoarea oricărei variabile din bash poate fi accesată după nume: în loc de construcția $ nume_variabilă Shell-ul va înlocui valoarea acestei variabile. De exemplu, pentru a vizualiza valoarea unei anumite variabile, utilizatorul poate introduce comanda echo $ nume_variabilă .

Echo $PATH
/home/methody/bin:/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin:/usr/games

Exemplul 15. Afișarea valorii unei variabile


Variabila de mediu PATH este destul de notabilă. Conține o listă de directoare ale căror elemente sunt separate prin două puncte. Dacă comanda de pe linia de comandă nu este o comandă shell nativă (cum ar fi cd) și nu este reprezentată ca moduri la un fișier executabil (cum ar fi /bin/ls sau ./script), shell-ul va căuta această comandă printre numele fișierelor executabile din toate directoarele PATH și numai în ele. Din acest motiv, fișierele executabile nu pot fi lansate pur și simplu după nume dacă se află în directorul curent și directorul curent nu este inclus în PATH. În astfel de cazuri, puteți utiliza cea mai scurtă cale posibilă, „./” (de exemplu, apelând scriptul./script).

Variabile de mediu care afectează performanța diferit Există destul de multe utilități. De exemplu, variabilele familiei LC_ (o listă completă a acestora este dată de comanda locală), care determină limba în care sunt afișate mesajele de diagnosticare, standardele pentru formatul de date, valute, numere, metode de conversie a șirurilor etc. Dacă vreun utilitar necesită editarea unui fișier, acest fișier este transmis programului, calea către care este stocată în variabila EDITOR (de obicei /usr/bin/vi), iar dacă trebuie să deschideți un fișier html, multe utilitare vor apelați programul specificat în variabila BROWSER pentru a face acest lucru. În cele din urmă, unele variabile precum UID, USER sau PWD conțin pur și simplu informații utile care ar putea fi obținute în alte moduri.

Un set non-standard de opțiuni: cine sunt i face la fel ca cine -m .

  • Tutorial

De ce și pentru cine este articolul?

Inițial, acesta a fost un memento pentru studenții care încep să lucreze cu sisteme asemănătoare Unix. Cu alte cuvinte, articolul este destinat celor care nu au experiență anterioară în lucrul cu linia de comandă Unix, dar dintr-un motiv sau altul doresc sau trebuie să învețe cum să interacționeze eficient cu ea.

Nu va exista repovestire a mana (documentație), iar articolul nu anulează sau înlocuiește în niciun fel citirea acestora. În schimb, voi vorbi despre principalele lucruri (comenzi, tehnici și principii) pe care trebuie să le înțelegi încă de la începutul lucrului în shell unix astfel încât munca să se întâmple eficient și plăcut.

Articolul se referă la medii de tip Unix cu drepturi depline, cu un shell complet funcțional (de preferință zsh sau bash) și o gamă destul de largă de programe standard.

Ce este coaja

Shell (shell, alias „linia de comandă”, alias CLI, aka „consolă”, aka „terminal”, alias „fereastră neagră cu litere albe”) este o interfață text pentru comunicarea cu sistemul de operare (ei bine, strict vreau să spun, aceasta este program, care oferă o astfel de interfață, dar acum această diferență este nesemnificativă).

În general, lucrul printr-un shell arată astfel: utilizatorul (adică tu) introduce o comandă de la tastatură, apasă Enter, sistemul execută comanda, scrie rezultatul execuției pe ecran și așteaptă din nou următoarea comandă. a fi introdus.

Vedere tipică shella:

Shell-ul este modalitatea principală de a interacționa cu toate sistemele de server asemănătoare Unix.

Unde se găsesc sistemele de linie de comandă?

Acolo unde te-ar putea aștepta un shell Unix, opțiuni populare:
  • MacOS (bash);
  • acces de la distanță la server pentru muncă sau pentru un proiect web personal;
  • server de fișiere de acasă cu acces de la distanță;
  • Ubuntu, PC-BSD pe laptop/desktop - sisteme asemănătoare Unix astăzi sunt ușor de instalat și de utilizat.

Ce probleme sunt rezonabile de rezolvat cu un shell?

Sarcini naturale pentru care coaja este potrivită, utilă și indispensabilă:
  • lucru interactiv în terminal:
    • realizarea de compilare, rularea joburilor prin make;
    • compararea fișierelor text;
    • analiza rapidă ad-hoc a datelor (număr de IP-uri unice în jurnal, distribuția înregistrărilor pe ore/minute etc.);
    • acțiuni în masă unice (omorâți multe procese; dacă lucrați cu un sistem de control al versiunilor, inversați sau rezolvați o grămadă de fișiere);
    • diagnosticarea a ceea ce se întâmplă în sistem (semafore, încuietori, procese, descriptori, spațiu pe disc etc.);
  • scripting:
    • scripturi de instalare, pentru care nu vă puteți baza pe prezența altor interpreți - aceasta nu este pentru începători;
    • funcțiile pentru personalizarea shell-ului interactiv (afectarea invitației, schimbarea directorului, setarea variabilelor de mediu) nu sunt, de asemenea, tocmai pentru începători;
    • scripturi unice, cum ar fi recodificarea în masă a fișierelor;
    • makefiles.

Absolut primii pași

Să începem: conectați-vă și deconectați-vă

Asigurați-vă că știți exact cum să porniți shell-ul și cum să ieșiți din el.

Dacă lucrați pe o mașină cu Ubuntu instalat, trebuie să lansați programul Terminal. Când ați terminat, puteți pur și simplu să închideți fereastra.

Pe MacOS - lansați și Terminalul.

Pentru a accesa un server la distanță, utilizați ssh (dacă aveți MacOS, Ubuntu sau un alt sistem asemănător Unix la nivel local) sau putty (dacă aveți Windows).

Cine sunt eu, unde sunt?

Rulați următoarele comenzi:
  • hostname - afișează numele mașinii (serverului) pe care vă aflați în prezent;
  • whoami - afișează datele de conectare (numele tău în sistem);
  • tree -d / |less - reprezentare pseudografică a arborelui de directoare pe mașină; ieșire din defilare - q ;
  • pwd - afișează directorul în care vă aflați în prezent; pe linia de comandă nu poți fi „doar așa”, trebuie să fii într-un director (=director curent, director de lucru). Directorul de lucru curent este probabil afișat în promptul dvs.
  • ls - lista de fișiere din directorul curent; ls /home - lista de fișiere din directorul specificat;

Istoricul comenzilor (istoric)

O proprietate importantă a unei linii de comandă cu drepturi depline este istoricul comenzilor.

Rulați mai multe comenzi: hostname, ls, pwd, whoami. Acum apăsați tasta sus. Comanda anterioară apare în linia de introducere. Puteți utiliza tastele sus și jos pentru a vă deplasa înainte și înapoi prin istoric. Când ajungeți la numele gazdă, apăsați Enter - comanda va fi executată din nou.

Comenzile din istoric nu pot fi doar executate în mod repetat, ci și editate. Derulați istoricul la comanda ls, adăugați comutatorul -l la ea (se dovedește ls -l , există un spațiu înainte de minus, dar nu după). Apăsați Enter - comanda modificată va fi executată.

Derularea istoricului, editarea și re-executarea comenzilor sunt cele mai frecvente acțiuni atunci când lucrați pe linia de comandă, așa că obișnuiți-vă.

Copiaza si lipeste

Linia de comandă este foarte centrată pe text: comenzile sunt text, datele de intrare pentru majoritatea programelor standard sunt text, iar rezultatul este cel mai adesea text.

Lucrul grozav despre text este că poate fi copiat și lipit, iar acest lucru este valabil și pe linia de comandă.

Încercați data comenzii +"%y-%m-%d, %A"
L-ai introdus integral manual sau ai copiat-o din articol? Asigurați-vă că îl puteți copia, îl puteți lipi într-un terminal și îl puteți executa.

Odată ce ați învățat cum să utilizați man, asigurați-vă că puteți copia și rula exemple de comenzi din ajutor. Pentru a verifica, căutați secțiunea EXEMPLE din ajutorul programului de date, copiați și rulați primul exemplu dat (doar în cazul în care: semnul dolar nu face parte din comandă, aceasta este o imagine simbolică a unui prompt de intrare).

Cum să copiați exact textul de pe terminal și să-l lipiți în terminal depinde de sistemul dvs. și de setările acestuia, așa că, din păcate, nu va fi posibil să dați instrucțiuni universale. Pe Ubuntu, încercați acest lucru: copiați - doar selectați cu mouse-ul, lipiți - butonul din mijloc al mouse-ului. Dacă nu funcționează sau dacă aveți un alt sistem, căutați pe Internet sau întrebați prietenii mai experimentați.

Chei și opțiuni

Când cercetați istoricul comenzilor, ați întâlnit deja faptul că comanda ls are macar doua variante. Dacă îl numiți așa, va scoate o listă simplă:

Akira@latitude-e7240: ~/shell-survival-quide> ls Makefile shell-first-steps.md shell-first-steps.pdf shell-survival-quide.md shell-survival-quide.pdf
Dacă adăugați comutatorul -l, informații detaliate sunt afișate pentru fiecare fișier:

Akira@latitude-e7240: ~/shell-survival-quide> ls -l total 332 -rw-rw-r-- 1 akira akira 198 feb 13 11:48 Makefile -rw-rw-r-- 1 akira akira 15107 feb. 14 22:26 shell-first-steps.md -rw-rw-r-- 1 akira akira 146226 Feb 13 11:49 shell-first-steps.pdf -rw-rw-r-- 1 akira akira 16626 Feb 13 11 :45 shell-survival-quide.md -rw-rw-r-- 1 akira akira 146203 Feb 13 11:35 shell-survival-quide.pdf
Aceasta este o situație foarte tipică: dacă adăugați modificatori speciali (taste, opțiuni, parametri) la un apel de comandă, comportamentul comenzii se schimbă. Comparați: arbore / și arbore -d / , nume de gazdă și nume de gazdă -f .

În plus, comenzile pot lua ca parametri nume de fișiere, nume de directoare sau pur și simplu șiruri de text. Încerca:

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

om

man - Ajutor cu comenzile și programele disponibile pe mașina dvs., precum și cu apelurile de sistem și cu biblioteca standard C.

Încercați: man grep , man atoi , man chdir , man man .

Derularea înainte și înapoi se face cu butoanele „sus”, „jos”, „PageUp”, „PageDown”, ieșirea din vizualizarea de ajutor se face cu butonul q. Căutați un anumit text într-un articol de ajutor: apăsați / (bară oblică), introduceți textul de căutat, apăsați Enter. Treceți la următoarele apariții - tasta n.

Toate articolele de ajutor sunt împărțite în categorii. Cel mai important:

  • 1 - programe executabileși comenzi shell (wc, ls, pwd etc.);
  • 2 - apeluri de sistem (fork, dup2 etc.)
  • 3 - funcții de bibliotecă (printf, scanf, cos, exec).
Este necesar să se indice din ce categorie trebuie prezentat certificatul în cazurile de coincidență de nume. De exemplu, man 3 printf descrie o funcție din biblioteca standard C, iar man 1 printf descrie un program de consolă cu același nume.

Puteți vizualiza o listă cu toate articolele de ajutor disponibile pe computer folosind comanda man -k. (punctul face și parte din komada).

Mai puțin

Când vă aflați într-o fereastră de terminal mică, trebuie să vedeți foarte text lung(conținutul unui fișier, un om lung etc.), folosesc programe speciale „pagină” (de la cuvântul pagină, adică page flippers). Cel mai popular scroller este mai puțin și este ceea ce vă oferă defilarea atunci când citiți paginile de manual.

Încercați să comparați comportamentul:

Cat /etc/bash.bashrc cat /etc/bash.bashrc |mai putin

Puteți transfera fișierul în pager direct în parametrii:

Mai puțin /etc/bash.bashrc

Derulare în sus și în jos - butoanele „sus”, „jos”, „PageUp”, „PageDown”, ieșire - butonul q. Căutați un anumit text: apăsați / (forward slash), introduceți textul de căutat, apăsați Enter. Treceți la următoarele apariții - tasta n. (Recunoașteți instrucțiunile despre om? Nu e de mirare, mai puțin este folosit și pentru a afișa ajutor.)

Drepturi

Orice fișier sau director este asociat cu un set de „drepturi”: dreptul de a citi fișierul, dreptul de a scrie în fișier, dreptul de a executa fișierul. Toți utilizatorii sunt împărțiți în trei categorii: proprietarul fișierului, grupul proprietarului fișierului și toți ceilalți utilizatori.

Puteți vizualiza permisiunile fișierelor folosind ls -l . De exemplu:

> ls -l Makefile -rw-r--r-- 1 akira student 198 Feb 13 11:48 Makefile
Această ieșire înseamnă că proprietarul (akira) poate citi și scrie fișierul, grupul (studenții) poate doar să citească și toți ceilalți utilizatori pot citi doar.

Dacă primiți un mesaj cu permisiunea refuzată în timp ce lucrați, aceasta înseamnă că nu aveți suficiente drepturi asupra obiectului cu care doriți să lucrați.

Citiți mai multe în man chmod.

STDIN, STDOUT, transportoare (tevi)

Asociate fiecărui program de rulare sunt 3 debit standard date: flux de date de intrare STDIN, flux de date de ieșire STDOUT, flux de ieșire de eroare STDERR.

Rulați programul wc, introduceți textul Good day today, apăsați Enter, introduceți textul Good day, apăsați Enter, apăsați Ctrl+d. Programul wc va afișa statistici privind numărul de litere, cuvinte și rânduri din textul dvs. și se va termina:

> Wc ziua bună astăzi ziua bună 2 5 24
În acest caz, ați furnizat un text de două rânduri la STDIN-ul programului și ați primit trei numere în STDOUT.

Acum rulați comanda head -n3 /etc/passwd , ar trebui să arate cam așa:

> 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
În acest caz, programul principal nu a citit nimic din STDIN, ci a scris trei rânduri către STDOUT.

Vă puteți imagina astfel: programul este o conductă în care curge STDIN și STDOUT curge afară.

Cea mai importantă proprietate a liniei de comandă Unix este că programele „pipe” pot fi conectate între ele: ieșirea (STDOUT) a unui program poate fi transmisă ca date de intrare (STDIN) unui alt program.

O astfel de construcție a programelor conectate se numește conductă în engleză sau transportor sau conductă în rusă.

Combinarea programelor într-o conductă se face cu simbolul | (bară verticală)

Rulați comanda head -n3 /etc/passwd |wc , va arăta cam așa:

> head -n3 /etc/passwd |wc 3 3 117
Iată ce s-a întâmplat: programul cap a scos trei linii de text în STDOUT, care au mers imediat la intrarea programului wc, care la rândul său a numărat numărul de caractere, cuvinte și linii din textul rezultat.

Puteți combina câte programe doriți într-o conductă. De exemplu, puteți adăuga un alt program wc la conducta anterioară, care va număra câte cuvinte și litere au fost în rezultatul primului wc:

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

Crearea conductelor (pipe) este o sarcină foarte comună atunci când lucrați pe linia de comandă. Pentru un exemplu despre cum se face acest lucru în practică, citiți secțiunea „Crearea unei conducte cu o singură linie”.

Redirecționare I/O

Ieșirea (STDOUT) a unui program nu poate fi doar transferată într-un alt program printr-o conductă, ci și pur și simplu scrisă într-un fișier. Această redirecționare se face folosind > (mai mare decât semnul):

Data > /tmp/today.txt
Ca urmare a executării acestei comenzi, fișierul /tmp/today.txt va apărea pe disc. Vizualizați conținutul acestuia folosind cat /tmp/today.txt

Dacă un fișier cu același nume exista deja, conținutul său vechi va fi distrus. Dacă fișierul nu a existat, acesta va fi creat. Directorul în care este creat fișierul trebuie să existe înainte ca comanda să fie executată.

Dacă nu doriți să suprascrieți un fișier, ci mai degrabă să adăugați rezultate la sfârșitul acestuia, utilizați >> :

Data >> /tmp/today.txt
Verificați ce este acum scris în fișier.

În plus, puteți trece orice fișier programului în loc de STDIN. Încerca:

WC

Ce să faci când ceva nu este clar

Dacă întâmpinați un comportament de sistem pe care nu îl înțelegeți sau doriți să obțineți un anumit rezultat, dar nu știți cum, vă sfătuiesc să procedați în următoarea ordine (apropo, acest lucru se aplică nu numai shell-urilor):
  • Cât mai clar posibil, formulați întrebarea sau sarcina - nu este nimic mai dificil decât rezolvarea „ceva ce nu știu”;
  • amintiți-vă dacă ați întâmpinat deja aceeași problemă sau o problemă similară - în acest caz, merită să încercați soluția care a funcționat ultima dată;
  • citiți paginile de manual corespunzătoare (dacă înțelegeți ce pagini de manual sunt potrivite în cazul dvs.) - poate veți găsi exemple potrivite de utilizare a comenzilor, opțiunile necesare sau link-uri către alte comenzi;
  • gândește-te: este posibil să schimbi puțin sarcina? - poate, modificand putin conditiile, vei ajunge la o problema pe care deja stii sa o rezolvi;
  • pune întrebarea ta clar formulată într-un motor de căutare - poate că răspunsul poate fi găsit pe Stack Overflow sau pe alte site-uri;
Dacă niciuna dintre cele de mai sus nu ajută, cereți sfatul unui profesor, un coleg cu experiență sau un prieten. Și nu vă fie teamă să puneți întrebări „prostice” - nu este păcat să nu știți, este păcat să nu întrebați.

Dacă rezolvi o problemă dificilă (pe cont propriu, cu ajutorul internetului sau al altor persoane), notează-ți soluția în cazul în care aceeași problemă apare din nou pentru tine sau prietenii tăi. Puteți înregistra simplu fisier text, în Evernote, publică pe rețelele de socializare.

Metode de lucru

Copiaza si lipeste- din paginile de manual, din articolele de pe StackOverflow etc. Linia de comandă este formată din text, profitați de acest lucru: copiați și folosiți comenzi exemple, notați descoperirile de succes ca amintire, publicați-le pe Twitter și bloguri.

Trageți comanda anterioară din istoric, adăugați o altă comandă la conductă, rulați, repetați.Cm. Consultați și secțiunea „Crearea unei conducte cu o singură linie”.

Comenzi de bază

  • schimba in alt director: cd ;
  • vizualizarea conținutului fișierelor: pisică, mai puțin, cap, coadă;
  • manipulare fișiere: cp, mv, rm;
  • vizualizarea conținutului directorului: ls , ls -l , ls -lS ;
  • Structura directorului: arbore , arbore -d (directorul poate fi trecut ca parametru);
  • căutați fișiere: găsiți . -Nume ... ;

Analytics

  • wc, wc -l;
  • sort -k - sortează după câmpul specificat;
  • sort -n - sortare numerică;
  • diff - comparare fișiere;
  • grep , grep -v , grep -w , grep "\ " , grep -E - căutare text;
  • uniq , uniq -c - unicizarea șirurilor de caractere;
  • awk - în opțiunea awk „(printează $1)”, pentru a lăsa doar primul câmp din fiecare linie, $1 poate fi schimbat în $2, $3 etc.;

Diagnosticarea sistemului

  • ps axuww - informații despre procesele (programe care rulează) care rulează pe mașină;
  • top - vizualizare interactivă a proceselor cu cele mai mari resurse;
  • df - spațiu pe disc folosit și liber;
  • du - dimensiunea totală a fișierelor din director (recursiv cu subdirectoare);
  • strace , ktrace - ce numește sistemul face procesul;
  • lsof - ce fișiere folosește procesul;
  • netstat -na, netstat -nap - care porturi și socluri sunt deschise în sistem.

Este posibil să nu aveți unele programe; acestea trebuie să fie instalate suplimentar. În plus, unele opțiuni ale acestor programe sunt disponibile numai pentru utilizatorii privilegiați (root).

Execuție în vrac și semi-automată

La început, săriți peste această secțiune; veți avea nevoie de aceste comenzi și construcții atunci când ajungeți la scripting shell simplu.
  • testare - verificarea conditiilor;
  • while citire - bucla linie cu linie STDIN ;
  • xargs - înlocuirea șirurilor de caractere din STDIN în parametrii programului specificat;
  • seq - generarea de secvențe de numere naturale;
  • () - combina iesirea mai multor comenzi;
  • ; - faceți un lucru după altul;
  • && - se execută dacă prima comandă se finalizează cu succes;
  • || - executați dacă prima comandă eșuează;
  • tee - duplicați ieșirea programului în STDOUT și într-un fișier de pe disc.

Diverse

  • data - data curenta;
  • curl - descarcă un document de la adresa URL specificată și scrie rezultatul în STDOUT;
  • atingere - actualizați data modificării fișierului;
  • kill - trimite un semnal procesului;
  • adevărat - nu face nimic, returnează adevărat, util pentru organizarea buclelor eterne;
  • sudo - executați comanda ca root „a.

Crearea unei conducte cu o singură linie

Să ne uităm la un exemplu de sarcină reală: trebuie să omorâm toate procesele task-6-server care rulează ca utilizator curent.

Pasul 1.
Înțelegeți care program produce aproximativ datele necesare, chiar dacă nu în forma sa pură. Pentru sarcina noastră, merită să obțineți o listă a tuturor proceselor din sistem: ps axuww. Lansa.

Pasul 2.
Priviți cu ochii datele primite, veniți cu un filtru care va elimina unele dintre datele inutile. Acesta este adesea grep sau grep -v . Folosiți tasta „Sus” pentru a scoate comanda anterioară din istoric, alocați-i un filtru inventat și rulați-o.

Ps axuww |grep `whoami`
- numai procesele utilizatorului actual.

Pasul 3.
Repetați pasul 2 până când obțineți datele curate de care aveți nevoie.

"
- toate procesele cu numele cerut (plus, poate, altele suplimentare, cum ar fi vim task-6-server.c, etc.),

Ps axuww |grep `whoami` | grep "\ " | grep -v vim ps axuww |grep `whoami` | grep "\ " | grep -v vim |grep -v mai puțin
- numai procesele cu numele cerut

Ps axuww |grep `whoami` | grep "\ " | grep -v vim |grep -v mai puțin |awk "(printați $2)"

Datele proceselor necesare, pasul 3 finalizat

Pasul 4.
Aplicați un manipulator final adecvat. Folosind tasta „Sus”, scoatem comanda anterioară din istoric și adăugăm procesare care va finaliza soluția problemei:

  • |wc -l pentru a număra numărul de procese;
  • >pids pentru a scrie pid-uri într-un fișier;
  • |xargs ucide -9 procese de ucidere.

Sarcini de instruire

Vrei să exersezi noi abilități? Încercați următoarele sarcini:
  • obțineți o listă cu toate fișierele și directoarele din directorul dvs. principal;
  • obțineți o listă cu toate articolele man din categoria 2 (apeluri de sistem);
  • numărați de câte ori apare cuvântul grep în pagina de manual a programului grep;
  • numără câte procese rulează în prezent ca root;
  • găsiți ce comandă apare în numărul maxim de categorii de ajutor (om);
  • numără de câte ori apare cuvântul var pe pagina ya.ru.
Sugestie: veți avea nevoie de find , grep -o , awk "(print $1)" , expresii regulate în grep , curl -s .

Ce să studiezi mai departe?

Dacă începe să-ți placă linia de comandă, nu te opri, continuă să-ți îmbunătățești abilitățile.

Iată câteva programe care vă vor fi cu siguranță utile dacă locuiți pe linia de comandă:

  • găsiți cu opțiuni complexe
  • apropos
  • localiza
  • telnet
  • netcat
  • tcpdump
  • rsync
  • ecran
  • zgrep, zless
  • visudo
  • crontab -e
  • sendmail
În plus, de-a lungul timpului merită să stăpânești un fel de limbaj de scripting, cum ar fi perl sau python, sau chiar ambele.

Cine are nevoie de asta?

Merită chiar să învățați astăzi linia de comandă și scriptul shell? Cu siguranță merită. Voi da doar câteva exemple de cerințele Facebook pentru candidații care doresc să obțină un loc de muncă la FB.

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

LUCRARE DE LABORATOR Nr. 1 (timp de finalizare - 3 ore)

Subiect: „Introducere încoajă

1. Introducere în shell

Shell este un interpret de comenzi (procesor de comandă) care acționează ca o interfață între utilizator și nucleul Unix. Solaris oferă trei procesoare principale de comandă:

    Shell-ul Bourne implicit este /sbin/sh

    Procesor de comandă C -- /bin/csh

    Shell Korn-- ./bin/ksh

Pe lângă cele enumerate, Solaris oferă shell-uri suplimentare:

    J shell -- /sbin/jsh

    Korn restricționat l -- / usr/ bin/rsh

    T-shell -- /usr/bin/tcsh

    GNU Bourne Again -- /usr/bin/bash

    Z-shell – usr/bin/zsh

Alegerea procesorului de comandă este o chestiune de preferință personală.

2. Rulați comenzi

Orice comandă în Unix constă din numele programului care urmează să fie lansat (comandă), opțiuni (chei) și argumente transmise programului. Linia de comandă este delimitată de spații sau file.

Exemplu

$ /bin/ping –t 10 192.168.2.13

argument

invitație shell

Dacă calea către fișierul executabil nu este specificată la pornirea unui program, sistemul de operare caută secvențial prin directoarele specificate în variabila PATH. Dacă există un program cu același nume în directorul care este vizualizat, atunci acesta este lansat pentru execuție. Directorul de lucru curent nu este căutat pentru programe decât dacă este specificat în variabila PATH.

! Din motive de securitate, este recomandat ca administratorul să nu adauge directorul curent și directoarele personale (personale) ale utilizatorului la variabila PATH.

Exemple

Rulați un program care specifică calea completă

$ / usr/ local/ cos/ Ale mele_ program

Rularea unui program dintr-un director superior (părinte).

$ ../ local/ cos/ Ale mele_ program

Rularea unui program din directorul curent

$ ./ Ale mele_ program

3. Caractere speciale în shell

Unele caractere shell au o semnificație specială.

3.1. Șabloane de generare a numelor de fișiere

? (semnul întrebării) se potrivește cu orice caracter, cu excepția primului punct;

(paranteza patrata) definiți un grup de simboluri (se selectează un simbol din grup);

- (semnul minus") definește intervalul de caractere valide;

! (Semn de exclamare) respinge următorul grup de caractere;

* (simbol cu ​​asterisc) se potrivește cu orice număr de caractere, cu excepția primului punct.

3.2. Simboluri de redirecționare I/O

< - redirecționare intrare;

>, >> - redirecționarea ieșirii;

2>, 2>> - redirecționarea mesajelor de eroare;

| - transportor.

3.3. Caractere de substituție

$name_variableq - substituție variabilă;

$(comandă) sau `echipă` -înlocuirea comenzii;

~ - substituție tilde.

4. Căutați

Pentru a căuta rapid fișiere și directoare, utilizați comanda whereis; pentru o căutare mai profundă, utilizați comanda find (căutați fișiere care îndeplinesc cerințele specificate;).

5. Editor de text vi

Editorul de text vi este un editor universal prezent în orice Unix. Pe lângă editarea fișierelor text, editorul vi poate fi folosit pentru a edita linia de comandă.

Editorul vi are 3 moduri de operare (vezi figura).

Conectarea la editorul vi

Ieșire vi

Semnul „~” (tilde) din prima poziție marchează linii goale (inexistente) ale fișierului.

Modul principal este modul de comandă, în care comenzile sunt introduse prin apăsarea unei anumite secvențe de taste (nu sunt afișate în niciun fel pe ecran).

Deplasarea textului în modul de comandă se face folosind săgeți și taste (stânga), (jos), (sus), (La dreapta).

Unele comenzi vi sunt listate în tabel.

Ștergerea liniei curente

Copierea liniei curente în buffer

Mișcarea cursorului

Introducerea caracterelor marcate de cursor în buffer

Introduceți o nouă linie în partea de jos

Inserarea unei noi linii în partea de sus

Adăugarea după cursor

Adăugați după linia curentă

Inserați înainte de cursor

Introduceți înaintea liniei curente

Înlocuirea unui caracter cu un caracter introdus de la tastatură

Lipirea textului din clipboard

. (punct)

Repetați ultima comandă executată

Anulează ultima comandă

Anulați toate modificările aduse liniei curente

Ștergerea unui caracter deasupra cursorului

În modul de introducere, toate caracterele tastate pe tastatură sunt inserate în text.

În modul ultima linie, comanda pe care o introduceți apare pe ultima linie a ecranului.

6. Ajutor

Unix are un director electronic care conține o descriere a scopului comenzilor, sintaxa acestora, exemple de utilizare etc. Directorul este apelat cu comanda man:

7. Comenzi shell de bază

OMS– afișarea informațiilor despre utilizatorii activi;

ecou– trimite mesaje către terminal;

banner– trimite mesaje către terminal cu majuscule;

om– apelarea sistemului de ajutor online;

Data – ieșirea datei curente;

scrie– transferul de mesaje pe terminalul altui utilizator;

mesg– permiterea/interzicerea afișării mesajelor de la alți utilizatori;

Poștă– trimiterea/primirea corespondenței;

știri– familiarizarea cu noutățile sistemului;

pwd– afișarea numelui absolut al rutei din directorul de lucru curent;

CD– schimbarea directorului de lucru;

ls– afișarea informațiilor despre conținutul directorului;

mkdir– realizarea unui catalog;

rmdir– ștergerea unui director;

atingere– actualizarea marcajului de timp al fișierului;

cp- Copiere fișiere;

pisică– combinarea și afișarea conținutului fișierelor;

Mai mult– vizualizare pagină cu pagină a conținutului fișierului.

mv – mutarea sau redenumirea unui fișier;

rm– ștergerea fișierului;

alias– crearea unui pseudonim;

tr– conversia caracterelor;

Ieșire– finalizarea curentului coajă-A;

tricou– interceptarea rezultatelor conductei;

a tăia – selectarea câmpurilor dintr-un rând;

grep– căutare după șablon;

relatii cu publicul– scoateți fișierul la ieșire standard într-un format specificat;

fel– sortarea;

cap– ieșirea primelor rânduri ale fișierului;

coadă– ieșirea ultimelor rânduri ale fișierului;

WC– numărarea numărului de caractere, cuvinte și rânduri;

citit, ecou - citirea și ieșirea valorilor variabilelor;

Test- evaluarea sensului unei expresii;

expr, lăsa- calculul expresiilor aritmetice;

8. Coajă-programe

Shell vă permite să salvați o secvență de comenzi într-un fișier și apoi să o executați. Pentru a rula un fișier cu un program shell pentru execuție, trebuie să adăugați dreptul de execuție la drepturile de acces:

$ chmod +x nume_fișier_program

Ramificarea în programele shell este organizată folosind următorii operatori:

dacă-atunci-altfel

Operatori de buclă:

EXERCIȚII

1. Care dintre următoarele comenzi va avea ca rezultat afișarea unui mesaj de bun venit pe ecran? Care nu sunt? De ce?

$echo salut

$ echo salut

$ echo SALUT, LUME

$ banner Buna ziua

$ BANNER BUNA ZIUA, LUME

2. Imprimați un mesaj pe mai multe linii folosind comenzi ecouȘi banner.

3. Tipăriți data în două rânduri: pe prima linie zi, lună, an, pe a doua linie ora curentă, furnizând rezultatul cu un comentariu.

4. Folosind comanda scrie, trimiteți un mesaj la consolă. Trimite mesaje către mai multe terminale simultan.

5. Folosind comanda mesg, stabiliți dacă mesajele sunt permise pe terminalul dvs. Interziceți mesajele. Care va fi reacția sistemului dacă cineva va încerca să vă trimită un mesaj?

6. Stabiliți-vă numele ACASĂ- catalog.

7. Parcurgeți subarborele directorului pornind de la directorul /export/home folosind comenzile cd, lsȘi pwd.

8.. Creați în dvs ACASĂ-directoare subdirectoare de forma:

flori de fructe

măr pere struguri trandafir violet papadie

verde inchis

9. Fiind în propriul tău ACASĂ-directory, creați următoarele subdirectoare folosind o linie de comandă:

A/B/C/D

10. Fiind în propriul tău ACASĂ-directory, ștergeți toate subdirectoarele din director A.

11. În timp ce în ACASĂ-director, creați un fișier macintosh în catalogul existent mărși mai multe fișiere în directoare întunericȘi verde. Conectați-vă la director fcoboară. În timp ce în director fcoboară, copiați toate subdirectoarele frudeleîmpreună cu fișierele conținute în ele într-un director special creat coş.

12. În timp ce în director fcoboară, ștergeți directorul frudele.

13. Citiți fișierul .profil folosind comenzi pisicăȘi Mai mult.

14. Creați în ACASĂ-fișier text director Dosarul meu din mai multe linii folosind comanda pisică. Creați un fișier text MyFile, scriind aceleași rânduri în el. Cate fisiere ai primit? De ce?

15. Vizualizați conținutul fișierului creat în sarcina 2.2 Dosarul meu. Copiați fișierul Dosarul meu la dosar mycopy. Vizualizați conținutul ambelor fișiere.

16. Mutați fișierul mycopy la catalog flori.

17. În timp ce în ACASĂ-catalog, creați un link mylegătură pe fișier mycopy situat în director flori. Vizualizați fișierul link.

18. Adăugați o linie la fișier Ale melelegătură. Care dintre dosare Ale melelegătură,Ale melecopie,Ale melefişier schimbat? De ce?

19. Utilizând ce comandă puteți determina numărul de link-uri? Determinați numărul de link-uri pentru fișiere Ale melelegătură,Ale melecopie,Ale melefişier.

Ștergeți fișierul mycopy. Ce s-a întâmplat cu fișierul link? Determinați numărul de link-uri pentru fișiere Ale melelegătură,Ale melefişier.

20. Creați un alias dir, care tipărește conținutul directorului curent într-un format extins.

21. Deconectați-vă și conectați-vă din nou. Funcționează aliasul? dir? Ce ar trebui făcut pentru a vă asigura că porecla nu se pierde între sesiuni?

22. Creați un alias punct, care tipărește o listă de fișiere din directorul de lucru ale căror nume încep cu un punct.

23. Folosind comanda atingere, creați fișiere într-un director nou cu nume astfel încât, în același timp:

Șablon A* 5 fișiere potrivite;

Șablon * A a corespuns la 4 dosare;

Șablon ??.? potriviți 3 fișiere;

Șablon * aa* a corespuns la 2 dosare;

Șablon??? a corespuns 1 fișier.

24. Ce comandă ar trebui să introduceți pentru a face următoarele:

a) afișați numele tuturor fișierelor începând cu un punct;

b) afișați numele tuturor fișierelor care se termină cu ".TXT";

c) afișați numele tuturor fișierelor care conțin cuvântul "Ale mele";

25. Înlocuiți toate literele mici dintr-un fișier dat cu majuscule, iar în altul, toate literele mari cu minuscule. Eliminați orice spațiu duplicat din fișier.

26. Creați un fișier numit * . Ștergeți numai acest fișier. Aveți grijă când utilizați caractere de generare a numelui fișierelor!

27. Creați un fișier care are un spațiu în numele său. Cum se șterge un astfel de fișier?

28. Folosind comanda pisică dublați conținutul unui fișier prin adăugarea conținutului original la sfârșitul aceluiași fișier. Accesați directorul flori. Adăugați la fișier spisok lista de conținut a directorului flori. Vizualizați conținutul fișierului

29. Încercați să citiți folosind comanda pisică dosar inexistent. Care este răspunsul sistemului? Faceți același lucru redirecționând mesajele de eroare către un fișier eroarea mea. Ce vezi pe ecran? Vizualizați fișierul eroarea mea.

30. Creați o conductă pentru a lista numai numele și permisiunile fișierelor aflate în prezent în directorul dvs. de lucru.

31. Schimbați conducta construită astfel încât lista să fie salvată într-un fișier spisok Al lui ACASĂ-director, iar pe ecran a fost afișat doar numărul de fișiere din listă.

32. Afișați conținutul unui fișier /etc/passwd, sortate după câmpul nume de utilizator.

33. Creați un alias logatpe, care va afișa o listă ordonată alfabetic cu numele utilizatorilor care lucrează pe sistem.

33. Ieșire data curenta pe ecran cu majuscule folosind comenzi DataȘi banner.

34. Atribuiți unei variabile EU SUNT. Numele dvs. de înregistrare. Lansează altul coajă. Vedeți această variabilă? Ce trebuie să faceți pentru a-l vedea în generat coajă? Modificați valoarea unei variabile EU SUNT.în generat coajă. Ieșiți din cel născut coajă. Priviți valoarea acestei variabile în sursă coajă. Explicați rezultatul.

35. Scrie coajă-program info, care va cere utilizatorului să introducă numele, adresa, ziua, luna și anul nașterii și să afișeze aceste informații în ordinea inversă introdusă

36. Scrie coajă- un program care va afișa o solicitare pentru introducerea unui număr și va stoca numărul introdus într-o variabilă Yși imprimați un mesaj „Y este mai mare decât 7”, dacă valoare Y mai mult de 7, și „Y estenu mai mare decât 7” in caz contrar.

37. Scrieți un program shell care să afișeze următoarele statistici:

a) numele dvs.;

b) numărul de argumente cu care se lansează;

c) tipărește fiecare dintre argumentele sale și lungimea argumentului în caractere;

38. Scrie coajă- un program care determină numărul de argumente pe linia de comandă și afișează un mesaj de eroare dacă numărul de argumente nu este trei, sau argumentele în sine dacă numărul lor este trei.

39. Scrie coajă- un program care vă va solicita să introduceți un identificator de utilizator, să verificați identificatorul pentru conformitate cu cele utilizate în sistem și să afișați Numele completACASĂ-director sau, în cazul unui identificator nevalid, afișați un mesaj de eroare.

40. Scrieți un program shell Buna ziua, care oferă următorul răspuns la argumentele liniei de comandă:

Argument „-d”- programul va executa comanda Data;

Argument „-l”- programul va afișa conținutul directorului curent;

    Dacă nu există argumente sau argumente invalide pe linia de comandă, programul va imprima ajutor despre opțiunile sale.

41. Scrie un program cuvinte, care va solicita utilizatorului să introducă câte un cuvânt până când acesta introduce cuvântul Sfârşit. Amintește-ți toate cuvintele pe care le-ai introdus. După introducerea unui cuvânt Sfârşit afișează pe ecran toate cuvintele introduse.

42. Schimbați promptul de sistem astfel încât să conțină numele complet al căii din directorul de lucru curent .

43. Scrie un program virus, care creează o copie executabilă a sa cu un alt nume și apoi se șterge.

44. Scrieți un program virus2 , care caută în directorul curent programele în limbajul de comandă și adaugă textului lor o comandă pentru afișarea cuvântului Infectat!”.

45. Scrieți un program virus3 , care adaugă propriul cod la programele în limbajul de comandă pe care le găsește pentru a infecta alte programe.

46. ​​​​Scrieți un program virus4 , modificându-vă virusul astfel încât, atunci când este infectat, codul infectant să fie eliminat din programul infectant.

47. Scrie un program antivirus, care ar găsi toate programele shell infectate cu virusul dvs.

48. Modificați programul dezvoltat astfel încât nu numai să găsească programe infectate în directorul specificat de acesta, ci și să le „vindece” prin salvarea versiunii infectate într-un fișier nou cu finalul adăugat la numele său . vir, și eliminarea atributului de execuție dintr-un astfel de fișier.

49. Scrieți un program virus5 , care ar:

a) ar infecta programele shell din directorul curent și subdirectoarele acestuia cu un virus numai dacă utilizatorul a introdus comanda ls;

b) s-ar comporta ca o echipă ls, fără a dezvălui nimic despre munca ta pe terminal.

50. Scrieți un program virus6 bazat pe programe virus2 -virus5 , al cărui cod de infectare nu a putut fi detectat de programul pe care l-ați dezvoltat antivirus, iar infecția ar avea loc pentru orice valoare a variabilei CALE.

51. Scrie un program supervirus, a cărui lansare vă infectează fișierele cu virusul dezvoltat în sarcina anterioară și de fiecare dată când vă conectați la sistem, se încearcă infectarea fișierelor prietenilor dvs. Program supervirus se șterge după prima lansare.

52. Scrieți un program superantivirus, care detectează și „vindecă” complet (dacă este specificată opțiunea corespunzătoare) toate fișierele din directorul specificat și subdirectoarele acestuia de la toți virușii dezvoltați.

Limbajul de comandă shell (tradus ca shell, shell) este de fapt un limbaj de programare la nivel foarte înalt. În această limbă, utilizatorul controlează computerul. De obicei, după conectare, începeți să interacționați cu shell-ul de comandă. Un semn că shell-ul este gata să primească comenzi este prompterul pe care îl afișează pe ecran. În cel mai simplu caz este un dolar ("$"). Shell nu este necesar și singurul limbaj de comandă (deși este cel care este standardizat în cadrul POSIX, standardul sistemelor mobile). De exemplu, limbajul cshell este destul de popular; există și kshell, bashell și altele. Mai mult, fiecare utilizator își poate crea propriul limbaj de comandă. Poate lucra simultan cu diferite limbaje de comandă pe o singură instanță a sistemului de operare. shell este una dintre multele comenzi UNIX. Adică, setul de comenzi „shell” include comanda „sh” - apelând interpretul „shell”. Primul „shell” este apelat automat când vă autentificați și afișează un programator. După aceasta, puteți apela orice comenzi pentru execuție, inclusiv „shell-ul” în sine, care va crea un nou shell pentru dvs. în interiorul celui vechi. Deci, de exemplu, dacă pregătiți fișierul „fișier_1” în editor:

Echo Bună ziua!

atunci acesta va fi un fișier text obișnuit care conține comanda „echo”, care, atunci când este executată, afișează tot ce este scris în dreapta lui pe ecran. Puteți face fișierul „file_1” executabil folosind comanda „chmod 755 file_1”. Dar se poate face apelând explicit comanda „sh” („shell”):

Sh fisier_1

SH< file1

Fișierul poate fi executat și în instanța shell curentă. Există o comandă specifică pentru acest „." (punct), adică

Fișier_1

Întrucât UNIX este un sistem multi-utilizator, puteți chiar să lucrați pe un computer personal în paralel, de exemplu, pe 12 ecrane (schimbarea de la ecran la ecran ALT/tasta funcțională), având pe fiecare ecran un utilizator nou (sau același) cu propriul său shell de comandă. De asemenea, puteți deschide un număr mare de ferestre în modul grafic X-Window, iar fiecare fereastră poate avea propriul utilizator cu propriul său shell de comandă... Elementul de bază al limbajului shell este comanda.

Structuri de comandă:

Comenzile din shell au de obicei următorul format:

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

De exemplu:

Ls -ls /usr/bin

Unde ls este numele comenzii pentru a scoate conținutul directorului, -ls este steaguri ("-" este un semn de steaguri, l este formatul lung, s este volumul fișierelor în blocuri), /usr/ bin este directorul pentru care este executată comanda. Această comandă va afișa conținutul directorului /usr/bin în format lung și va adăuga informații despre dimensiunea fiecărui fișier în blocuri.Din păcate, această structură de comandă nu este întotdeauna urmată . Steagurile nu sunt întotdeauna precedate de un minus, iar steagurile nu sunt întotdeauna un cuvânt. Da, varietate în prezentarea argumentelor. Comenzile cu formate exotice includ comenzi „de rulare” precum cc - apelarea compilatorului limbajului C, tar - lucru cu arhive, dd - copierea unui fișier cu conversie, găsirea - căutarea fișierelor și o serie de altele De regulă, shell-ul percepe primul cuvânt ca o comandă.De aceea, pe linia de comandă

primul cuvânt va fi decriptat de către shell ca o comandă (concatenation), care va afișa un fișier numit „cat” (al doilea cuvânt) aflat în directorul curent. Redirecționarea comenzii Intrarea standard (intrare) - „stdin” în sistemul de operare UNIX este efectuată de la tastatura terminalului, iar ieșirea standard (ieșire) - „stdout” este direcționată către ecranul terminalului. De asemenea este si fișier standard mesaje de diagnosticare - „stderr”, care vor fi discutate puțin mai târziu. O comandă care poate funcționa pe intrare și ieșire standard se numește FILTER. Utilizatorul are mijloace convenabile de a redirecționa intrarea și ieșirea către alte fișiere (dispozitive). Simbolurile „>” și ​​„>>” indică redirecționarea ieșirii. ls >fișier_1 Comanda „ls” va genera o listă de fișiere în directorul curent și o va plasa în fișierul „fișier_1” (în loc să o imprime pe ecran). Dacă fișierul „fișier_1” a existat înainte, acesta va fi suprascris de cel nou.

Pwd >>fișier_1

comanda pwd va forma numele complet al directorului curent și îl va plasa la sfârșitul fișierului „fișier_1”, adică. „>>” se adaugă la fișier dacă nu este gol. Simboluri "<" и "<<" обозначают перенаправление ввода.

Wc -l

va număra și va afișa numărul de linii din fișierul fișier_1.

Fișier Ed_2<

va crea fișierul „file_2” folosind editorul, direct din terminal. Sfârșitul introducerii este determinat de caracterul din dreapta "<<" (т. е. "!"). То есть ввод будет закончен, когда первым в очередной строке будет "!". Можно сочетать перенаправления. Так

Wc -l fisier_4

Wc -l >fișier_4

se efectuează în același mod: se numără numărul de linii din fișierul „fișier_3” iar rezultatul este plasat în fișierul „fișier_4”. Mijlocul care combină ieșirea standard a unei comenzi cu intrarea standard a alteia se numește PIPELINE și este indicat de o bară verticală „|”.

ls | wc -l

o listă de fișiere din directorul curent va fi trimisă la intrarea comenzii „wc”, care va afișa numărul de linii din director. Conducta poate combina, de asemenea, mai mult de două comenzi, atunci când toate, eventual cu excepția primei și ultimei, sunt filtre:

Fișier pisică_1 | grep -h rezultat | sortare | cat -b > fișier_2

Această conductă din fișierul „fișier_1” („cat”) va selecta toate liniile care conțin cuvântul „rezultat” (“grep”), va sorta („sortează”) liniile rezultate, apoi va număra („cat -b”) și tipăriți rezultatul în fișierul „fișier_2”. Deoarece dispozitivele UNIX sunt reprezentate de fișiere speciale, acestea pot fi folosite în redirecționări. Fișierele speciale se află în directorul „/dev”. De exemplu, "lp" - print; „consola” - consolă; "ttyi" - al-lea terminal; „null” este un fișier (dispozitiv) fals (gol). Atunci, de exemplu,

Ls > /dev/lp

va tipări conținutul directorului curent și fișier_1< /dev/null обнулит файл "file_1".

Sortare fișier_1 | tee /dev/lp | coada -20

În acest caz, fișierul „fișier_1” va fi sortat și tipărit, iar ultimele 20 de rânduri vor fi și ele tipărite pe ecran. Să revenim la redirecționarea ieșirii. Fișierele standard sunt numerotate:

0 - stdin, 1 - stdout 2 - stderr. Dacă nu doriți să aveți un mesaj de eroare pe ecran, îl puteți redirecționa de pe ecran către fișierul pe care îl specificați (sau îl puteți arunca complet redirecționându-l către fișierul „dispozitiv gol” - /dev/null). De exemplu, la executarea comenzii

Fișier pisică_1 fișier_2

care ar trebui să afișeze conținutul fișierelor „fișier_1” și „fișier_2” secvenţial pe ecran, vă va oferi, de exemplu, următoarele

111111 222222 cat: f2: Nu există un astfel de fișier sau director

unde 111111 222222 este conținutul fișierului „fișier_1” și lipsește fișierul „fișier_2”, pe care comanda „cat” l-a raportat în fișierul de diagnostic standard, în mod implicit, așa cum este ieșirea standard reprezentată de ecran. Dacă nu doriți un astfel de mesaj pe ecran, îl puteți redirecționa către fișierul pe care îl specificați:

Cat file_1 file_2 2>f-err

mesajele de eroare vor fi trimise (după cum este indicat de redirecționarea „2>”) către fișierul „f-err”. Apropo, puteți trimite toate informațiile într-un singur fișier „ff”, folosind în acest caz construcția

Cat file_1 file_2 >>ff 2>ff

Puteți specifica nu numai ce fișier standard să redirecționați, ci și spre ce fișier standard să redirecționați.

Cat file_1 file_2 2>>ff 1>&2

Aici, mai întâi „stderr” este redirecționat (în modul anexare) către fișierul „ff”, iar apoi ieșirea standard este redirecționată către „stderr”, care în acest moment este fișierul „ff”. Adică rezultatul va fi similar cu cel precedent. Construcția „1>&2” înseamnă că, pe lângă numărul fișierului standard către care să redirecționați, trebuie să puneți „&” în față; întreaga structură este scrisă fără spații.<- закрывает стандартный ввод. >- inchide iesirea standard. Fișiere de comandă. Există mai multe opțiuni pentru a permite ca un fișier text să fie utilizat ca comandă. Să folosim un editor pentru a crea un fișier numit „cmd” care conține o linie ca aceasta:

Data; pwd; ls

Puteți apela shell-ul ca o comandă, notat cu „sh”, și să îi transmiteți un fișier „cmd” ca argument sau ca intrare redirecționată, de ex.

$ sh cmd

$sh

Rezultatul executării oricăreia dintre aceste comenzi va fi data, apoi numele directorului curent și apoi conținutul directorului. O opțiune mai interesantă și mai convenabilă pentru a lucra cu un fișier batch este să îl transformați într-unul executabil, de exemplu. faceți-o doar o comandă, care se realizează prin schimbarea codului de securitate. Pentru a face acest lucru, trebuie să permiteți execuția acestui fișier. De exemplu,

Chmod 711 cmd

va face codul de securitate „rwx__x__x”. Apoi un simplu apel

va executa aceleași trei comenzi. Rezultatul va fi același dacă fișierul cu conținutul

Data; pwd; ls

este reprezentat sub forma: date pwd ls deoarece trecerea pe o altă linie este tot un separator în succesiunea comenzilor. Astfel, fișierele executabile pot fi nu numai fișiere obținute ca urmare a compilării și asamblarii, ci și fișiere scrise în limbajul shell. Acestea sunt executate în modul de interpretare folosind un interpretor shell

Depanarea fișierelor batch

SHELL folosește două mecanisme pentru depanarea fișierelor batch. Prima este: set -v tipărește liniile fișierului de comandă pe măsură ce sunt citite. Acest mod este utilizat la căutarea erorilor de sintaxă. Pentru a-l folosi, nu este nevoie să modificați fișierul de comandă, de exemplu: sh -v proc... aici proc este numele fișierului de comandă. Comutatorul -v poate fi folosit împreună cu comutatorul -n, care împiedică executarea comenzilor ulterioare (comanda set -n blochează terminalul până când este introdus indicatorul EOF). Comanda set -x afișează comenzile pe măsură ce sunt executate, iar liniile de program sunt transmise la terminal, iar valorile lor sunt înlocuite în locul variabilelor. Pentru a anula comutatoarele -x și -v, puteți utiliza comanda set - și pentru a instala, atribuiți valoarea corespunzătoare unei variabile macro. MEDIUL SHELL (VARIABILE ȘI PARAMETRI) În limbajul shell, puteți scrie fișiere batch și puteți utiliza comanda „chmod” pentru a le face executabile. După aceasta, acestea nu sunt diferite de alte comenzi ale sistemului de operare UNIX.

Variabile Shell

Un nume de variabilă shell este o secvență de litere, numere și litere de subliniere care încep cu o literă. Valoarea unei variabile shell este un șir de caractere. Faptul că există doar două tipuri de date în shell: un șir de caractere și un fișier text, pe de o parte, facilitează implicarea utilizatorilor finali în programare care nu au mai programat niciodată și, pe de altă parte, provoacă un anumit protest intern în rândul multor programatori care sunt obișnuiți cu o diversitate semnificativ mai mare și o mai mare flexibilitate a mijloacelor lingvistice. Cu toate acestea, este interesant de observat cum programatorii înalt calificați, familiarizați cu „regulile jocului” ale shell-ului, scriu programe în el de multe ori mai repede decât în ​​C, dar, ceea ce este deosebit de interesant, în unele cazuri aceste programe rulează chiar mai repede decât cele implementate în C. Un nume de variabilă este similar cu ideea tradițională a unui identificator, adică. un nume poate fi o succesiune de litere, cifre și liniuțe de subliniere, începând cu o literă sau liniuță de subliniere. Operatorul de atribuire „=" poate fi folosit pentru a atribui valori variabilelor.

Var_1=13 - „13” nu este un număr, ci un șir de două cifre. var_2="UNIX OS" - Aici sunt necesare ghilimele duble (" "), deoarece există un spațiu în șir.

Sunt posibile și alte modalități de atribuire a valorilor variabilelor shell. De exemplu, înregistrarea

DAT=`data`

face ca comanda „date” să fie executată prima (backtick-urile indică faptul că comanda inclusă trebuie executată mai întâi), iar rezultatul executării ei, în loc să fie scos la ieșirea standard, este atribuit ca valoare a unei variabile, în acest caz „DAT”. De asemenea, puteți atribui o valoare unei variabile folosind comanda „citește”, care asigură că valoarea variabilei este primită de pe afișajul (tastatură) în modul de dialog. De obicei, comanda „citește” din fișierul batch este precedată de comanda „echo”, care vă permite să pre-afișați un mesaj pe ecran. De exemplu:

Echo -n „Introduceți un număr din trei cifre:” citiți x

La executarea acestei porțiuni a fișierului de comandă, după ce mesajul este afișat

Introduceți un număr din trei cifre:

interpretul se va opri și așteaptă introducerea unei valori de la tastatură. Dacă ați introdus, să spuneți, „753”, atunci aceasta va deveni valoarea variabilei „x”. O comandă „citește” poate citi (atribui) valori mai multor variabile simultan. Dacă în „citire” există mai multe variabile decât sunt introduse (separate prin spații), celor rămase li se atribuie un șir gol. Dacă există mai multe valori transmise decât variabile în comanda „citește”, atunci cele suplimentare sunt ignorate. Când accesați o variabilă shell, trebuie să precedați numele cu simbolul „$”. Deci, comenzile echo $var_2 echo var_2 se vor afișa pe ecran

UNIX OS var_2 Escape

Să aruncăm o privire mai atentă asupra tehnicilor de evadare utilizate în cochilie. Ghilimele duble (" "), ghilimele simple (" ") și barele oblice inverse (\) sunt folosite ca dispozitive de evacuare. Acțiunea lor este evidentă din exemple: Puteți scrie mai multe teme într-o singură linie.

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

(atribuirea G=$x+$y ar eșua din cauza spațiilor) Atunci

Ecou A = $A B = $B C = $C ecou D = $D E = $E F = $F ecoul eval evaluat A = $A ecoul eval evaluat B = $B ecoul eval evaluat C = $C

Va fi afișat pe ecran

A = 22 B = $x C = $x D = 22 + 33 + 22 E = $x + $y + $z F = 22 + 33 + 22 evaluat A = 22 evaluat B = 22 evaluat C = 22

Să dăm mai multe exemple legate de evadarea fluxurilor de linie. Lasă variabilei „șir” să i se atribuie valoarea unui „matrice” 2x3: abc def Rețineți că, pentru a evita alocarea de spații suplimentare, a doua linie a matricei începe din prima poziție a următoarei linii: șir="abc def" Apoi există trei opțiuni de scriere a variabilei în comanda „echo” echo $șir echo „$șir” echo „$șir” va da respectiv trei rezultate diferite: abc def $șir abc def și secvența de comenzi echo „str_1 str_2” > file_1 echo "str_1 str_2" > file_2 cat file_1 file_2 va da fișiere secvenţial identice file_1 și file_2: str_1 str_2 str_1 str_2 Rețineți, de asemenea, că bara oblică inversă (\) nu scapă numai caracterul care îl urmează, ceea ce vă permite să utilizați Simboluri speciale la fel ca caracterele care se reprezintă (pot scăpa de sine stătător - \\), dar într-un fișier de comandă, o bară oblică inversă vă permite să concatenați linii într-una singură (escape de la sfârșitul unei linii). De exemplu, exemplul de linie de comandă dat mai devreme:

Fișier pisică_1 | grep -h rezultat | sortare | cat -b > fișier_2

ar putea fi scris într-un fișier batch, să spunem ca

Fișier pisică_1 | grep -h\rezultat | sortare | cat -b > fișier_2

Apropo, simbolul transportor oferă și efectul de a continua linia de comandă. În acest caz, ar putea da un rezultat mai frumos, ca acesta:

Fișier pisică_1 | grep -h rezultat | sortare | cat -b > fișier_2

Manipularea variabilelor shell Deși variabilele shell sunt caz general sunt percepute ca șiruri de caractere, adică „35” nu este un număr, ci un șir de două caractere „3” și „5”, într-un număr de cazuri ele pot fi interpretate diferit, de exemplu, ca numere întregi. Comanda „expr” are o varietate de capabilități. Să ilustrăm câteva cu exemple: Executarea unui fișier batch:

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` ; ecou e=$e

se va afișa pe ecran

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

Operația de înmulțire ("*") trebuie să fie eliminată, deoarece în shell această pictogramă este percepută ca un caracter special, ceea ce înseamnă că orice succesiune de caractere poate fi înlocuită în acest loc. Cu comanda „expr”, sunt posibile nu numai operații aritmetice (întregi), ci și pe șir:

A=`expr "cocktail" : "cocos"` ; echo $A B=`expr "cocktail" : "coada"` ; echo $B C=`expr "cocktail" : "gătește"` ; echo $C D=`expr "cock" : "cocktail"` ; eco $D

Pe ecran vor fi afișate numere arătând numărul de caractere care se potrivesc din lanțuri (de la început). A doua linie nu poate fi mai lungă decât prima:

4 0 0 0

Exportarea variabilelor UNIX OS are conceptul de proces. Un proces are loc atunci când o comandă este executată. De exemplu, când tastați „p” pe tastatură "procesul "p" este generat. La rândul său, "p" poate genera alte procese. Să presupunem că "p" numește "p1" și "p2", care generează succesiv procesele corespunzătoare. Fiecare proces are propriul mediu - un set de variabile disponibile pentru el De exemplu, înainte de lansarea „p” exista deja un mediu în care unele variabile erau deja definite. Lansarea „p” generează un nou mediu; „p1” și „p2” vor fi deja generate în el. Variabilele sunt locale procesului în care au declarat, adică unde li se atribuie valori. Pentru ca acestea să fie disponibile pentru alte procese generate, ele trebuie transmise în mod explicit. Pentru a face acest lucru, utilizați comanda încorporată „export”.

Opțiuni

Parametrii pot fi transferați în fișierul de comandă. Shell-ul folosește parametri de poziție (adică ordinea în care apar este importantă). În fișierul de comandă, variabilele corespunzătoare parametrilor (asemănătoare variabilelor shell) încep cu simbolul „$”, urmat de unul dintre numerele de la 0 la 9: Fie numit „examp-1” cu parametrii „cock” și „coada”. Acești parametri intră în noul mediu sub denumirile standard „1” și „2”. Variabila (standard) numită „0” va stoca numele calculului apelat. La accesarea parametrilor, numărul este precedat de simbolul dolarului „$” (ca la accesarea variabilelor): $0 corespunde numelui acestui fișier de comandă; $1 este primul parametru în ordine; parametru $2 secunde etc. Deoarece numărul de variabile la care pot fi transferați parametrii este limitat la o cifră, de exemplu. 9 („0”, după cum sa menționat deja, are o semnificație specială), apoi pentru transmitere Mai mult parametrii, se folosește comanda specială „shift”. Comanda „set” oferă o abordare unică a parametrilor. De exemplu, fragment

Setați un b cu ecou primul=$1 secundă=$2 al treilea=$3

se va afișa pe ecran

Prima=a doua=b a treia=c

acestea. comanda „set” stabilește valorile parametrilor. Acest lucru poate fi foarte convenabil. De exemplu, comanda „date” afișează data curentă, spuneți „Luni Mai 01 12:15:10 2000”, constând din cinci cuvinte, apoi

Setați ecou `date` $1 $3 $5

se va afișa pe ecran

Luni 01 2000

Comanda „set” vă permite, de asemenea, să controlați execuția programului, de exemplu: liniile set -v sunt scoase la terminal, citite de shell. set +v anulează modul anterior. set -x imprimă comenzile către terminal înainte de execuție. set +x anulează modul anterior. Comanda „set” fără parametri afișează starea mediului software către terminal.

Înlocuiri de cochilii

Înainte de a interpreta și executa direct comenzile conținute în fișierele batch, shell-ul se execută tipuri diferite substituiri: 1. ÎNLOCUIREA REZULTATELOR. Toate comenzile cuprinse între ghilimele sunt executate și rezultatul este înlocuit în locul lor. 2. ÎNLOCUIREA VALORILOR PARAMETRILOR ȘI VARIABILELE. Adică, cuvintele care încep cu „$” sunt înlocuite cu valorile corespunzătoare ale variabilelor și parametrilor. 3. INTERPRETAREA LACUNELOR. Spațiile evadate sunt ignorate. 4. GENERAREA NUMELE DE FIȘIERE. Cuvintele sunt verificate pentru prezența caracterelor speciale ("*", "?","") și sunt efectuate generațiile corespunzătoare. Mediu software Fiecare proces are un mediu în care rulează. Shell utilizează o serie de aceste variabile de mediu. Dacă tastați comanda „set” fără parametri, ecranul va afișa informații despre un număr de variabile standard create la conectare (și apoi transmise tuturor noilor procese „moștenite”), precum și variabilele create și exportate de procesele dvs. . Tipul specific și conținutul informațiilor furnizate depind în mare măsură de tipul de informații Versiunea UNIX utilizat și cum este instalat sistemul.

Rezultatul executării comenzii setate fără parametri (necomplet):

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

Să comentăm valorile variabilelor. HOME=/root este numele directorului principal în care ajunge utilizatorul după conectare. Adică, după ce am introdus corect numele și parola, mă voi găsi în directorul „/root”. PATH=/bin:/usr/bin:.:/usr/local/bin:/usr/bin/X11 - această variabilă specifică secvența fișierelor pe care shell-ul le caută în căutarea unei comenzi. Numele fișierelor sunt separate aici prin două puncte. Secvența de vizionare corespunde ordinii numelor din traseu. Dar inițial căutarea are loc printre așa-numitele comenzi încorporate. Comenzile încorporate includ cele mai frecvent utilizate comenzi, cum ar fi „echo”, „cd”, „pwd”, „date”. După aceasta, sistemul caută prin directorul „/bin”, care poate conține comenzile „sh”, „cp”, „mv”, „ls”, etc. Apoi directorul „/usr/bin” cu comenzile „cat”, „ss”, „expr”, „nroff”, „man” și multe altele. În continuare, căutarea are loc în directorul curent ("".", sau altă denumire "gol", adică ""), unde se află cel mai probabil comenzile pe care le-ați scris. După ce ați tastat linia de comandă și apăsați „shell” (după efectuarea înlocuirilor necesare) recunoaște numele corespunzător comenzii și îl caută în directoarele listate în PATH. Dacă comanda este plasată în afara acestor directoare, nu va fi găsită. Dacă există mai multe comenzi cu acelasi nume, apoi va fi apelat cel care se află în directorul vizualizat primul. PATH, ca și alte variabile, poate fi schimbat cu ușurință prin adăugarea, rearanjarea sau ștergerea directoarelor. IFS= (Internal Field Separator) listează caractere care servesc la separarea cuvintelor (câmpurilor). Acestea sunt „spațiu”, „tab” și „line feed”, așa că aici nimic nu este vizibil în stânga sarcinii și două linii sunt ocupate. LOGNAME=rădăcină - nume de autentificare („nume de utilizator”). MAIL=/var/spool/mail/root - numele fișierului în care este primit mesajul (e-mail). PWD=/root - numele directorului curent PS1=$(PWD): " " - tipul directorului. În acest caz, prompterul va afișa numele directorului curent urmat de două puncte și un spațiu. Adică va exista „/root:”. PS2=> - acest prompt (aici „>”) este folosit ca o invitație pentru a continua introducerea (în linia următoare) a unei comenzi neterminate. De exemplu, tastați paranteza de deschidere „(” și după apăsare V rândul următor veți vedea acest prompter. Dacă nu știi ce să faci în continuare, tastați paranteza de închidere „)” și va dispărea. SHELL=/bin/sh - Această variabilă specifică shell-ul pe care îl folosește utilizatorul. În acest caz, se utilizează shell-ul standard ("sh"). Mediul inițial este instalat automat la autentificare folosind fișiere precum „/etc/rc” și „/etc/.profile”. O modalitate de a schimba pur și simplu mediul (de exemplu, calea de căutare a comenzii, tipul programului, tipul shell-ului, culoarea ecranului etc.) este plasarea acestor informații în directorul dvs. principal într-un fișier specializat „.profile” ($(HOME)/ . profil), atribuirea valorile cerute variabile de mediu. Adică apelați acest fișier în editor și scrieți ce doriți). Apoi, de fiecare dată când vă conectați, acest fișier va fi executat automat și va instala un nou mediu. Acest fișier TREBUIE plasat în dvs Director HOME(directoare de intrare). Trebuie reținut că numele fișierelor care încep cu un punct au în general un statut special. Astfel, ele nu sunt afișate pe ecran cu o simplă comandă „ls” - trebuie să apelați această comandă cu steag „-a”. Apropo, ele nu sunt distruse fără discernământ de comanda „rm *”. Interpretul shell însuși atribuie automat valori următoarelor variabile (parametri): ? valoarea returnată de ultima comandă; $ număr proces; ! numărul procesului de fundal;

  1. numărul de parametri de poziție trecuți la shell;
  • lista de parametri ca o singură linie;

@ lista de parametri, ca un set de cuvinte; - steaguri trecute la cochilie. Când accesați aceste variabile (adică când le folosiți într-un fișier de comandă - program shell), ar trebui să puneți „$” în față. Un rol important în crearea fișierelor unice îl joacă variabila specială „$$”, a cărei valoare corespunde numărului procesului care efectuează acest calcul. Fiecare calcul nou efectuat de un computer inițiază unul sau mai multe procese care primesc automat numere în ordine. Prin urmare, folosind numărul procesului ca nume de fișier, puteți fi sigur că fiecare fișier nou va avea un nume nou (nu va fi scris în locul celui existent). Avantajul este și principalul dezavantaj al acestei metode de denumire a fișierelor. Nu se știe ce nume vor fi atribuite fișierelor. Și, dacă în cadrul acestui proces puteți găsi un fișier „fără a căuta”, adică accesând-l folosind $$, atunci astfel de fișiere pot fi pierdute cu ușurință. Acest lucru creează probleme suplimentare la depanarea programelor. Apelarea interpretului După înregistrarea utilizatorului în sistem (folosind comanda de conectare), este apelat interpretul limbajului SHELL. Dacă directorul de înregistrare al utilizatorului conține un fișier .profile, atunci înainte ca cel puțin o comandă să fie primită de la terminal, interpretul execută acest fișier (se presupune că fișierul .profile conține comenzi). La apelare, pot fi specificate următoarele taste: -c șir Comenzile sunt citite din șirul dat. -s Comenzile sunt citite de la intrarea standard. Mesajele interpretului sunt scrise într-un fișier de diagnosticare standard. -i Mod de operare interactiv. Dacă primul caracter al parametrului „0” este un semn -, atunci comenzile sunt citite din fișierul .profile.

STRUCTURILE PROGRAMULUI===

Ca în orice limbaj de programare, textul shell poate conține comentarii. Simbolul „#” este folosit pentru aceasta. Tot ceea ce este pe linia (în fișierul de comandă) din stânga acestui caracter este perceput de interpret ca un comentariu. De exemplu,

# Acesta este un comentariu.

Ca în fiecare limbaj procedural Limbajul de programare Shell are operatori. O serie de operatori vă permit să controlați secvența de execuție a comenzii. La astfel de operatori, este adesea necesar să se verifice starea, care determină direcția în care continuă calculele.

Comanda Test("")

Comanda de testare verifică dacă este îndeplinită o anumită condiție. Instrucțiunile de selectare și buclă a limbajului Shell sunt generate folosind această comandă (încorporată). Două formate de comandă posibile:

Condiție de testare

[ condiție ]

vom folosi a doua opțiune, adică În loc să scriem cuvântul „test” înainte de condiție, vom include condiția între paranteze, ceea ce este mai comun pentru programatori. De fapt, shell-ul va recunoaște această comandă după paranteza de deschidere „[” ca cuvânt corespunzător comenzii „test”. Trebuie să existe spații între paranteze și starea pe care o conțin. Trebuie să existe, de asemenea, spații între valori și simbolul de comparație sau operație. Shell folosește condiții de diverse „tipuri”. CONDIȚII DE VERIFICARE FIȘIERE: -f fișier fișier „fișier” este un fișier obișnuit; -d fișier fișier „fișier” - director; -с fișier fișier „fișier” este un fișier special; -r fișierul are permisiunea de a citi fișierul „fișier”; -w fișierul are permisiunea de a scrie în fișierul „fișier”; -s fișierul „fișier” nu este gol.

CONDIȚII PENTRU TESTAREA ȘIRURILOR: str1 = str2 șirurile „str1” și „str2” se potrivesc; str1 != str2 șirurile „str1” și „str2” nu sunt aceleași; -n str1 șirul „str1” există (nevid); -z str1 șirul „str1” nu există (gol). Exemple.

X="cine este cine"; export x; [ "cine este cine" = "$x" ]; eco $? 0 x=abc ; export x ; [ abc = "$x" ] ; eco $? 0 x=abc ; export x ; [ -n "$x" ] ; eco $? 0 x="" ; export x ; [ -n "$x" ] ; eco $? 1

În plus, există două valori standard de condiție care pot fi utilizate în locul condiției (nu sunt necesare paranteze pentru aceasta). CONDIȚII PENTRU COMPARAREA ÎNTREGURILOR: x -eq y "x" este egal cu "y", x -ne y "x" nu este egal cu "y", x -gt y "x" este mai mare decât "y", x - ge y „x” este mai mare sau egal cu „y”, x -lt y „x” mai mic decât „y”, x -le y „x” mai mic sau egal cu „y”. CONDIȚII COMPLEXE: Implementat folosind operații logice standard: ! (nu) inversează valoarea codului de ieșire. -o (sau) se potrivește cu „SAU” logic. -a (și) se potrivește cu „ȘI” logic.

Declarația condiționată „dacă”

În general, declarația „dacă” are structura

Dacă starea, atunci lista

Aici „elif” o versiune prescurtată a „altfel dacă” poate fi folosită împreună cu cea completă, de exemplu. imbricarea unui număr arbitrar de instrucțiuni „dacă” (precum și alte instrucțiuni) este permisă. Desigur, „lista” în fiecare caz trebuie să fie semnificativă și acceptabilă în contextul dat. Cea mai trunchiată structură a acestui operator

Dacă condiție atunci lista fi

dacă condiția este îndeplinită (de obicei aici este primit codul de completare "0"), atunci "lista" este executată, în caz contrar se omite. Exemple: Să se scrie "dacă-1"

Dacă [ $1 -gt $2 ]

apoi pwd else echo $0: Bună ziua!

Apoi apelând if-1 12 11 va produce /home/sae/STUDY/SHELL și if-1 12 13 va produce if-1: Bună ziua!

Operator de apel („caz”)

Operatorul de selecție „caz” are structura:

Șir de caz înăuntru

șablon) listă de comenzi;; șablon) listă de comenzi;; ... șablon) listă de comenzi;;

Aici „caz”, „în” și „esac” sunt cuvinte funcționale. „Șirul” (acesta poate fi un singur caracter) este comparat cu „modelul”. „Lista de comenzi” a liniei selectate este apoi executată. „;;” pare neobișnuit la sfârșitul liniilor de selecție, dar scrieți „;” aici ar fi o greseala. Pot fi executate mai multe comenzi pentru fiecare alternativă. Dacă aceste comenzi sunt scrise pe o singură linie, atunci simbolul „;” va fi folosit ca separator de comenzi. De obicei, ultima linie de selecție are modelul „*”, care într-o structură „caz” înseamnă „orice valoare”. Această linie este selectată dacă valoarea variabilei (aici $z) nu se potrivește cu niciunul dintre modelele scrise anterior delimitate de paranteza ")". Valorile sunt vizualizate în ordinea în care au fost scrise.

Operator de buclă enumerat ("for")

Operatorul buclei „for” are structura:

Pentru nume

do listă de comenzi efectuate unde „for” este un cuvânt auxiliar care definește tipul de buclă, „do” și „done” sunt cuvinte auxiliare care evidențiază corpul buclei. Lăsați comanda „lsort” să fie reprezentată de un fișier batch

Pentru i în file_1 file_2 file_3 nu proc_sort $i terminat

În acest exemplu, numele „i” acționează ca un parametru de buclă. Acest nume poate fi considerat ca o variabilă shell căreia valorile listate sunt alocate secvenţial (i=file_1, i=file_2, i=file_3), iar comanda „proc_sort” este executată într-o buclă. Este adesea folosită forma „pentru i în *”, adică „pentru toate fișierele din directorul curent”. Lăsați „proc_sort” la rândul său să fie reprezentat de un fișier batch

Cat $1 | sortare | tee /dev/lp > $(1)_sorted

acestea. fișierele specificate sunt sortate secvențial, rezultatele sortării sunt tipărite ("/dev/lp") și trimise la fișierele file_1_sorted file_2_sorted și file_3_sorted

Declarație buclă cu condiție adevărată ("while")

Structura „while”, care efectuează și calcule, este de preferat atunci când lista exactă a valorilor parametrilor este necunoscută în prealabil sau această listă trebuie obținută ca urmare a calculelor într-o buclă. Instrucțiunea buclă „while” are structura:

În timp ce starea

do listă de comenzi efectuate unde „while” este un cuvânt auxiliar care determină tipul de buclă cu o condiție adevărată. Lista comenzilor din corpul buclei (între „do” și „done”) se repetă până când condiția rămâne adevărată (adică, codul de completare al ultimei comenzi din corpul buclei este „0”) sau bucla nu este întreruptă din interior prin comenzi speciale ("break", "continue" sau "exit"). Când intrați pentru prima dată în buclă, condiția trebuie să fie adevărată. Comanda „break [n]” vă permite să ieșiți dintr-o buclă. Dacă „n” lipsește, atunci este echivalent cu „break 1”. „n” indică numărul de bucle imbricate din care să ieși, de exemplu, „break 3” - ieșire din trei bucle imbricate. Spre deosebire de comanda „break”, comanda „continue [n]” oprește doar execuția buclei curente și revine la ÎNCEPUTUL buclei. Poate fi și cu un parametru. De exemplu, „continuare 2” înseamnă ieșire la începutul celei de-a doua bucle imbricate (numărând de la adâncime). Comanda „exit [n]” vă permite să ieșiți complet din procedură cu un cod de returnare „0” sau „n” (dacă este specificat parametrul „n”). Această comandă poate fi folosită în mai mult decât în ​​bucle. Chiar și într-o secvență liniară de comenzi, poate fi util în depanare să opriți calculul (actual) la un punct dat.

Declarație buclă cu condiție falsă ("până")

Operatorul de buclă „până” are structura:

Până la stare

do listă de comenzi efectuate unde „până” este un cuvânt auxiliar care determină tipul de buclă cu o condiție falsă. Lista comenzilor din corpul buclei (între „do” și „done”) se repetă până când condiția rămâne falsă sau bucla este întreruptă din interior de comenzi speciale („break”, „continue” sau „exit” ). Prima dată când intri în buclă, condiția nu ar trebui să fie adevărată. Diferența față de operatorul „while” este că condiția buclei este verificată pentru falsitate (pentru un cod de ieșire diferit de zero al ultimei comenzi a corpului buclei) și este verificată DUPĂ fiecare (inclusiv prima!) execuție a comenzilor în corpul buclei. Exemplu.

Până la fals face

citește x dacă [ $x = 5 ] atunci ecou suficient ; break else ecou ceva mai fi

Iată programul cu buclă nesfârșită așteaptă introducerea cuvintelor (repetând expresia „mai multe” pe ecran) până când se introduce „5”. După aceasta, se emite „enough” și comanda „break” oprește executarea buclei.

Operator gol

Declarația goală are formatul

:

Facand nimic. Returnează valoarea „0”.

Funcții în shell

Funcția vă permite să pregătiți o listă de comenzi shell pentru execuția ulterioară. Descrierea funcției arată astfel:

Nume() (lista de comenzi)

după care funcţia este numită după nume. Când funcția este executată, nu este creat niciun proces nou. Se rulează în mediul procesului corespunzător. Argumentele funcției devin parametrii ei poziționali; numele funcției este parametrul zero al acesteia. Puteți întrerupe execuția unei funcții folosind operatorul „return [n]”, unde (opțional) „n” este codul de returnare.

Manevrarea întreruperii („capcană”)

Poate fi necesar să se protejeze execuția programului de întrerupere. Cel mai adesea întâlniți următoarele întreruperi corespunzătoare semnalelor: 0 ieșire de la interpret, 1 închidere (deconectarea abonatului de la distanță), 2 întrerupere de la , 9 distrugere (neinterceptată), 15 sfârșit de execuție. Pentru a proteja împotriva întreruperilor, există o comandă „capcană”, care are formatul:

Capcană semnalele „listei de comandă”.

Dacă în sistem apar întreruperi ale căror semnale sunt enumerate separate printr-un spațiu în „semnale”, atunci se va executa „lista de comenzi”, după care (dacă comanda „ieșire” nu a fost executată în lista de comenzi) se va controla reveniți la punctul de întrerupere și execuția fișierului de comandă va continua. De exemplu, dacă înainte de a întrerupe execuția unui fișier de comandă este necesară ștergerea fișierelor din „/tmp”, atunci acest lucru se poate face cu comanda „trap”:

Capcană "rm /tmp/* ; ieșire 1" 1 2 15

care precede alte comenzi din fișier. Aici, după ștergerea fișierelor, fișierul de comandă va fi părăsit.

  • Tutorial

De ce și pentru cine este articolul?

Inițial, acesta a fost un memento pentru studenții care încep să lucreze cu sisteme asemănătoare Unix. Cu alte cuvinte, articolul este destinat celor care nu au experiență anterioară în lucrul cu linia de comandă Unix, dar dintr-un motiv sau altul doresc sau trebuie să învețe cum să interacționeze eficient cu ea.

Nu va exista repovestire a mana (documentație), iar articolul nu anulează sau înlocuiește în niciun fel citirea acestora. În schimb, voi vorbi despre principalele lucruri (comenzi, tehnici și principii) pe care trebuie să le înțelegeți încă de la începutul lucrului în shell-ul Unix pentru ca munca să fie eficientă și plăcută.

Articolul se referă la medii de tip Unix cu drepturi depline, cu un shell complet funcțional (de preferință zsh sau bash) și o gamă destul de largă de programe standard.

Ce este coaja

Shell (shell, alias „linia de comandă”, alias CLI, aka „consolă”, aka „terminal”, alias „fereastră neagră cu litere albe”) este o interfață text pentru comunicarea cu sistemul de operare (ei bine, strict vreau să spun, aceasta este program, care oferă o astfel de interfață, dar acum această diferență este nesemnificativă).

În general, lucrul printr-un shell arată astfel: utilizatorul (adică tu) introduce o comandă de la tastatură, apasă Enter, sistemul execută comanda, scrie rezultatul execuției pe ecran și așteaptă din nou următoarea comandă. a fi introdus.

Tip tipic de carcasă:

Shell-ul este modalitatea principală de a interacționa cu toate sistemele de server asemănătoare Unix.

Unde se găsesc sistemele de linie de comandă?

Acolo unde te-ar putea aștepta un shell Unix, opțiuni populare:
  • MacOS (bash);
  • acces de la distanță la server pentru muncă sau pentru un proiect web personal;
  • server de fișiere de acasă cu acces de la distanță;
  • Ubuntu, PC-BSD pe laptop/desktop - sistemele asemănătoare Unix de astăzi sunt ușor de instalat și utilizat.

Ce probleme sunt rezonabile de rezolvat cu un shell?

Sarcini naturale pentru care coaja este potrivită, utilă și indispensabilă:
  • lucru interactiv în terminal:
    • realizarea de compilare, rularea joburilor prin make;
    • compararea fișierelor text;
    • analiza rapidă ad-hoc a datelor (număr de IP-uri unice în jurnal, distribuția înregistrărilor pe ore/minute etc.);
    • acțiuni în masă unice (omorâți multe procese; dacă lucrați cu un sistem de control al versiunilor, inversați sau rezolvați o grămadă de fișiere);
    • diagnosticarea a ceea ce se întâmplă în sistem (semafore, încuietori, procese, descriptori, spațiu pe disc etc.);
  • scripting:
    • scripturi de instalare, pentru care nu vă puteți baza pe prezența altor interpreți - aceasta nu este pentru începători;
    • funcțiile pentru personalizarea shell-ului interactiv (afectarea invitației, schimbarea directorului, setarea variabilelor de mediu) nu sunt, de asemenea, tocmai pentru începători;
    • scripturi unice, cum ar fi recodificarea în masă a fișierelor;
    • makefiles.

Absolut primii pași

Să începem: conectați-vă și deconectați-vă

Asigurați-vă că știți exact cum să porniți shell-ul și cum să ieșiți din el.

Dacă lucrați pe o mașină cu Ubuntu instalat, trebuie să lansați programul Terminal. Când ați terminat, puteți pur și simplu să închideți fereastra.

Pe MacOS - lansați și Terminalul.

Pentru a accesa un server la distanță, utilizați ssh (dacă aveți MacOS, Ubuntu sau un alt sistem asemănător Unix la nivel local) sau putty (dacă aveți Windows).

Cine sunt eu, unde sunt?

Rulați următoarele comenzi:
  • hostname - afișează numele mașinii (serverului) pe care vă aflați în prezent;
  • whoami - afișează datele de conectare (numele tău în sistem);
  • tree -d / |less - reprezentare pseudografică a arborelui de directoare pe mașină; ieșire din defilare - q ;
  • pwd - afișează directorul în care vă aflați în prezent; pe linia de comandă nu poți fi „doar așa”, trebuie să fii într-un director (=director curent, director de lucru). Directorul de lucru curent este probabil afișat în promptul dvs.
  • ls - lista de fișiere din directorul curent; ls /home - lista de fișiere din directorul specificat;

Istoricul comenzilor (istoric)

O proprietate importantă a unei linii de comandă cu drepturi depline este istoricul comenzilor.

Rulați mai multe comenzi: hostname, ls, pwd, whoami. Acum apăsați tasta sus. Comanda anterioară apare în linia de introducere. Puteți utiliza tastele sus și jos pentru a vă deplasa înainte și înapoi prin istoric. Când ajungeți la numele gazdă, apăsați Enter - comanda va fi executată din nou.

Comenzile din istoric nu pot fi doar executate în mod repetat, ci și editate. Derulați istoricul la comanda ls, adăugați comutatorul -l la ea (se dovedește ls -l , există un spațiu înainte de minus, dar nu după). Apăsați Enter - comanda modificată va fi executată.

Derularea istoricului, editarea și re-executarea comenzilor sunt cele mai frecvente acțiuni atunci când lucrați pe linia de comandă, așa că obișnuiți-vă.

Copiaza si lipeste

Linia de comandă este foarte centrată pe text: comenzile sunt text, datele de intrare pentru majoritatea programelor standard sunt text, iar rezultatul este cel mai adesea text.

Lucrul grozav despre text este că poate fi copiat și lipit, iar acest lucru este valabil și pe linia de comandă.

Încercați data comenzii +"%y-%m-%d, %A"
L-ai introdus integral manual sau ai copiat-o din articol? Asigurați-vă că îl puteți copia, îl puteți lipi într-un terminal și îl puteți executa.

Odată ce ați învățat cum să utilizați man, asigurați-vă că puteți copia și rula exemple de comenzi din ajutor. Pentru a verifica, căutați secțiunea EXEMPLE din ajutorul programului de date, copiați și rulați primul exemplu dat (doar în cazul în care: semnul dolar nu face parte din comandă, aceasta este o imagine simbolică a unui prompt de intrare).

Cum să copiați exact textul de pe terminal și să-l lipiți în terminal depinde de sistemul dvs. și de setările acestuia, așa că, din păcate, nu va fi posibil să dați instrucțiuni universale. Pe Ubuntu, încercați acest lucru: copiați - doar selectați cu mouse-ul, lipiți - butonul din mijloc al mouse-ului. Dacă nu funcționează sau dacă aveți un alt sistem, căutați pe Internet sau întrebați prietenii mai experimentați.

Chei și opțiuni

Pe măsură ce ați explorat istoricul comenzilor, ați întâlnit deja că comanda ls are cel puțin două opțiuni. Dacă îl numiți așa, va scoate o listă simplă:

Akira@latitude-e7240: ~/shell-survival-quide> ls Makefile shell-first-steps.md shell-first-steps.pdf shell-survival-quide.md shell-survival-quide.pdf
Dacă adăugați comutatorul -l, informații detaliate sunt afișate pentru fiecare fișier:

Akira@latitude-e7240: ~/shell-survival-quide> ls -l total 332 -rw-rw-r-- 1 akira akira 198 feb 13 11:48 Makefile -rw-rw-r-- 1 akira akira 15107 feb. 14 22:26 shell-first-steps.md -rw-rw-r-- 1 akira akira 146226 Feb 13 11:49 shell-first-steps.pdf -rw-rw-r-- 1 akira akira 16626 Feb 13 11 :45 shell-survival-quide.md -rw-rw-r-- 1 akira akira 146203 Feb 13 11:35 shell-survival-quide.pdf
Aceasta este o situație foarte tipică: dacă adăugați modificatori speciali (taste, opțiuni, parametri) la un apel de comandă, comportamentul comenzii se schimbă. Comparați: arbore / și arbore -d / , nume de gazdă și nume de gazdă -f .

În plus, comenzile pot lua ca parametri nume de fișiere, nume de directoare sau pur și simplu șiruri de text. Încerca:

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

om

man - Ajutor cu comenzile și programele disponibile pe mașina dvs., precum și cu apelurile de sistem și cu biblioteca standard C.

Încercați: man grep , man atoi , man chdir , man man .

Derularea înainte și înapoi se face cu butoanele „sus”, „jos”, „PageUp”, „PageDown”, ieșirea din vizualizarea de ajutor se face cu butonul q. Căutați un anumit text într-un articol de ajutor: apăsați / (bară oblică), introduceți textul de căutat, apăsați Enter. Treceți la următoarele apariții - tasta n.

Toate articolele de ajutor sunt împărțite în categorii. Cel mai important:

  • 1 - programe executabile și comenzi shell (wc, ls, pwd etc.);
  • 2 - apeluri de sistem (fork, dup2 etc.)
  • 3 - funcții de bibliotecă (printf, scanf, cos, exec).
Este necesar să se indice din ce categorie trebuie prezentat certificatul în cazurile de coincidență de nume. De exemplu, man 3 printf descrie o funcție din biblioteca standard C, iar man 1 printf descrie un program de consolă cu același nume.

Puteți vizualiza o listă cu toate articolele de ajutor disponibile pe computer folosind comanda man -k. (punctul face și parte din komada).

Mai puțin

Când trebuie să vizualizați text foarte lung într-o fereastră de terminal mică (conținutul unui fișier, un om lung etc.), sunt folosite programe speciale „de paginare” (de la cuvântul pagină, adică pagina flippers). Cel mai popular scroller este mai puțin și este ceea ce vă oferă defilarea atunci când citiți paginile de manual.

Încercați să comparați comportamentul:

Cat /etc/bash.bashrc cat /etc/bash.bashrc |mai putin

Puteți transfera fișierul în pager direct în parametrii:

Mai puțin /etc/bash.bashrc

Derulare în sus și în jos - butoanele „sus”, „jos”, „PageUp”, „PageDown”, ieșire - butonul q. Căutați un anumit text: apăsați / (forward slash), introduceți textul de căutat, apăsați Enter. Treceți la următoarele apariții - tasta n. (Recunoașteți instrucțiunile despre om? Nu e de mirare, mai puțin este folosit și pentru a afișa ajutor.)

Drepturi

Orice fișier sau director este asociat cu un set de „drepturi”: dreptul de a citi fișierul, dreptul de a scrie în fișier, dreptul de a executa fișierul. Toți utilizatorii sunt împărțiți în trei categorii: proprietarul fișierului, grupul proprietarului fișierului și toți ceilalți utilizatori.

Puteți vizualiza permisiunile fișierelor folosind ls -l . De exemplu:

> ls -l Makefile -rw-r--r-- 1 akira student 198 Feb 13 11:48 Makefile
Această ieșire înseamnă că proprietarul (akira) poate citi și scrie fișierul, grupul (studenții) poate doar să citească și toți ceilalți utilizatori pot citi doar.

Dacă primiți un mesaj cu permisiunea refuzată în timp ce lucrați, aceasta înseamnă că nu aveți suficiente drepturi asupra obiectului cu care doriți să lucrați.

Citiți mai multe în man chmod.

STDIN, STDOUT, transportoare (tevi)

Există 3 fluxuri de date standard asociate fiecărui program în execuție: flux de date de intrare STDIN, flux de date de ieșire STDOUT, flux de ieșire de erori STDERR.

Rulați programul wc, introduceți textul Good day today, apăsați Enter, introduceți textul Good day, apăsați Enter, apăsați Ctrl+d. Programul wc va afișa statistici privind numărul de litere, cuvinte și rânduri din textul dvs. și se va termina:

> Wc ziua bună astăzi ziua bună 2 5 24
În acest caz, ați furnizat un text de două rânduri la STDIN-ul programului și ați primit trei numere în STDOUT.

Acum rulați comanda head -n3 /etc/passwd , ar trebui să arate cam așa:

> 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
În acest caz, programul principal nu a citit nimic din STDIN, ci a scris trei rânduri către STDOUT.

Vă puteți imagina astfel: programul este o conductă în care curge STDIN și STDOUT curge afară.

Cea mai importantă proprietate a liniei de comandă Unix este că programele „pipe” pot fi conectate între ele: ieșirea (STDOUT) a unui program poate fi transmisă ca date de intrare (STDIN) unui alt program.

O astfel de construcție a programelor conectate se numește conductă în engleză sau transportor sau conductă în rusă.

Combinarea programelor într-o conductă se face cu simbolul | (bară verticală)

Rulați comanda head -n3 /etc/passwd |wc , va arăta cam așa:

> head -n3 /etc/passwd |wc 3 3 117
Iată ce s-a întâmplat: programul cap a scos trei linii de text în STDOUT, care au mers imediat la intrarea programului wc, care la rândul său a numărat numărul de caractere, cuvinte și linii din textul rezultat.

Puteți combina câte programe doriți într-o conductă. De exemplu, puteți adăuga un alt program wc la conducta anterioară, care va număra câte cuvinte și litere au fost în rezultatul primului wc:

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

Crearea conductelor (pipe) este o sarcină foarte comună atunci când lucrați pe linia de comandă. Pentru un exemplu despre cum se face acest lucru în practică, citiți secțiunea „Crearea unei conducte cu o singură linie”.

Redirecționare I/O

Ieșirea (STDOUT) a unui program nu poate fi doar transferată într-un alt program printr-o conductă, ci și pur și simplu scrisă într-un fișier. Această redirecționare se face folosind > (mai mare decât semnul):

Data > /tmp/today.txt
Ca urmare a executării acestei comenzi, fișierul /tmp/today.txt va apărea pe disc. Vizualizați conținutul acestuia folosind cat /tmp/today.txt

Dacă un fișier cu același nume exista deja, conținutul său vechi va fi distrus. Dacă fișierul nu a existat, acesta va fi creat. Directorul în care este creat fișierul trebuie să existe înainte ca comanda să fie executată.

Dacă nu doriți să suprascrieți un fișier, ci mai degrabă să adăugați rezultate la sfârșitul acestuia, utilizați >> :

Data >> /tmp/today.txt
Verificați ce este acum scris în fișier.

În plus, puteți trece orice fișier programului în loc de STDIN. Încerca:

WC

Ce să faci când ceva nu este clar

Dacă întâmpinați un comportament de sistem pe care nu îl înțelegeți sau doriți să obțineți un anumit rezultat, dar nu știți cum, vă sfătuiesc să procedați în următoarea ordine (apropo, acest lucru se aplică nu numai shell-urilor):
  • Cât mai clar posibil, formulați întrebarea sau sarcina - nu este nimic mai dificil decât rezolvarea „ceva ce nu știu”;
  • amintiți-vă dacă ați întâmpinat deja aceeași problemă sau o problemă similară - în acest caz, merită să încercați soluția care a funcționat ultima dată;
  • citiți paginile de manual corespunzătoare (dacă înțelegeți ce pagini de manual sunt potrivite în cazul dvs.) - poate veți găsi exemple potrivite de utilizare a comenzilor, opțiunile necesare sau link-uri către alte comenzi;
  • gândește-te: este posibil să schimbi puțin sarcina? - poate, modificand putin conditiile, vei ajunge la o problema pe care deja stii sa o rezolvi;
  • pune întrebarea ta clar formulată într-un motor de căutare - poate că răspunsul poate fi găsit pe Stack Overflow sau pe alte site-uri;
Dacă niciuna dintre cele de mai sus nu ajută, cereți sfatul unui profesor, un coleg cu experiență sau un prieten. Și nu vă fie teamă să puneți întrebări „prostice” - nu este păcat să nu știți, este păcat să nu întrebați.

Dacă rezolvi o problemă dificilă (pe cont propriu, cu ajutorul internetului sau al altor persoane), notează-ți soluția în cazul în care aceeași problemă apare din nou pentru tine sau prietenii tăi. Îl poți înregistra într-un fișier text simplu, în Evernote sau îl poți publica pe rețelele sociale.

Metode de lucru

Copiaza si lipeste- din paginile de manual, din articolele de pe StackOverflow etc. Linia de comandă este formată din text, profitați de acest lucru: copiați și folosiți comenzi exemple, notați descoperirile de succes ca amintire, publicați-le pe Twitter și bloguri.

Trageți comanda anterioară din istoric, adăugați o altă comandă la conductă, rulați, repetați.Cm. Consultați și secțiunea „Crearea unei conducte cu o singură linie”.

Comenzi de bază

  • schimba in alt director: cd ;
  • vizualizarea conținutului fișierelor: pisică, mai puțin, cap, coadă;
  • manipulare fișiere: cp, mv, rm;
  • vizualizarea conținutului directorului: ls , ls -l , ls -lS ;
  • Structura directorului: arbore , arbore -d (directorul poate fi trecut ca parametru);
  • căutați fișiere: găsiți . -Nume ... ;

Analytics

  • wc, wc -l;
  • sort -k - sortează după câmpul specificat;
  • sort -n - sortare numerică;
  • diff - comparare fișiere;
  • grep , grep -v , grep -w , grep "\ " , grep -E - căutare text;
  • uniq , uniq -c - unicizarea șirurilor de caractere;
  • awk - în opțiunea awk „(printează $1)”, pentru a lăsa doar primul câmp din fiecare linie, $1 poate fi schimbat în $2, $3 etc.;

Diagnosticarea sistemului

  • ps axuww - informații despre procesele (programe care rulează) care rulează pe mașină;
  • top - vizualizare interactivă a proceselor cu cele mai mari resurse;
  • df - spațiu pe disc folosit și liber;
  • du - dimensiunea totală a fișierelor din director (recursiv cu subdirectoare);
  • strace , ktrace - ce numește sistemul face procesul;
  • lsof - ce fișiere folosește procesul;
  • netstat -na, netstat -nap - care porturi și socluri sunt deschise în sistem.

Este posibil să nu aveți unele programe; acestea trebuie să fie instalate suplimentar. În plus, unele opțiuni ale acestor programe sunt disponibile numai pentru utilizatorii privilegiați (root).

Execuție în vrac și semi-automată

La început, săriți peste această secțiune; veți avea nevoie de aceste comenzi și construcții atunci când ajungeți la scripting shell simplu.
  • testare - verificarea conditiilor;
  • while citire - bucla linie cu linie STDIN ;
  • xargs - înlocuirea șirurilor de caractere din STDIN în parametrii programului specificat;
  • seq - generarea de secvențe de numere naturale;
  • () - combina iesirea mai multor comenzi;
  • ; - faceți un lucru după altul;
  • && - se execută dacă prima comandă se finalizează cu succes;
  • || - executați dacă prima comandă eșuează;
  • tee - duplicați ieșirea programului în STDOUT și într-un fișier de pe disc.

Diverse

  • data - data curenta;
  • curl - descarcă un document de la adresa URL specificată și scrie rezultatul în STDOUT;
  • atingere - actualizați data modificării fișierului;
  • kill - trimite un semnal procesului;
  • adevărat - nu face nimic, returnează adevărat, util pentru organizarea buclelor eterne;
  • sudo - executați comanda ca root „a.

Crearea unei conducte cu o singură linie

Să ne uităm la un exemplu de sarcină reală: trebuie să omorâm toate procesele task-6-server care rulează ca utilizator curent.

Pasul 1.
Înțelegeți care program produce aproximativ datele necesare, chiar dacă nu în forma sa pură. Pentru sarcina noastră, merită să obțineți o listă a tuturor proceselor din sistem: ps axuww. Lansa.

Pasul 2.
Priviți cu ochii datele primite, veniți cu un filtru care va elimina unele dintre datele inutile. Acesta este adesea grep sau grep -v . Folosiți tasta „Sus” pentru a scoate comanda anterioară din istoric, alocați-i un filtru inventat și rulați-o.

Ps axuww |grep `whoami`
- numai procesele utilizatorului actual.

Pasul 3.
Repetați pasul 2 până când obțineți datele curate de care aveți nevoie.

"
- toate procesele cu numele cerut (plus, poate, altele suplimentare, cum ar fi vim task-6-server.c, etc.),

Ps axuww |grep `whoami` | grep "\ " | grep -v vim ps axuww |grep `whoami` | grep "\ " | grep -v vim |grep -v mai puțin
- numai procesele cu numele cerut

Ps axuww |grep `whoami` | grep "\ " | grep -v vim |grep -v mai puțin |awk "(printați $2)"

Datele proceselor necesare, pasul 3 finalizat

Pasul 4.
Aplicați un manipulator final adecvat. Folosind tasta „Sus”, scoatem comanda anterioară din istoric și adăugăm procesare care va finaliza soluția problemei:

  • |wc -l pentru a număra numărul de procese;
  • >pids pentru a scrie pid-uri într-un fișier;
  • |xargs ucide -9 procese de ucidere.

Sarcini de instruire

Vrei să exersezi noi abilități? Încercați următoarele sarcini:
  • obțineți o listă cu toate fișierele și directoarele din directorul dvs. principal;
  • obțineți o listă cu toate articolele man din categoria 2 (apeluri de sistem);
  • numărați de câte ori apare cuvântul grep în pagina de manual a programului grep;
  • numără câte procese rulează în prezent ca root;
  • găsiți ce comandă apare în numărul maxim de categorii de ajutor (om);
  • numără de câte ori apare cuvântul var pe pagina ya.ru.
Sugestie: veți avea nevoie de find , grep -o , awk "(print $1)" , expresii regulate în grep , curl -s .

Ce să studiezi mai departe?

Dacă începe să-ți placă linia de comandă, nu te opri, continuă să-ți îmbunătățești abilitățile.

Iată câteva programe care vă vor fi cu siguranță utile dacă locuiți pe linia de comandă:

  • găsiți cu opțiuni complexe
  • apropos
  • localiza
  • telnet
  • netcat
  • tcpdump
  • rsync
  • ecran
  • zgrep, zless
  • visudo
  • crontab -e
  • sendmail
În plus, de-a lungul timpului merită să stăpânești un fel de limbaj de scripting, cum ar fi perl sau python, sau chiar ambele.

Cine are nevoie de asta?

Merită chiar să învățați astăzi linia de comandă și scriptul shell? Cu siguranță merită. Voi da doar câteva exemple de cerințele Facebook pentru candidații care doresc să obțină un loc de muncă la FB.

Cele mai bune articole pe această temă