Bazele programării în shell-ul de comandă shell. Evoluția Shell-urilor Linux

Shell-urile de comandă au apărut chiar la începutul dezvoltării Unix, erau necesare deoarece erau singura modalitate de a interacționa cu sistemul. În acest timp, au parcurs un drum foarte lung de dezvoltare și au primit multe funcții noi. Nu este ușor să apreciezi evoluția shell-urilor Linux. Puteți scrie despre asta foarte mult timp și cu siguranță un articol nu este suficient. Vom încerca să acoperim doar elementele de bază, fără a merge prea adânc. Să ne uităm mai întâi la ce este shell-ul de comandă Linux și ce shell-uri există.

Ce este un shell Linux/Unix

Shell-ul Unix este un interpret de linie de comandă care execută comenzile introduse de utilizator. Introducem o comandă, este interpretată, executată și apoi obținem rezultatul executării ei. Shell-ul oferă interfața tradițională de intrare a comenzilor Unix cu care suntem obișnuiți. Acesta este de obicei un ecran negru și text alb. Introducem comenzi în text simplu și, de asemenea, putem crea scripturi din una sau mai multe comenzi.

Shell-ul este interfața ta pentru a interacționa cu sistemul. După ce vă conectați la un sistem Unix, vă aflați într-un program numit shell.

Shell Thompson

Dacă este de crezut istoria și multe surse de pe Internet, primul shell a fost Thompson Shell, scris de Ken Thomson la Bell Labs. Au fost 6 versiuni în total și a fost distribuit din 1971 până în 1975. Caracteristici precum redirecționarea I/O și construcțiile simple de control - if, goto - au fost acceptate. Aceste funcții acceptă toate shell-urile de comandă Linux moderne.

Shell PWB

Carcasa PWB este o modificare a carcasei Thomson dezvoltată de John Masheu. A fost scris pentru a spori confortul programării Shell. Au apărut structuri interesante, cum ar fi bucle if-then-else-endif, switch și while.

Bourne Shell

Unix și-a început ascensiunea cu shell-ul Bourne. A fost scris de Stefan Born la Bell Labs și a fost folosit ca shell implicit în versiunea Unix 7 din 1979. Un număr mare de caracteristici disponibile în shell-urile moderne au fost deja implementate aici - completarea numelui fișierului, finalizarea comenzii, variabilele de mediu standard și structurile de control încorporate. Bourne Shell se numea sh și se afla pe sistemul de fișiere Unix la /bin/sh.

Pe multe sisteme, un program Bourne shell (sh) este o legătură simbolică sau hard către una dintre alternativele sale:

  • coajă Almquist (cenuşă)
  • Bourne-Again shell (bash)
  • Shell Korn (ksh)
  • Z shell (zsh)

Exemplu de script pentru Bourne Shell:

!/bin/sh
echo "Bună ziua Lumea 1!"
echo „Hello World 2!”

coajă Almquist (cenuşă)

Shell Almquist, cunoscut și sub numele de A Shell. Este un shell Unix ușor scris inițial de Kenneth Almquist. A fost dezvoltat la sfârșitul anilor 1980. Aceasta este o modificare a shell-ului Bourne și a înlocuit originalul în BSD Unix lansat în 1990. Acum poate fi folosit în distribuții precum Debian și Ubuntu ca o versiune de ash numită dash (Debian Almquist shell).

Este un shell Unix rapid, compact și compatibil cu POSTIX, motiv pentru care este adesea folosit pe dispozitive încorporate. Dar ash nu acceptă istoricul comenzilor. Deși în versiunile moderne această funcție a fost deja adăugată.

Bourne-Again Shell (Bash)

Scris de Brian Fox ca parte a Proiectului GNU ca înlocuitor gratuit și open source pentru shell-ul Bourne. Bash este cel mai popular și utilizat pe scară largă dintre toate shell-urile. Toate distribuțiile Linux vin cu acest shell în mod implicit. Extinde setul de caracteristici Bourne Shell. Pe majoritatea sistemelor Unix/Linux, acest shell poate fi găsit în sistemul de fișiere la /bin/bash. A fost lansat în 1989.

Datorită acestei popularități, a fost portat pe Windows și distribuit împreună cu un set de compilatoare Cygwin și MinGW. Bash este folosit și în Android și poate fi accesat folosind diverse emulatoare de terminale.

Acceptă completarea automată, redirecționarea I/O, finalizarea comenzilor, variabile și structuri de control pentru luarea deciziilor (dacă-atunci-elese dacă) și bucle.

Scripturile Bash încep cu această linie:

Acest shell Linux acceptă, de asemenea, citirea comenzilor dintr-un fișier și redirecționarea ieșirii către un fișier sau o altă comandă.

Exemplu de cod în Bash:

!/bin/sh
dacă [ $zile -gt 365 ]
apoi
echo Acesta este peste un an.
fi

Shell Korn (ksh)

Scris de David Kron și bazat pe codul sursă Bourne shell. KornShell (ksh) este un shell dezvoltat la Bell Labs în 1980. Este compatibil cu Bourne Shell și include, de asemenea, multe dintre caracteristicile shell-ului C.

Există următoarele versiuni și modificări:

  • Dtksh
  • Carcasă MKS Korn

Exemplu de script:

!/bin/ksh
print Utilizarea spațiului pe disc
du-k
iesirea 0

Z shell (zsh)

Paul Falstad a scris prima versiune cu comanda zsh shell în 1990. Este un shell de comandă Linux care poate fi folosit ca un shell de conectare interactiv, un interpret de comandă foarte puternic. Zsh este de fapt un shell Bourne îmbunătățit, cu multe îmbunătățiri, care include unele caracteristici de la Bash, KSH și Tcsh.

Numele Zsh vine de la profesorul Yale Zhong Shao, deoarece Paul era student la Universitatea Princeton.

Sunt acceptate următoarele caracteristici interesante:

  • Finalizarea liniei
  • Istoricul comenzilor partajate pentru toate sesiunile shell
  • Lucru îmbunătățit cu variabile și matrice
  • Editarea mai multor linii într-un singur buffer
  • Corectarea ortografică și multe altele.

C coajă

Shell-ul C este cunoscut și sub numele de Csh. A fost dezvoltat de Bill Joy când era student la Universitatea din California. Acest shell este foarte comun pe sistemele BSD Linux. Există multe caracteristici interesante aici, inclusiv structuri de control și expresii gramaticale. Acest shell a introdus, de asemenea, un număr mare de caracteristici interesante pentru prima dată, cum ar fi istoric și mecanisme de editare, aliasuri, CDPATH, managementul sarcinilor și hashing, redirecționarea ieșirii, adăugarea, înlocuirea variabilelor, execuția în fundal etc.

Ca și alte tipuri de shell-uri Linux, acceptă fișiere script, redirecționare și structuri de control. Csh este acum folosit ca tcsh pe multe sisteme, cum ar fi MacOS X și Red Hat Linux. Pe Debian puteți folosi atât CSH, cât și Tcsh.

Exemplu de cod în C Shell:

!/bin/csh
dacă ($zile > 365) atunci
echo Acesta este peste un an.
endif

Peşte

Fish sau Friendly Interactive Shell este un shell de comandă Linux de nouă generație. Este conceput pentru a facilita executarea comenzilor de către utilizator, există evidențierea sintaxei, evidențierea adreselor corecte de fișiere, căutarea rapidă în istoric, un configurator web, precum și o sintaxă specială de script.

Acesta este un nou shell de comandă în Linux și sintaxa sa este diferită de orice alt shell de comandă modern, ci mai degrabă ca limbajul de programare Python.

Un exemplu de creare a unei funcții în pește:

!/usr/bin/fish
funced su
functia su
/bin/su --shell=/usr/bin/fish $argv
Sfârşit
funcsave su

Puteți vedea o comparație mai detaliată a shell-urilor de comandă în Linux la link.

Totul este pentru azi. Sper că l-ai găsit interesant.

  • 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:
    • compilarea, 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ții pentru personalizarea shell-ului interactiv (afectarea invitației, schimbarea directorului, setarea variabilelor de mediu) - de asemenea, nu în totalitate 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 Terminal.

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 - listă 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 intrare. Puteți folosi tastele sus și jos pentru a vă deplasa înainte și înapoi prin istoric. Când ajungeți la hostname, 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 tipice acțiuni atunci când lucrați pe linia de comandă, 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 minunat 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. 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 folosind butoanele „sus”, „jos”, „PageUp”, „PageDown” ieșirea din vizualizarea de ajutor se face cu butonul q. Căutați text specific într-un articol de ajutor: apăsați / (slash înainte), 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 și 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 text specific: apăsați / (slash înainte), 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 are un set de „drepturi” asociate cu acesta: 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, 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 permisiuni pentru obiectul 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 al 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ă la 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 utilizaț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: tree , tree -d (puteți trece directorul 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;
  • 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 care trebuie instalate în plus. Î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 scripturi simple.
  • 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
  • apropo
  • 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, de exemplu, 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.
  • 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:
    • compilarea, 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ții pentru personalizarea shell-ului interactiv (afectarea invitației, schimbarea directorului, setarea variabilelor de mediu) - de asemenea, nu în totalitate 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 Terminal.

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 - listă 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 intrare. Puteți folosi tastele sus și jos pentru a vă deplasa înainte și înapoi prin istoric. Când ajungeți la hostname, 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 tipice acțiuni atunci când lucrați pe linia de comandă, 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 minunat 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. 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 folosind butoanele „sus”, „jos”, „PageUp”, „PageDown” ieșirea din vizualizarea de ajutor se face cu butonul q. Căutați text specific într-un articol de ajutor: apăsați / (slash înainte), 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 și 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 text specific: apăsați / (slash înainte), 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 are un set de „drepturi” asociate cu acesta: 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, 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 permisiuni pentru obiectul 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 al 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ă la 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 utilizaț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: tree , tree -d (puteți trece directorul 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;
  • 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 care trebuie instalate în plus. Î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 scripturi simple.
  • 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
  • apropo
  • 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, de exemplu, 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.

După cum sa menționat mai sus, pentru a construi algoritmi arbitrari este necesar să existe operatori de verificare a condițiilor. Coajă bash susține declarațiile de selecție dacăapoialtceva și caz, precum și operatorii de buclă pentru,in timp ce, pana cand, ceea ce îl face un limbaj de programare puternic.

5.8.1 Operatori dacăȘi Test(sau )

Construcția operatorului condiționat într-o formă ușor simplificată arată astfel:

dacă list1 atunci list2 else list3 fi

Unde lista1, lista2 și lista3 sunt secvențe de comenzi separate prin virgule și care se termină cu un caracter punct și virgulă sau linie nouă. În plus, aceste secvențe pot fi incluse în acolade: (listă).

Operator dacă verifică valoarea returnată de comenzile de la lista1. Dacă există mai multe comenzi în această listă, atunci valoarea returnată de ultima comandă din listă este verificată. Dacă această valoare este 0, atunci comenzile de la lista2; dacă această valoare nu este zero, comenzile de la lista3. Valoarea returnată de un astfel de operator compus dacă, este aceeași cu valoarea produsă de ultima comandă a secvenței executate.

Format de comandă complet dacă are forma:

if list then list [ elif list then list ] ... [ else list ] fi

(aici parantezele pătrate înseamnă doar că ceea ce este conținut în ele nu este neapărat prezent în operator).

Ca o expresie care vine imediat după dacă sau elif, o comandă folosită frecvent Test, care poate fi notat și prin paranteze drepte. Echipă Test evaluează o expresie și returnează 0 dacă expresia este adevărată și 1 în caz contrar. Expresia este transmisă programului Test ca argument. În loc să scrii

expresie de testare,

Puteți include expresia între paranteze drepte:

[expresie].

Te rog noteaza asta Testși [ sunt două nume ale aceluiași program, nu o conversie magică efectuată de shell bash(numai sintaxa [ cere să fie furnizată o paranteză de închidere). Rețineți, de asemenea, că în loc de Testîn proiectare dacă orice program poate fi folosit.

În concluzie, dăm un exemplu de utilizare a operatorului dacă:

if [ -e textmode2.htm ] ; apoi

ls textmode*

altfel

pwd

Despre operator Test(sau […]) trebuie să avem o conversație specială.

5.8.2 Operator Testși condiționale

Expresii condiționale utilizate în enunț Test, sunt construite pe baza verificării atributelor fișierelor, a comparațiilor de șiruri și a comparațiilor aritmetice obișnuite. Expresiile complexe sunt construite din următoarele operații unare sau binare („blocuri elementare”):

    Un fișier

Adevărat dacă există un fișier numit fișier.

    dosarul B

Adevărat dacă fişier există și este un fișier bloc de dispozitiv special.

    fișier C

Adevărat dacă fişier există și este un fișier de dispozitiv cu caractere speciale.

    Fișierul D

Adevărat dacă fişier există și este un director.

    Fișierul E

Adevărat dacă fișierul numit fişier există.

    Fișierul F

Adevărat dacă fișierul numit fişier există și este un fișier obișnuit.

    fișier G

Adevărat dacă fișierul numit fişier există și bitul său de schimbare a grupului este setat.

    Fișier H sau fișier -L

Adevărat dacă fișierul numit fişier există și este o legătură simbolică.

    fișier K

Adevărat dacă fișierul numit fişier există și bitul său „lipicios” este setat.

    Fișierul P

Adevărat dacă fișierul numit fişier există și este conductă numită(FIFO).

    Fișierul R

Adevărat dacă fișierul numit fişier există și are setat permisiunea de citire

    fișier S

Adevărat dacă fișierul numit fişier există și dimensiunea sa este mai mare decât zero.

    Tfd

Adevărat dacă descriptorul fișierului fd este deschis și indică către terminal.

    dosarul U

Adevărat dacă fișierul numit fişier există și bitul de utilizator de modificare este setat.

    fișier W

Adevărat dacă fișierul numit fişier există și are setat permisiunea de scriere.

    fișier X

Adevărat dacă fișierul numit fişier există și este executabil.

    O dosar

Adevărat dacă fișierul numit fişier există și este deținut de utilizatorul indicat de ID-ul de utilizator efectiv.

    fișier G

Adevărat dacă fișierul numit fişier există și aparține grupului identificat prin ID-ul efectiv al grupului.

    fișier S

Adevărat dacă fișierul numit fişier există și este o priză.

    N fișier

Adevărat dacă fișierul numit fişier există și s-a schimbat de la ultima citire.

    fisier1 -nt fisier2

Adevărat dacă fișierul fisier1 are un timp de modificare mai târziu decât fisierul2.

    fisier1 -ot fisier2

Adevărat dacă fișierul fisier1 mai vechi de fisierul2.

    fisier1 -ef fisier2

Adevărat dacă fișierele fisier1Și fisierul2au aceleași numere de dispozitiv și inode(inod).

    O optname

Adevărat dacă opțiunea shell este activată optname. Pentru o explicație, consultați pagina de manual bash.

    șir Z

Adevărat dacă lungimea șirului este zero.

    șir N

Adevărat dacă lungimea șirului nu este zero.

    șir1 == șir2

Adevărat dacă șirurile se potrivesc. În loc de == poate fi folosit = .

    șir1 !== șir2

Adevărat dacă șirurile nu se potrivesc.

    șir 1< string2

Adevărat dacă linia șir 1 lexicografic precede șirul sfoară 2(pentru localitatea curentă).

    șir1 > șir2

Adevărat dacă linia șir 1 lexicografic vine după linie sfoară 2(pentru localitatea curentă).

    arg1 OP arg2

Aici OP- uh apoi una dintre operațiile de comparare aritmetică: -echiv(egal), -ne(nu este egal), -lt(mai puțin decât), -le(mai puțin sau egal), -gt(Mai mult), -GE(mai mult sau egal). Numerele întregi pozitive sau negative pot fi folosite ca argumente.

Din aceste expresii condiționale elementare puteți construi oricât de complexe doriți, folosind operațiile logice obișnuite ale NEGAȚII, ȘI și SAU:

    !(expresie)

Operator boolean de negație.

    expresie1 -a expresie2

operator boolean ȘI(ȘI). Adevărat dacă ambele expresii sunt adevărate.

    expresie1 -o expresie2

operator boolean SAU(SAU). Adevărat dacă oricare dintre cele două expresii este adevărată.

Aceleași expresii condiționate sunt folosite în operatori in timp ceȘi pana cand, pe care ne vom uita mai jos.

5.8.3 Operator caz

Format operator caz este:

cuvânt cu caz în lista [[(] model [ | model ] ...) ;; ]...esac

Echipă caz mai întâi produce extinderea cuvintelor cuvânt, și încearcă să potrivească rezultatul cu fiecare dintre eșantioane model unul câte unul. După ce se găsește prima potrivire, nu se efectuează alte verificări; Valoarea returnată de operator este 0 dacă nu au fost găsite potriviri de model. În caz contrar, se returnează valoarea produsă de ultima comandă din lista corespunzătoare.

Următorul exemplu de utilizare a instrucțiunii case este preluat din scriptul de sistem /etc/rc.d/rc.sysinit.

cazul „$UTC” în

da|adevarat)

CLOCKFLAGS="$CLOCKFLAGS -u";

CLOCKDEF="$CLOCKDEF (utc)";

nu|fals)

CLOCKFLAGS="$CLOCKFLAGS --localtime";

CLOCKDEF="$CLOCKDEF (ora locală)";

esac

Dacă variabila evaluează da sau adevărat, atunci prima pereche de comenzi va fi executată, iar dacă valoarea ei este nu sau fals, va fi executată a doua pereche.

5.8.4 Operator Selectați

Operator Selectați vă permite să organizați interacțiunea interactivă cu utilizatorul. Are urmatorul format:

selectați numele [în cuvânt; ] do listă ; Terminat

Mai întâi din șablon cuvânt este generată o listă de cuvinte care se potrivesc cu modelul. Acest set de cuvinte este transmis în fluxul de erori standard, fiecare cuvânt fiind însoțit de un număr de secvență. Dacă modelul cuvânt omisi, parametrii poziționali sunt derivați în același mod. Promptul standard PS3 este apoi emis și shell-ul așteaptă ca o linie să fie introdusă la intrarea standard. Dacă șirul introdus conține un număr corespunzător unuia dintre cuvintele afișate, atunci variabila Nume i se atribuie o valoare egală cu acel cuvânt. Dacă este introdusă o linie goală, numerele și cuvintele corespunzătoare sunt afișate din nou. Dacă se introduce orice altă valoare, variabila Nume i se atribuie o valoare zero. Șirul introdus de utilizator este stocat într-o variabilă RĂSPUNS. Lista comenzilor listă executat cu valoarea variabilei selectate Nume.

Iată un mic script:

#!/bin/sh

echo "Ce sistem de operare preferi?"

selectați var în „Linux” „Gnu Hurd” „Free BSD” „Altele”; do

pauză

Terminat

echo "Ați alege $var"

Ce sistem de operare preferi?
1) Linux
2) Gnu Hurd
3) BSD gratuit
4) Altele
#?

Apăsați pe oricare dintre cele 4 numere sugerate (1,2,3,4). Dacă introduceți 1, de exemplu, veți vedea mesajul:

„Ați alege Linux”

5.8.5 Operator pentru

Operator pentru funcționează puțin diferit decât în ​​limbajele obișnuite de programare. În loc să determine valoarea unei variabile să crească sau să scadă cu una de fiecare dată când trece prin buclă, aceasta atribuie următoarea valoare dintr-o listă dată de cuvinte variabilei de fiecare dată când trece prin buclă. În general, designul arată cam așa:

pentru numele în cuvinte faceți lista făcută.

Reguli pentru construirea listelor de comenzi ( listă) sunt aceleași ca în operator dacă.

Exemplu. Următorul script creează fișierele foo_1, foo_2 și foo_3:

pentru a în 1 2 3 ; do

atinge foo_$a

Terminat

În general, declarația for are formatul:

pentru nume [în cuvânt; ] do listă ; Terminat

În primul rând, cuvântul este dezvăluit cuvântîn conformitate cu regulile de divulgare a expresiei prezentate mai sus. Apoi variabila Nume valorile rezultate sunt atribuite una câte una și de fiecare dată când se execută lista de comenzi ist. Dacă " în cuvânt" lipsește, apoi lista de comenzi listă este executat o dată pentru fiecare parametru de poziție care este specificat.

Linux are un program secv, care ia ca argumente două numere și produce o succesiune a tuturor numerelor situate între cele date. Cu această comandă puteți forța pentru V bash funcționează exact la fel cum funcționează un operator similar în limbaje de programare convenționale. Pentru a face acest lucru, trebuie doar să scrieți ciclul pentru in felul urmator:

pentru a în $(sev 1 10) ; do

fisier pisica_$a

Terminat

Această comandă afișează conținutul a 10 fișiere: " fișier_1", ..., "fișier_10".

5.8.6 Operatori in timp ceȘi pana cand

Operator in timp ce functioneaza ca dacă, executând doar operatori din listă lista2 bucla continuă atâta timp cât condiția este adevărată și se anulează dacă condiția nu este adevărată. Designul arată astfel:

în timp ce list1 face list2 terminat.

în timp ce [-d directorul meu]; do

ls -l directorul meu >> fișier jurnal

echo -- SEPARATOR -- >> fișier jurnal

dormi 60

Terminat

Un astfel de program va înregistra conținutul directorului „mydirectory” în fiecare minut atâta timp cât directorul există.

Operator pana cand similar cu operatorul in timp ce:

până când list1 face list2 terminat.

Diferența este că rezultatul returnat la executarea unei liste de instrucțiuni lista1, luat cu negație: lista2 executat dacă ultima comandă din listă lista1 returnează o stare de ieșire diferită de zero.

5.8.7 Funcții

Sintaxă

Coajă bash permite utilizatorului să-și creeze propriile funcții. Funcțiile se comportă și sunt folosite exact ca comenzile shell obișnuite, ceea ce înseamnă că putem crea noi comenzi noi înșine. Funcțiile sunt construite după cum urmează:

numele funcției() (listă)

Și cuvântul funcţie nu este necesar, Nume definește numele funcției prin care poate fi accesată, iar corpul funcției este format dintr-o listă de comenzi listă, situat între ( și ). Această listă de comenzi este executată de fiecare dată când numele Nume specificat ca numele comenzii de invocat. Rețineți că funcțiile pot fi definite recursiv, deci este permis să apelăm funcția pe care o definim în sine.

Funcțiile sunt executate în contextul shell-ului curent: nu este pornit un nou proces pentru a interpreta funcția (spre deosebire de executarea scripturilor shell).

Argumente

Când o funcție este apelată pentru execuție, argumentele funcției devin parametrii poziționali(parametri de pozitie) pe durata funcției. Ele sunt denumite $n, Unde n— numărul argumentului pe care vrem să-l accesăm. Numerotarea argumentelor începe de la 1, deci $1 - acesta este primul argument. De asemenea, putem obține toate argumentele simultan cu $* , și numărul de argumente care folosesc $# . Parametru de poziție 0 nu se schimba.

Dacă apare o comandă încorporată în corpul funcției întoarcere, execuția funcției este întreruptă și controlul este transferat la comandă după apelul funcției. Când funcția se termină, parametrii de poziție și parametrul special # sunt returnate valorile pe care le aveau înainte de începerea funcției.

Variabile locale (locale)

Dacă dorim să creăm un parametru local, putem folosi cuvântul cheie local. Sintaxa pentru specificarea acestuia este exact aceeași ca pentru parametrii obișnuiți, doar definiția este precedată de un cuvânt cheie local: local nume=valoare.

Iată un exemplu de specificare a unei funcții care implementează comanda menționată mai sus secv:

seq()

local I=$1;

în timp ce [ $2 != $I ]; do

echo -n "$I";

I=$(($I + 1))

Terminat;

ecou $2

Vă rugăm să rețineți opțiunea -n operator ecou, anulează linia nouă. Deși acest lucru nu este esențial pentru scopurile pe care le avem în vedere aici, poate fi util pentru utilizarea funcției în alte scopuri.

Funcția de calcul factorial fapt

Inca un exemplu:

fapt()

dacă [ $1 = 0 ]; apoi

ecou 1;

altfel

echo $(($1 * $(fapt $(($1 - 1)))))

Aceasta este funcția factorială, un exemplu de funcție recursivă. Observați extinderea aritmetică și înlocuirea comenzilor.

V. Kostromin (kos la rus-linux dot net) - 5.8. Shell ca limbaj de programare

    Sistemele de operare din familia Linux, precum și orice alte sisteme de operare, necesită prezența unei interfețe de interacțiune între componentele sistemului informatic și utilizatorul final, adică prezența unui nivel de software care oferă introducerea comenzilor și parametrii pentru a obține rezultatele dorite. Acest nivel de program este numit "coajă" sau, în engleză - coajă.

Ce este o coajă?

Shell de comandă ( coajă) oferă interacțiune între utilizator și mediul sistemului de operare Linux. Este un produs software specializat care asigură executarea comenzilor și obținerea rezultatelor execuției acestora sau, ca să spunem foarte simplu, un shell este un program care este conceput pentru a asigura execuția altor programe la cererea utilizatorului. Un exemplu de shell ar putea fi, de exemplu, un interpret de comandă comandă.com sistem de operare MS DOS sau shell bash sisteme de operare Unix/Linux.

Toate shell-urile au funcții și proprietăți similare, în conformitate cu scopul lor principal - de a executa comenzile utilizatorului și de a afișa rezultatele execuției lor:

Interpretarea liniei de comandă.

Accesul la comenzi și rezultatele executării acestora.

Suport pentru variabile, caractere speciale și cuvinte rezervate.

Prelucrarea fișierelor, operațiuni standard de intrare și ieșire.

Implementarea unui limbaj de programare shell special.

    Pentru sistemele de operare din familia Unix / Linux, este posibil să se utilizeze mai multe shell-uri diferite care diferă în proprietăți și metode de interacțiune cu sistemul. Cele mai comune cochilii sunt

SH- coajă Bourne, shell clasic pentru sistemul de operare Unix

bash coajă Bourne din nou(GNU Bourne-Again SHell). Poate cel mai comun shell în acest moment în mediul de operare Linux.

ksh- coajă Korn, conceput ca o dezvoltare a cochiliei Bourne cu istoricul liniei de comandă și posibilitatea de a edita comenzi.

csh- coajă C, folosind sintaxa unui limbaj de programare popular C

tcsh- versiune shell C cu editare interactivă în linie de comandă.

Pe sistem pot fi instalate mai multe shell-uri diferite și fiecare utilizator își poate folosi propriul shell implicit. Toate acestea, desigur, se fac automat în timpul procesului de descărcare și înregistrare a utilizatorului.

    În timpul procesului de încărcare a sistemelor de operare din familia Linux, după încărcarea nucleului de sistem, sistemul trece în modul interactiv - modul de interacțiune dintre utilizator și sistemul de operare. Pe Linux, primul proces lansat în timpul pornirii este programul init. init, care citește conținutul fișierului de configurare /etc/inittab, determină lista și caracteristicile terminalelor disponibile în sistem și apelează programul interactiv de conectare getty, care vă solicită să introduceți numele de utilizator. După introducerea numelui de utilizator și a parolei, programul getty apelează programul log in, care verifică validitatea contului, navighează la directorul principal al utilizatorului și transmite controlul programului de pornire inițial al sesiunii, care este de obicei programul shell al utilizatorului, a cărui aromă specifică este determinată de conținutul fișierului /etc/passwd pentru acest cont. De exemplu:

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

După cum se poate vedea din conținutul fișierului /etc/passwd, pentru utilizator utilizator1 va fi lansat shell-ul SH(Bourne shell), pentru utilizator interbază- coajă csh(C shell) și pentru utilizator apb- coajă bash(Bourne din nou) După ce pornește shell-ul, pe ecran este afișat un prompt de comandă (de obicei sub forma unui semn dolar $ dacă munca este efectuată în contextul unui cont de utilizator obișnuit, sau pound # , dacă shell-ul este utilizat sub un cont de utilizator root ( rădăcină).

La ieșirea din shell, nucleul sistemului returnează controlul programului init, care repornește procesul de conectare și afișează un prompt de nume de utilizator pe terminal. Ieșirea din shell se poate face în unul din două moduri:

Prin echipa Ieșire efectuate de utilizator

Când un proces shell primește un semnal ucide, trimis de kernel, de exemplu când sistemul este repornit.

Interpretarea liniei de comandă.

    Introducerea utilizatorului ca răspuns la un prompt shell este de obicei apelată Linie de comanda sau echipă. O comandă Linux este un șir de caractere al numelui și argumentelor comenzii, separate prin spații. Argumentele furnizează comenzii parametri suplimentari care determină comportamentul acesteia. Cel mai adesea folosit ca argumente OpțiuniȘi nume fișiere și directoare. De exemplu, linia de comandă

ls -l fișier01 fișier02

Conține comanda ls, opțiunea -l și două nume de fișier file01 file02.

Când utilizați mai multe opțiuni, acestea pot fi combinate. De exemplu, următoarele opțiuni de comandă sunt identice:

Ls -l -d
ls -ld

Comenzile care fac parte din shell sunt apelate incorporat. Astfel de comenzi includ, de exemplu, cd, if, case etc. Desigur, comenzile încorporate pot diferi pentru diferite opțiuni de shell. În plus față de comenzile încorporate, este posibil să utilizați module de program, care sunt fișiere executabile separate sau fișiere scenarii sau scenarii- fișiere text obișnuite care conțin linii executate secvenţial cu comenzi shell. Unele scripturi (scripturi) pot fi executate de procese Linux, cum ar fi planificatorul de sarcini cron. Programatorul de sarcini este de obicei proiectat pentru a efectua automat sarcini de administrare a sistemului conform unui program. Sarcini cron sunt comenzi sau scripturi și sunt executate automat, fără nicio intervenție umană și pot fi executate în contextul diferitelor conturi de utilizator. În cazul în care sarcina de planificare implică executarea unui script, apare problema alegerii unui shell care ar trebui să fie lansat ca proces copil cron pentru a procesa comenzi dintr-un fișier script - la urma urmei, shell-ul poate fi oricare, iar sintaxa unui script, de regulă, necesită utilizarea shell-ului specific pentru care este scris. Pentru a elimina această problemă, în sistemele de operare Linux se obișnuiește să se indice în prima linie a scriptului tipul de shell necesar pentru execuția acestuia, sub forma:

#!/bin/bash- pentru coajă bash

#!/bin/sh- pentru coajă SH

Semn # este un semn al unui comentariu și caracterele care îl urmează nu sunt interpretate ca o comandă. Această tehnică vă permite să specificați în mod explicit care shell ar trebui utilizat pentru a procesa conținutul următor al fișierului. Dacă scriptul nu conține o intrare care definește în mod explicit shell-ul necesar, atunci se vor folosi setările din contul în contextul căruia este executat scriptul. În acest caz, este posibil ca un script scris pentru shell, de exemplu, tch va fi trecut la shell pentru execuție bash, ceea ce va face imposibil de executat.

Când executați comenzi sau scripturi, utilizați variabile de mediu(în limba engleză - mediu inconjurator, ale căror valori caracterizează mediul software în care sunt executate comenzile. Astfel de variabile pot conține setări generale de sistem, parametri grafici sau de shell de comandă, căi ale fișierelor executabile etc. Valorile variabilelor de mediu sunt setate la nivel de sistem (pentru toți utilizatorii) și la nivel de utilizator specific. Pentru a seta variabilele de mediu la nivel de sistem, se utilizează conținutul fișierelor:

/etc/profile- setează variabile numai pentru shell-urile de comandă. Poate rula orice scripturi în shell-uri compatibile cu shell-ul Bourne.

/etc/bash.bashrc- setează variabile numai pentru shell-uri interactive. De asemenea, rulează scripturi bash.

/etc/environment- utilizat de modulul PAM-env. În acest fișier pot fi specificate doar perechi nume=valoare.

Fiecare dintre aceste fișiere are propria sa aplicație, așa că ar trebui să o alegeți cu atenție pe cea care se potrivește scopurilor dvs. De exemplu, dacă trebuie să adăugați un director personalizat ~/binîntr-o variabilă CALE pentru toți utilizatorii, plasați următorul cod într-unul dintre fișierele de inițializare a mediului de sistem (/etc/profile sau /etc/bash.bashrc):

# Dacă ID-ul utilizatorului este mai mare sau egal cu 1000 și există un director ~/bin și acesta

#nu a fost adăugat anterior la variabila PATH,

# exportați ~/bin în $PATH.

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

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

De obicei, pe sistemele de operare Linux, un ID de utilizator mai mic de 1000 sau mai mic de 500 este utilizat pentru conturile de serviciu. În acest exemplu, variabila de mediu va fi setată pentru toți utilizatorii locali din sistem cu un ID de 1000 sau mai mare.

Dacă trebuie să schimbați mediul pentru un anumit utilizator, modificați conținutul mediului utilizatorului:

- ~/.bash_profile, ~/.bash_loginși așa mai departe. - fișiere de inițializare shell din directorul principal al utilizatorului.

- ~/.profil- fișier de inițializare a profilului utilizatorului. Folosit de multe shell-uri pentru a defini variabilele de mediu.

~/.pam_environment- un analog personalizat al fișierului /etc/environment, care este utilizat de modulul PAM-env.

De exemplu, pentru a adăuga directorul utilizator ~/bin la calea de căutare a fișierelor executabile specificate de variabilă CALE, de exemplu, la un fișier ~/.profil pune linia:

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

Pentru a seta variabilele de mediu pentru aplicațiile grafice, se utilizează conținutul fișierelor de setări ale mediului grafic al utilizatorului. ~/.xinitrc

Mai des, valorile variabilelor de mediu sunt setate pentru sesiunea curentă a utilizatorului. De exemplu, pentru a adăuga un director personalizat ~/binîn calea de căutare pentru fișiere executabile:

export PATH=~/bin:$PATH

Noua valoare a variabilei CALE va dura doar până la încheierea sesiunii curente de utilizator.

Pentru a vizualiza valoarea unei variabile, puteți utiliza comanda echo $variabilă, De exemplu:

echo $PATH

În prezent, cel mai comun shell, așa cum am menționat mai sus, este bash. Acest lucru este cauzat în primul rând de faptul că coaja bash este SH- un shell de comandă compatibil, care adaugă funcții utile din shell-ul Korn ( ksh) și C shell ( csh). Coajă bash poate rula majoritatea scripturilor scrise într-un limbaj de programare shell fără nicio modificare SHși încearcă să se apropie cât mai mult de standard POSIX, ceea ce a dus la multe îmbunătățiri, atât pentru programare, cât și pentru utilizare interactivă. În implementarea modernă bash există un mod de editare a liniei de comandă, dimensiune nelimitată a istoricului comenzilor, instrumente de gestionare a sarcinilor, posibilitatea de a utiliza aliasuri, o listă extinsă de comenzi încorporate, funcții shell de comandă etc. În general, bash se potrivește cel mai bine nevoilor utilizatorului obișnuit, ceea ce l-a făcut cel mai utilizat în mediul Linux.

La inceput bash fără parametrii de linie de comandă, shell-ul pornește în modul interactiv, afișând un prompt de comandă pe ecran. Un shell interactiv citește de obicei date de la terminalul utilizatorului și scrie date pe același terminal, dispozitivul de intrare standard fiind tastatura și dispozitivul de ieșire standard fiind afișajul. Utilizatorul introduce comenzi pe tastatură, iar rezultatul executării acestora este afișat pe afișaj.

  • Serghei Savenkov

    un fel de recenzie „scurtă”... de parcă s-ar grăbi undeva