Despre diferite shell-uri Linux și Unix. Limbajul de comandă Shell

După cum am 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, datorită căruia se transformă în limbaj puternic programare.

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 bretele: (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ă din secvența care se execută.

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 permisiunea de citire setată

    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 fisierul2avea numere identice dispozitive și inoduri(inod).

    O optname

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

    ș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 la eroare standard, fiecare cuvânt urmat de număr de serie. 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ă crească sau să scadă valoarea unei variabile 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 pentru declarație 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 o listă de comenzi este executată de fiecare dată 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 bucle până când 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ă:

nume functie() (lista)

Ș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 script-urilor 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 încheie execuția, parametrii de poziție și parametrul special # sunt returnate valorile pe care le aveau înainte de începerea funcției.

Variabile locale (locale)

Dacă vrem să creăm un parametru local, putem folosi cuvânt 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;

eco $2

Vă rugăm să rețineți opțiunea -n operator ecou, anulează trecerea la linie 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

ÎN aceasta sectiune a fost furnizată documentație pentru a ajuta programatorul în limbaje shell de comandă shell (sh, bash, ksh și altele)

Interpret de comandă c-coaja

0. Introducere

Interpretul de comenzi în mediul UNIX îndeplinește două funcții principale:

reprezintă o interfață interactivă cu utilizatorul, adică emite un prompt și procesează comenzile introduse de utilizator;
procesează și execută fișiere text care conțin comenzi de interpret (fișiere batch);

În acest din urmă caz, sistemul de operare permite ca fișierele batch să fie tratate ca un tip de fișier executabil. În consecință, există două moduri de operare ale interpretului: interactiv și comandă.

UNIX (spre deosebire de, să zicem, DOS) are mai multe interprete de comandă diferite. Să enumerăm cele mai populare:

/bin/sh - Shell Bourne. Din punct de vedere istoric, este primul shell de comandă dezvoltat pentru prima versiune a sistemului de operare UNIX. Acest shell este în prezent shell-ul principal în versiunile UNIX System V.
/bin/csh - C-shell. Un shell a cărui sintaxă a limbajului de comandă este apropiată de limbajul C. Este shell-ul principal pentru versiunea Berkeley a sistemului de operare UNIX.
/bin/ksh - k-shell.
/bin/rsh - Shell restricționat. Este sh cu capabilități limitate (în primul rând pentru a proteja sistemul de operare de acțiunile neautorizate ale utilizatorului).

Sistemul de operare ConvexOS este o aromă de 4.3 BSD UNIX()BSD - Berkeley Series Distribution și, prin urmare, shell-ul de bază este csh.

1. Caracteristici principale

Lucrul cu linia de comandă

Interpretul percepe șirul tastat de utilizator ca o comandă (sau mai multe comenzi). Sintaxa shell vă permite să tastați

mai multe comenzi pe o linie, separate prin punct și virgulă. De exemplu

este echivalent cu două comenzi introduse secvenţial:

Dimpotrivă, dacă dorește, utilizatorul poate

continuați să tastați comanda lungă pe linia următoare, terminând linia curentă cu \\. Până când comanda este finalizată, veți primi un ``prompt secundar'' > în loc de primar (%). De exemplu,

% tar tv Makefile star.o star.c star.dat main.o main.c

echivalent

%tar tv Makefile star.o\

> star.c star.dat \

Fluxurile I/O sunt controlate într-un mod similar cu DOS (Mai precis, sistemul de operare DOS a adoptat sintaxa de redirecționare a firelor de execuție din UNIX) folosind simbolurile > , > > ,

Util caz special folosind mecanismul de redirecționare a firelor - redirecționarea către /dev/null, care vă permite să scăpați de mesaje inutile la ecran. Folosind același mecanism, puteți crea fișiere goale:

va crea un fișier gol myfile în directorul curent.

În plus, C-shell vă permite să grupați comenzi folosind paranteze. În acest caz, întregul construct din paranteze este considerat de către interpret ca o singură comandă. Acest lucru este util, de exemplu, în astfel de construcții:

% (comandă1 | comandă2)

Dacă omiteți parantezele, shell-ul nu va putea determina ce comandă doriți să introduceți fișierul myfile.

Următoarele „conveniențe” există în această implementare C-shell:

Puteți evita să tastați o comandă lungă până la sfârșit, dar încercați să apăsați tasta Tab după ce ați tastat parțial comanda (sau numele fișierului). C-shell va încerca să completeze el însuși caracterele lipsă sau va răspunde cu un scârțâit dacă alegerea este ambiguă.
Dacă ați tastat o comandă, dar ați uitat opțiunile acesteia, introduceți secvența H. C-shell vă va oferi un scurt ajutor. De exemplu,

Când introduceți numele complet al fișierului, utilizați combinația de taste ^D. Veți putea obține o listă a directorului pe care îl introduceți în formatul comenzii lf.
Buffer de comandăîși amintește ultimele 20 de comenzi. În loc să tastați o comandă, o puteți apela din buffer folosind tastatura cu săgeți (desigur, numai dacă această comandă este în buffer).

Analiza liniei de comandă

Interpretul, după ce a primit linia de comandă, efectuează o serie de transformări pe aceasta, și anume:

Extinde aliasurile
Extinde metacaracterele (*, ?, [, ], ~, (, ))
Înlocuiește variabilele shell
Execută comanda dacă este o comandă de interpret încorporată sau pornește un proces dacă comanda este externă.

Să ne uităm la acești pași pas cu pas.

Alias. Comanda de alias încorporată vă permite să definiți aliasuri de comandă. Exemplu:

% alias mycat „pisica | mai mult”

definește mycat ca un alias pentru șirul cat | Mai mult. Prin urmare, mai departe aveți dreptul de a utiliza comanda mycat, care va fi extinsă de interpret oriunde o utilizați. Acesta este un mod de a defini nume scurte pentru comenzile compuse lungi.

Comanda integrată unalias mycat distruge alias-ul introdus anterior mycat.

Metacaracterele. Metacaracterele vă permit să scurtați liste întregi de cuvinte (în principal nume de fișiere). Shell tratează un cuvânt care conține metacaractere ca un șablon pentru compilarea unei liste de nume de fișiere:

* în șablon înlocuiește orice succesiune de caractere. De exemplu, m* se va extinde la o listă cu toate fișierele care încep cu litera m. Există o mică excepție de la această regulă: pur și simplu * omite din listă acele fișiere ale căror nume încep cu un punct.
? înlocuiește un caracter. De exemplu m? se va extinde la o listă a tuturor numelor de fișiere care încep cu litera m și constă exact din două litere.
[.-.] vă permite să specificați intervalul pentru caracterul înlocuit. De exemplu, m va fi extins în ma mb mc me.
(...,...) vă permite să enumerați cuvinte pentru înlocuire. Deci, de exemplu, m(roșu, albastru, verde) va fi extins în mred mblue mggreen.

În cele din urmă, tilde vă permite să specificați directorul principal al utilizatorului:

~name/ este echivalent cu specificarea căii complete către directorul principal al numelui de utilizator (Spune /usr1/name/)
~/ este echivalent cu specificarea căii complete către propriul director principal.

Variabile Shell. Cuvintele care încep cu simbolul $ sunt interpretate de interpretul de comenzi ca nume de variabile. Variabilele sunt împărțite în variabile de mediu (vor fi cunoscute de toate programele numite din acest shell și sunt în acest sens globale) și variabile simple.

Comanda încorporată set name=value vă permite să definiți o variabilă simplă numită nume și să îi dați valoarea valorii. Întâlnindu-se în Linie de comanda expresia $name interpretul o va înlocui cu value. De exemplu,

%set culoare=albastru

va afișa linia albastră pe terminal. A

%set culoare=albastru

% echo new$culoare

va da newblue. În cele din urmă, prin intrare

%set culoare=albastru

% echo $(culoare)nou

primim o culoare nouă. Ultimul exemplu demonstrează cum să folosiți acolade pentru a separa un nume de variabilă de un cuvânt (pentru a economisi $colornew, interpretul va răspunde că variabila colornew nu este definită.

Comanda unset distruge variabilele definite anterior.

Pentru a defini o variabilă egal cu sfoară din mai multe cuvinte, includeți-l între ghilimele simple. Exemplu

% set color="albastru sau roșu sau verde"

Variabilele simple pot fi matrice de cuvinte (care trebuie diferențiate de cazul tocmai discutat, când variabila conține un șir de mai multe cuvinte. Pentru a declara o matrice, trebuie să folosiți paranteze:

% culori setate=(albastru roșu verde)

Acum echo $culori va produce un șir de trei culori (încercați!). Cu toate acestea, puteți lucra și pe elemente de matrice individuale (elementele sunt numerotate începând de la zero), astfel:

(ne facem verde). Numărul de elemente din matrice este conținut în variabila $#colors.

va da numărul 3 terminalului.

Sunt posibile combinații destul de complexe folosind șabloane, de exemplu:

% fișiere setate=(m*)

va returna numărul de fișiere din directorul curent începând cu litera m.

Variabilele de mediu sunt numite în același mod ca și variabilele simple. Diferența constă în modul în care sunt definite:

Comanda % setenv name value setează o variabilă de mediu numită nume. Rețineți diferența enervantă în sintaxă: atunci când definiți o variabilă de mediu, nu trebuie să utilizați semnul =.

O listă cu toate variabilele de mediu poate fi obținută folosind comanda încorporată printenv.

Puteți să nedefiniți o variabilă de mediu folosind unsetenv.

În cele din urmă, pentru a defini o matrice de variabile de mediu, NU folosiți paranteze, ci folosiți două puncte ca delimitatori de elemente de matrice:

% setenv MANPATH /usr/man/:/usr/local/man:/usr/man/X11:~/man

Comenzi și variabile încorporate

Lista celor mai importante comenzi C-shell încorporate cu scurte explicații:

alias definește un alias

bg transferă sarcina în modul de execuție în fundal

comanda chdir path pentru a merge la directorul de cale.

echo își imprimă toate argumentele la ieșirea standard

exec filename începe procesul de la fișier filename în loc de shell-ul curent (adică deasupra acestuia). Revenirea la shell nu este posibilă.

ieșirea termină coaja.

fg face un proces de fundal sincron.

nume de fișier fișier oferă informații despre ce crede sistemul de operare despre acest fișier.

goto label sare necondiționat la linia din fișierul de comandă marcată cu label. Nu este folosit în modul interactiv.

kill pid trimite un semnal de anulare procesului pid, ceea ce duce de obicei la oprirea procesului.

nume de fișier sursă citește și execută comenzi din nume de fișier.

set, setenv setarea variabilelor interne și de mediu.

shift var mută elementele matricei var spre stânga. În acest caz, dimensiunea matricei este redusă cu unul, iar elementul zero al matricei se pierde. Variabila var trebuie să fie o matrice.

time command execută comanda de comandă și afișează timpul necesar executării pe terminal.

unset distruge variabila shell.

unalias distruge un alias de comandă definit anterior.

@name=expr stochează rezultatul expresiei aritmetice expr în variabila nume.

Lista celor mai importante variabile încorporate C-shell cu scurte explicații:

argv matrice de parametri ai liniei de comandă (utilizate în modul de comandă)

cdpath este directorul în care merge shell-ul când i se dă comanda chdir fără un argument.

dimensiunea bufferului istoric pentru stocarea comenzilor.

directorul principal al utilizatorului de acasă

locația de e-mail în Sistemul de fișiere cutie poștală utilizator.

cale cale pentru a căuta comenzi externe.

promptul este promptul principal al shell-ului.

prompt1 prompt secundar.

coajă drum complet fișier executabil shell curent (/bin/csh)

Instrucțiuni de control și instrucțiuni de buclă

Din lista de comenzi shell încorporate, am exclus în mod deliberat declarații condiționaleși instrucțiuni bucle, care vor fi acoperite aici.

Execuție condiționată

Sintaxa instrucțiunii condițional if din C-shell este:

if (expr) comanda

expr poate fi fie o expresie aritmetică, fie o verificare a atributelor fișierului. Exemplu:

dacă (-f /etc/hosts) cat /etc/hosts

Să luăm în considerare ultimul caz mai detaliat. Posibil urmatoarele verificari atribute fisierului:

R este lizibil

W este disponibil pentru înregistrare

X este disponibil pentru execuție

E verificarea existenței fișierului

O verificați dacă sunteți proprietarul a acestui dosar

Fișierul Z are dimensiune zero

Fișierul F este un fișier obișnuit

Fișierul P este o conductă numită

Fișierul D este un director

buclă while

Bucla rulează atâta timp cât condiția este adevărată. Exemplu:

în timp ce ($#fișiere > 0)

bucla foreach

Acest lucru este extrem de operator util, care vă permite să organizați o buclă prin elementele unei matrice de cuvinte

foreach varname (listă)

Corpul buclei este executat de câte ori există elemente în tabloul listă. În acest caz, variabila varname conține următoarea valoare a elementului matrice. Exemplu

pentru fiecare culoare (albastru roșu verde)

echo Culoarea este $culoare

pentru fiecare fișier (*.for)

echo Redenumirea $fișier

mv $fișier `nume de bază $fișier .pentru`.f

Folosit aici comanda standard de bază, care „taie”” sufixul dat de al doilea argument din cuvântul dat în primul argument și imprimă cuvântul rezultat la ieșirea standard. Utilizarea ghilimelelor în limbajul C-shell va fi discutată puțin mai târziu.

Operator condițional multivariat

Sintaxa unei instrucțiuni de comutare condiționată în C-shell este:

case pattern1: ... breaksw case (\it pattern2):

Operatorul permite transferul controlului în funcție de dacă șirul satisface orice model din modelul setat 1, pattern2, ... (caz în care controlul este transferat la blocul delimitat de cazul ... breaksw) sau nu (caz în care controlul este transferat la ramura implicită:... endsw În general, instrucțiunea switch este foarte asemănătoare cu un operator similar în limbajul C. Astfel de constructe sunt adesea folosite în fișierele batch pentru a analiza răspunsul utilizatorului la o anumită întrebare ().

2. Rularea shell-ului în modul de comandă

S-a remarcat deja că csh poate fi lansat în modul de comandă. Mai mult, instrucțiunile condiționate și instrucțiunile buclei sunt cel mai des folosite în fișierele batch. Aici ne vom uita la caracteristicile unui astfel de lucru în „echipă”.

Identificarea interpretului

Cel mai simplu mod de a lansa shell-ul în modul de execuție al unui anumit fișier mycommand este să dai acestui fișier atributul executabil cu comanda chmod:

% chmod +x comanda mea

Acum trebuie doar să introduceți comanda mycommand de la tastatură și sistemul de operare va lansa automat shell-ul în modul de comandă pentru a executa acest fișier. Există o capcană în această cale: există mulți interpretori de comenzi în sistem și sintaxa lor de comandă este diferită. Cum va determina sistemul de operare de care aveți nevoie? Raspunsul este nu. Trebuie să spuneți în mod explicit sistemului de operare ce interpret doriți să rulați pentru a executa acest fișier batch. Pentru a face acest lucru, prima linie a fișierului dvs. ar trebui să aibă următoarea formă standard:

ceea ce va permite sistemului de operare să facă ceea ce trebuie. Dacă nu specificați aceste informații, sistemul de operare va presupune (din motive istorice) că fișierul este scris în limbajul Bourne shell și, cel mai probabil, veți primi multe mesaje de eroare de sintaxă.

Să remarcăm încă o proprietate utilă a shell-ului care lucrează în modul de comandă: toate liniile care încep cu semnul # vor fi ignorate. Acest lucru vă permite să adăugați comentarii la textul fișierului de comandă.

Următorul fapt vă permite să lucrați cu linia de comandă folosind csh: atunci când rulați fișierul de comandă, mycommand, este definită automat o variabilă internă numită argv, reprezentând o serie de parametri ai liniei de comandă. De exemplu, următorul fișier batch imprimă pur și simplu toate argumentele sale și numărul lor pe terminal:

# Acest fișier pur și simplu scoate argumentele sale

# și numărul total de argumente

echo Argumente: $argv

echo Numărul de argumente: $#argv

Lansare explicită

Puteți folosi o modalitate mai directă, dar mai puțin convenabilă de a rula un fișier batch - apelând shell-ul cu comutatorul -c nume de fișier. Exemplu:

% /bin/csh -c comanda mea arg1 arg2 arg3...

unde cheia trebuie imediat urmată de numele fișierului care urmează să fie lansat. Argumentele necesare sunt enumerate după. Rețineți că, cu această metodă de lansare, este posibil ca fișierul să nu aibă un atribut executabil.

Citate

Citatele joacă un rol important în sintaxa shell. Există trei tipuri de citate: simple ("), duble ("") și backticks (`).

Ghilimelele simple sunt folosite pentru a evidenția textul pe care shell-ul ar trebui să îl interpreteze literal. Cu alte cuvinte, textul din ghilimele simple nu este supus extinderii și interpretării. Exemplu:

ecou „Dolarul este $bun”

literalmente obținem Dollarul este $bun, chiar dacă semnul dolarului este un metacaracter coajă.

Ghilimele duble delimitează un șir de caractere pe care shell-ul va trata ca un singur cuvânt. Exemplu:

set colors="verde albastru roșu"; ecou $#culori

va returna numărul 1, ceea ce înseamnă că variabila culori este o variabilă simplă și nu o matrice. Tot ce este înăuntru ghilimele duble supuse interpretării de către cochilie.

Gitatele inverse vă permit să reprezentați un șir care constă din rezultatul unei comenzi. Deci expresia din backticks este tratată ca o comandă pe care o execută shell-ul și ceea ce această comandă imprimă la ieșirea standard este înlocuită ca un șir în locul în care apar acele backticks. Exemplu:

va pune în variabila mytty șirul pe care îl produce comanda tty (și anume numele și numărul terminalului curent).

Adnotare: Conceptul de shell de comandă. Prezentare generală a shell-urilor de comandă. Shell de comandă Bash. Caracteristici de operare (istoric comenzi, operator „!”, acțiuni prin apăsarea unei taste ). Multitasking în consolă. Sarcini. Managementul locurilor de muncă. Variabilele de mediu ale comandantului de la miezul nopții

Progresul lecției

1. În lumea Linux și Unix, lucrul pe computer este indisolubil legat de concept shell de comandă– un program care permite utilizatorului să interacționeze cu sistemul prin introducerea și executarea comenzilor. Cu toate acestea, shell de comandă este program regulat. Puteți dovedi acest lucru setând shell-ul implicit în fișier passwd alt program pentru utilizator. Dar pentru ca sistemul să-l cunoască ca shell, trebuie să adăugați numele absolut de fișier la /etc/shells.

Linux vine cu mai multe shell-uri de comandă, compoziția lor poate varia în funcție de distribuție, dar puteți găsi întotdeauna:

Bourne Shell (sh) - cea mai veche și cea mai comună shell de comandă pentru sistemele Unix. Nu există un singur sistem Unix în care să nu fie folosit.

Bourne Again Shell (bash) – un Bourne Shell extins. Are o mulțime de avantaje plăcute, motiv pentru care a devenit atât de popular în ultima perioadă. Este shell-ul implicit pentru aproape toate distribuțiile Linux.

De asemenea, scoici populare sunt:

csh– shell, al cărui sistem de comandă este apropiat de limbajul de programare C

tcsh este un shell al cărui sistem de comandă este apropiat de limbajul de programare Tcl.

zsh este un shell care are probabil cele mai largi capabilități. Este o extensie a lui sh (bourne shell).

Deoarece Linux folosește bash în mod implicit, vom vorbi despre asta.

2. Shell de comandă bash a fost inițial o versiune distribuită gratuit a Bourne Shell. Ulterior, când capacitățile sale au crescut, a început să fie considerat un produs independent. Principalele caracteristici ale bash sunt următoarele:

Tabelul 1.1.
Oportunitate Un comentariu
1 Editarea unei linii Posibilitatea de a edita comanda introdusă în loc să o rescrieți din nou
2 Organizarea canalelor Oportunitate Redirecționare I/O, organizând canale între sarcinile efectuate
3 Ușurință în utilizare Utilizarea alias-urilor de comandă, istoricul comenzilor, completarea automată
4 Managementul locurilor de muncă Abilitatea de a crea și gestiona joburi de fundal
5 Flexibilitate de personalizare Folosind fișiere de script de conectare per utilizator, variabile de mediu

Ne vom uita la redirecționarea I/O și la conductele mai târziu în Lecția 8. Prin urmare, vom omite acest punct. Dar să vorbim mai detaliat despre caracteristicile lucrului în bash și despre avantajele pe care le oferă.

Bash scrie automat toate comenzile tastate de utilizator într-un fișier ~/.bash_history. Pentru a gestiona acest fișier, utilizați comanda history. istoria este comandă încorporată bash. Adică, nu există niciun fișier executabil care să corespundă acestei comenzi. Se shell de comandă efectuează toate acțiunile. Introdus fără parametri, pur și simplu listează toate comenzile stocate în acest fișier și este identic cu comanda cat ~/.bash_history.

Istoricul comenzilor există pentru a simplifica setul de comenzi utilizate în mod obișnuit. Istoricul comenzilor poate fi sortat prin listă folosind tastele <вверх>Și<вниз> .

O altă modalitate este să tastați! și porniți comanda și apăsați . Va fi executată ultima comandă din istoric, ale cărei prime litere se potrivesc cu cele tastate. De exemplu:

$ !/usr /usr/bin/perl ./ptest.pl OK $ !xfonts bash: !xfonts: evenimentul nu a fost găsit $

Dar cum putem accelera introducerea dacă istoricul nu conține încă comanda de care avem nevoie? În acest caz, cheia ne va ajuta . După ce ați tastat primele litere ale comenzii (sau ale căii fișierului), apăsați Și Bash va finaliza automat comanda (sau elementul cale). Dacă mai multe fișiere sunt potrivite sau niciun fișier nu este potrivit, sistemul va da un semnal sonor. Dacă butonul apăsați din nou, apoi când apar mai multe fișiere, sistemul va afișa o listă, iar când nu există, va repeta semnalul sonor

3. De la prima lecție, ar fi trebuit să vă amintiți că Linux este un mediu multitasking. Cu toate acestea, până acum nu ați reușit încă să profitați de multitasking-ul său. La prima vedere, se pare că consola nu vă permite să utilizați capacitățile multitasking ale sistemului și numai în mediu grafic puteți rula două sau mai multe programe în același timp. Dar asta nu este adevărat! Consola este, de asemenea, multitasking.

În primul rând, puteți deschide mai multe console deschizând un program în fiecare dintre ele. Comutarea între console se va face folosind tastele Ctrl+ , Unde X– numărul consolei.

Și chiar și într-o singură consolă, folosind comenzile de gestionare a sarcinilor, puteți profita din plin de sistemul multitasking.

– o combinație de taste care trimite procesului un semnal neinterceptabil sigstop. Vă permite să opriți execuția unui proces pentru a transfera controlul către linia de comandă.

comanda & – simbolul & după comandă vă permite să o rulați în fundal.

joburi – afișează o listă de joburi shell curente.

bg<#j>– pune jobul #j în fundal. Înainte de aceasta, sarcina trebuie oprită folosind combinația de taste . Dacă în acest moment interpretul are o singură sarcină, atunci nu trebuie specificat numărul.

fg<#j>– pune jobul #j în modul de execuție în prim plan. Lucrarea trebuie oprită printr-o combinație de taste sau fii pe fundal. Dacă în acest moment interpretul are o singură sarcină, atunci nu trebuie specificat numărul.

$ man bash ^Z + Stopped man bash $ vim ^Z vim + Stopped vim $ bg 1 + man bash & $ jobs + Stoped man bash + Stopped vim $ fg 2 + vim $ fg + man bash $

4. variabile de mediu– informații de sistem care indică preferințele dvs., cum ar fi editor de text implicit, căile de căutare pentru fișiere executabile etc., precum și acreditările de utilizator, sistem și shell, cum ar fi Nume de utilizator, versiunea de Linux etc., folosită de interpretul de comenzi și alte programe.

Variabilele utilizate frecvent de către utilizator sunt:

PATH – variabila conține căile în care sistemul ar trebui să caute fișiere executabile dacă este complet sau cale relativă lor.

PWD – variabila conține numele complet al directorului curent.

HOME – variabila conține calea completă directorul principal al utilizatorului.

HOSTNAME – variabila conține numele computerului.

LOGNAME – conține Nume de utilizator

SHELL – conține numele shell-ului de comandă care rulează în sesiunea curentă.

UTILIZATOR - conține Nume de utilizator, a cărui sesiune este deschisă acum.

Lista variabilelor instalate în sistem poate fi văzută cu ajutorul comenzii de export, introdusă fără parametri.

Interpretul de comandă bash are, de asemenea, propriile variabile. Pentru ca variabilele locale să devină variabile de sistem, acestea trebuie exportate folosind aceeași comandă de export.

$ export declare -x HOME="/home/gserg" declare -x HOSTNAME="WebMedia" declare -x LANG="ru_RU.KOI8-R" declare -x LOGNAME="gserg" declare -x PATH="/bin: /usr/bin:/usr/local/bin:/home/gserg/bin" declare -x PWD="/home/gserg" declare -x SHELL="/bin/bash" declare -x TERM="Eterm" declare -x USER="gserg" $ EDITOR=/bin/vim $ export EDITOR $ export declare -x EDITOR="/bin/vim" declare -x HOME="/home/gserg" declare -x HOSTNAME="WebMedia" declara -x LANG="ru_RU.KOI8-R" declară -x LOGNAME="gserg" declară -x PATH="/bin:/usr/bin:/usr/local/bin:/home/gserg/bin:" declară - x PWD="/home/gserg" declara -x SHELL="/bin/bash" declara -x TERM="Eterm" declară -x USER="gserg" $

Echipă neasezatșterge o variabilă de sistem. De exemplu:

$ unset EDITOR $ export declare -x HOME="/home/gserg" declare -x HOSTNAME="WebMedia" declare -x LANG="ru_RU.KOI8-R" declare -x LOGNAME="gserg" declare -x PATH=" /bin:/usr/bin:/usr/local/bin:/home/gserg/bin:" declare -x PWD="/home/gserg" declare -x SHELL="/bin/bash" declare -x TERM= „Eterm” declară -x USER="gserg" $

5. În lecția de astăzi vă vom prezenta un alt shell de comandă, ușor nestandard comandant de la miezul nopții. Nu este shell de comandăîn sensul obişnuit. Acesta este un manager de fișiere text - analog Comandantul Norton sau Departe. comandant de la miezul nopții lansat prin comanda mc. Vom vorbi despre capacitățile sale.

Ecran comandant de la miezul nopțiiîmpărțit în două părți. Aproape întregul spațiu pe ecran este ocupat de două panouri cu o listă de directoare și fișiere. În mod implicit, a doua linie din partea de jos a ecranului este linia de comandă, unde puteți rula comenzi shell obișnuite, iar linia de jos arată sfaturi pentru tastele funcționale ( F1-F10). Linia de sus a simbolurilor conține un meniu cu ajutorul căruia puteți efectua multe funcții. Pentru a utiliza meniul, puteți face clic cu mouse-ul pe elementul dorit sau puteți apăsa tasta F9și folosind cheile controlul cursorului selectați elementul dorit.

Panouri comandant de la miezul nopții oferă vizualizarea a două directoare simultan. Unul dintre panouri este activ (în sensul că utilizatorul poate efectua anumite acțiuni cu fișierele și directoarele aflate în el). În panoul activ, numele unuia dintre fișiere sau directoare este evidențiat, iar titlul panoului din linia de sus este evidențiat color. Numele titlului este același cu numele directorului afișat în prezent. Aproape toate operațiunile sunt efectuate în panoul activ. Unele operațiuni precum transferul sau Copiere fișiere utilizați un panou pasiv ca loc unde se face copierea, transferul etc.

Acum să vorbim despre comenzile rapide de bază de la tastatură cu care vă vor ajuta să lucrați comandant de la miezul nopții.

tastele sunt folosite pentru a schimba panoul activ sau +

pentru a marca un fișier, faceți clic sau +

clic pentru ajutor

va apela vizualizatorul de fișiere

prin utilizarea editezi fisierul

vă va permite să copiați fișierul .

mutați sau redenumiți un fișier

crea un director

Cheie vă va permite să ștergeți un fișier și/sau director

, după cum sa menționat deja, deschide accesul la meniu.

- vă va permite să ieșiți din comandant de la miezul nopții.

va muta indicatorul la începutul listei de fișiere,

- dimpotrivă - până la sfârșitul listei.

Și va schimba poziția indicatorului la pagina în sus și respectiv în jos.

Cheie <*> pe o tastatură suplimentară vă va permite să inversați selecția fișierelor (nu afectează directoarele)

Cheie <+> pe tastatura suplimentară vă va permite să marcați fișierele după mască și <-> demarcați fișierele după mască.

+ - actualizați conținutul directorului (prin recitire de pe disc sau din rețea)

+ - schimbați panourile din dreapta și din stânga.

+ - scoateți/returnați panourile.

Deși comenzile rapide de la tastatură sunt instrumentul optim pentru a finaliza treaba comandant de la miezul nopții cât mai rapid și convenabil posibil, pentru începători este destul de dificil să le învețe pe toate deodată. Pentru a umple acest gol și a adăuga alte capabilități care nu au comenzi rapide de la tastatură, comandant de la miezul nopții are un meniu (apelabil de F9).

Meniul este format din elemente: „Paneul din stânga”, „Fișier”, „Comandă”, „Setări”, „Panoul din dreapta”.

„Panou stânga/dreapta”- aceste elemente de meniu sunt exact aceleași. Singura diferență dintre ele este că acțiunile efectuate vor fi adresate panoului din stânga sau din dreapta.

„Format listă”- deschide o casetă de dialog în care puteți selecta vizualizarea în care va fi afișată lista de fișiere/directoare. Există formate standard, scurte și extinse din care să alegeți. Cu toate acestea, utilizatorul din această fereastră poate determina el însuși tipul de panou care i se potrivește selectând comutatorul „Definit de utilizator”.

"Vizualizare rapidă"- pune panoul în modul de vizualizare automată pentru fișierele selectate pe panoul alăturat. Focalizarea trece automat pe panoul opus.

"Informație"- comută panoul pentru a vizualiza informații despre fișierul evidențiat în panoul alăturat, cum ar fi poziția, permisiunile și proprietarul, Sistemul de fișiereși dispozitivul pe care se află, numărul de legături hard asociate cu acest fișier, precum și informații despre dispozitivul pe care se află fișierul.

"Copac"- traduce comandant de la miezul nopțiiîntr-un mod similar cu modul de operare al Explorer din sistemul de operare Windows. În panoul căruia i se aplică comanda "Copac", este construit un arbore de directoare, care poate fi navigat folosind săgeți controlul cursorului, chei Pag în sus, Pag în jos, Acasă, Sfârșit. Panoul alăturat afișează conținutul directorului evidențiat în arbore.

"Ordinea de sortare"- deschide o casetă de dialog în care puteți selecta un atribut după care fișierele și directoarele vor fi sortate într-o listă cum ar fi numele, extensia, timpul de editare, timpul de acces, timpul de schimbare a atributului, dimensiunea, nodul (pe care se află fișierul) . De asemenea, puteți lăsa fișierele nesortate, le puteți sorta diferențiat de majuscule sau minuscule sau le puteți sorta în ordine inversă.

"Filtru"- vă permite să selectați nume de fișiere care vor fi afișate în panou folosind o expresie regulată introdusă în caseta de dialog.

„Conexiune FTP”- folosind această comandă puteți stabili o conexiune cu un computer la distanță (sau chiar local) folosind protocolul ftp. Dacă este introdusă doar adresa serverului de la distanță, atunci comandant de la miezul nopții va încerca să stabilească o conexiune anonimă. Linia completă cu care este specificat nodul este:

ftp:nume_utilizator:parolă@adresa_server:port/director_pe_server

După ce conexiunea este stabilită, lucrați cu sistem de fișiere la distanță funcționează în mod similar cu lucrul cu un FS local.

„Conexiune shell”- vă permite să deschideți o conexiune de rețea folosind protocolul PEŞTE (Transfer de fișiere prin SHell– transfer de fișiere prin shell). PEŞTE folosește protocoale RSH (Remote SHell– scoasa scoasa) sau SSH (Secure SHell– carcasă protejată, analog RSH, dar cu suport pentru criptarea datelor transmise). Șirul complet cu care utilizatorul poate specifica nodul la distanță este:

sh:nume_utilizator@adresa_server:options/directory_on_server

Parametru Nume de utilizator, opțiuni și director_pe_server nu este necesar. Dacă Nume de utilizator nespecificat atunci comandant de la miezul nopții va încerca să se conecteze la sistemul de la distanță cu numele de utilizator folosit pe computerul local.

"Revizui"- analogul unei combinații de taste + - face ca lista de fișiere și directoare din panoul curent să fie actualizată prin recitirea lor de pe disc sau prin rețea.

"Fişier"- secțiunea de meniu, ale cărei articole oferă funcții de bază pentru procesarea fișierelor și directoarelor, cum ar fi:

„Meniul utilizatorului”- vă permite să apelați un meniu care este setat de utilizator însuși. De asemenea, numit prin cheie .

"Vezi fișierul"- analogul unei funcții efectuate prin apăsare . Vă permite să vizualizați fișierul evidențiat (sau să intrați în director). Suportă multe formate, cum ar fi formate de text, arhivă, Winword DOC, executabile Linux etc.

„Se vizualizează fișierul...”- la fel ca și paragraful anterior, dar nu acționează asupra fișierului evidențiat, ci asupra celui al cărui nume și cale vor fi introduse în caseta de dialog.

"Vezi echipa"- vă permite să executați o comandă și să o vizualizați ieșire standardîn modul de vizualizare a fișierelor.

"Editare"- deschide fișierul pentru editare. Simplu încorporat editor de text are un set suficient de funcții încorporate pentru editarea fișierelor de configurare, a codurilor sursă a programelor etc. și automată încorporată evidențierea sintaxelor face editarea mai convenabilă și textele editate mai lizibile.

"Copie"- copiază un fișier din panoul activ în cel pasiv. Analog cu o funcție numită de . În mod implicit, fișierul (sau grupul de fișiere) evidențiat în panoul activ este considerat a fi copiat, iar destinația este directorul deschis în panoul pasiv. Acest lucru poate fi modificat prin ajustarea valorilor câmpului în caseta de dialog care se deschide după apelarea acestei comenzi.

"Drepturi de acces"- vă permite să modificați drepturile de acces la un fișier (sau un grup de fișiere) în caseta de dialog.

„Legătură simbolică”- creează o legătură simbolică. Implicit, fișierul evidențiat în panoul activ este luat drept destinatar, iar linkul creat va avea același nume și va fi localizat în directorul deschis în panoul pasiv. Utilizatorul poate schimba acest lucru în caseta de dialog care se deschide.

„Proprietar/Grup”- schimbă proprietarul și/sau grupul căruia îi aparține fișierul/directorul.

„Drepturi (extinse)”- vă permite să modificați simultan drepturile de acces la un fișier și proprietarul și/sau grupul acestuia. Permisiunile sunt reprezentate ca trei secvențe rwx pentru proprietar, grup și toți utilizatorii.

"Redenumire"- vă permite să redenumiți/mutați un fișier. Analog cu o funcție numită de . În mod implicit, fișierul (sau grupul de fișiere) evidențiat în panoul activ este considerat a fi mutat/redenumit, iar destinația este directorul deschis în panoul pasiv. Acest lucru poate fi modificat prin ajustarea valorilor câmpului în caseta de dialog care se deschide după apelarea acestei comenzi.

„Crearea unui director”- creează un director. Analog cu o funcție numită de . În mod implicit, directorul este creat în directorul deschis în panoul activ. Acest lucru poate fi schimbat dacă specificați calea completă către directorul care urmează să fie creat în dialogul care se deschide.

"Șterge"- șterge un fișier/grup de fișiere/director. Analog cu o funcție numită de .

„Schimbați directorul”- schimbă directorul curent. Similar cu comanda cd din shell-ul Bash. Directorul necesar este introdus în caseta de dialog.

„Marcați grupul”- Marchează un grup de fișiere după mască în directorul deschis în panoul activ. Analog cu o funcție numită cu <+> pe o tastatură suplimentară.

Cu siguranță, aproape toți cititorii Habr cunosc shell-urile sh și bash. De asemenea, cei mai mulți dintre noi au auzit ceva despre zsh și tcsh. Cu toate acestea, lista de shell-uri existente nu se termină aici. Ele pot fi împărțite aproximativ în trei grupuri:

  • Clone Bourne shell (bash, zsh)
  • C shell (csh, tcsh)
  • Bazat pe limbaje de programare populare (psh, ipython, scsh)
  • Exotice, specifice și toate celelalte
Cele mai interesante dintre ele vor fi discutate.

Scopul scrierii acestui articol nu a fost de a revizui sau clasifica toate shell-urile de comandă existente. Vreau doar să vorbesc despre câteva produse interesante în acest domeniu și să lărg orizontul cititorului. Voi fi bucuros. Dacă acest lucru încurajează pe cineva să studieze subiectul mai detaliat sau chiar să treacă la un alt subiect.
În primul rând, pe scurt despre ce este. Un shell de comandă sau un interpret de comandă este o aplicație care oferă utilizatorului o interfață de linie de comandă în care utilizatorul fie introduce comenzi individual, fie rulează scripturi constând dintr-o listă de comenzi. Oral și în textele neoficiale este adesea numit „shell”, din engleză shell - shell.

Cele mai utilizate shell-uri compatibile cu POSIX provin din shell-ul Bourne, așa că vom începe cu asta

Shell Bourne și clonele sale

coajă Bourne, fisier executabil: SH. Un shell de comandă numit după creatorul său, Stephen Bourne. Majoritatea operatorilor au fost împrumutate din limbajul ALGOL 68 A fost lansat în a 7-a ediție a sistemului de operare UNIX, unde era shell-ul implicit. Până în prezent, marea majoritate a sistemelor asemănătoare Unix au /bin/sh - o legătură simbolică sau hard către un shell compatibil sh.

Cochilia Bourne din nou, fisier executabil: bash. Titlul poate fi tradus ca „The Reborn Walk of Bourne”. Cel mai probabil, cel mai popular shell astăzi. Standard de facto pentru Linux. Nu mă voi opri asupra ei, pentru că... Există o mulțime de articole bune despre bash pe Internet. De exemplu aici și aici.

Z coajă, fisier executabil: zsh. O carcasă gratuită, modernă compatibilă cu SH. Are o serie de avantaje față de bash, legate în principal de lucrul în modul interactiv. Au scris despre asta pe Habré și
În plus, există destul de multe shell-uri care se încadrează în acest grup: shell Korn (ksh) și shell Almquist (cenusa) etc, dar nu ne vom opri asupra lor în detaliu.

C coajă

C coajă, fisier executabil: csh Un shell de comandă dezvoltat de autorul vi Bill Joy. Baza pentru limbajul de scripting csh a fost, după cum sugerează și numele, limbajul C. la acea vreme, în 1978, era cel mai popular limbaj de programare printre dezvoltatorii și utilizatorii BSD UNIX. În prezent, cea mai populară implementare gratuită a csh este tcsh.

TENEX C Shell, fisier executabil: tcsh. În tcsh a apărut pentru prima dată completarea automată. Acesta este shell-ul implicit pe FreeBSD. Puteți citi mai multe despre el.
Pentru a arăta clar diferența de sintaxă, voi da câteva exemple de scripturi care fac același lucru pentru csh și un interpret de comandă compatibil sh.

Construcție condiționată:

O buclă care calculează primele 10 puteri a două:

#!/bin/sh i=2 j=1 în timp ce [ $j -le 10 ]; face eco "2 **" $j = $i i=`expr $i "*" 2` j=`expr $j + 1` terminat #!/bin/csh set i = 2 set j = 1 while ($j<= 10) echo "2 **" $j = $i @ i *= 2 @ j++ end

Cu toate acestea, lista de caracteristici acceptate de cele mai recente versiuni de bash, zsh și tcsh este foarte asemănătoare și alegerea unui anumit shell este în mare parte o chestiune de gust. Cu cochilii mai puțin obișnuite, situația este diferită. Aici diferențele sunt mai semnificative.

Shell-uri de comandă bazate pe limbaje de programare populare.

Shell Perl, fisier executabil: psh. Un shell care combină funcționalitatea shell-urilor de mai sus și puterea limbajului Perl. Deoarece psh este scris în perl și poate rula chiar și pe Windows. Câteva exemple de utilizare a psh:
ls | s/y/k/ # Înlocuire folosind expresii regulate ls | ( print ++$i, ": $_"; )q # Filtru rapid. În interiorul acoladelor este o expresie Perl în care $_ conține o linie de ieșire. netstat | ( $_>2; )g # filtre grep. Sunt tipărite doar acele linii pentru care expresia dintre paranteze returnează comanda adevărată >[=FOO] # Redirecționare prin mâner deschide fișierul comandă > fișier # Echivalent cu comanda 2> fișier în bash. Redirecționează fluxul de ieșire și de eroare către un fișier grep foo lib/**/*.pm # Utilizați **, ceea ce înseamnă directorul curent și toate subdirectoarele

Scsh, fisier executabil scsh. Interpret de comandă cu sursa deschisa folosind Scheme 48 ca limbaj de scripting Nu acceptă funcții standard pentru alte shell-uri (istoric de comenzi, editare de text pe linia de comandă, adăugare de cale/comandă). Se recomandă scriptarea, dar nu pentru munca interactivă. Poate atrage fanii programare functionala. Mai jos este un exemplu de script care afișează numele tuturor fișierelor executabile situate în directoare din variabila de mediu PATH
#!/usr/local/bin/scsh -s !# (definiți (dir. executabile) (cu-cwd dir (filtru fișierul-executable? (director-fișiere director #t)))) (definiți (scrieți x) (afișare x) (linie nouă)) (pentru fiecare writeln (executabile de adăugare a hărții ((infix-splitter ":") (getenv "PATH"))))

IPython. Este un shell interactiv pentru limbajul de programare Python care are o serie de caracteristici suplimentare. IPython are un profil special pentru rularea ca shell de sistem. Modul de lansare a acestui mod depinde, după cum am înțeles, de versiune, dar pe mașina mea arată astfel:
ipython3 --profile=pysh

Despre IPython s-au scris deja destul de multe, inclusiv în limba rusă (linkuri la sfârșitul articolului). Voi încerca să enumerez principalele sale caracteristici din punctul de vedere al utilizării ca shell de comandă:

  • Multiplatformă. Există chiar și o versiune pentru Windows
  • Versiunile Python 2.x sau 3.x ca limbaj de scripting, capabilități îmbunătățite de introspecție
  • Completarea automată a codului Python, precum și a numelor fișierelor și comenzile sistemului.
  • Istoricul comenzilor și macrocomenzi bazate pe acesta
  • Un mecanism care accelerează navigarea prin cataloage, marcaje și multe altele
După cum puteți vedea, în ceea ce privește capacitățile sale interactive, IPython este cel puțin la fel de bun ca bash. În ceea ce privește scripturile, IPython va fi convenabil pentru cei care știu python este mai bun decât bash. De fapt, scripturile IPython vor diferi de Python pur doar prin apelarea simplificată a comenzilor de sistem. Iată câteva exemple de integrare a comenzilor Python și a sistemului:
# Să presupunem că am vrut să calculăm dimensiunea totală a fișierelor jurnal dpkg: În : cd /var/log/ /var/log In: log_files = !ls -l dpkg.log* In: log_files Out: "-rw-r- -r-- 1 rădăcină rădăcină 1824 Nov 3 16:41 dpkg.log" În : pentru linia în fișierele_log: ....: dimensiune += int(line.split()) ....: Înă : dimensiune Out: 1330009 # ..sau ping secvențial zece gazde În: pentru i în interval(100,110): ....: !ping -c 1 192.168.0.$i ....:
Odihnă
Bineînțeles că nu este lista plina chiar scoici populare. Pe lângă categoriile de mai sus, există și cele care folosesc propria sintaxă, care nu este compatibilă cu sh și nu copiază limbajul existent. Un exemplu ar fi scoici interactiv prietenos (pește). Dar, în sfârșit, aș dori să vorbesc nu despre asta, ci despre un somn mai specific.

Sleep Dummy Shell, fisier executabil: sleepshell. Strict vorbind, sleepshell nu poate fi numit un procesor de comandă, deoarece nu poate procesa comenzi. Și, în general, nu poate face nimic decât să scrie periodic asteriscuri „*” în ieșirea standard. Cu toate acestea, este folosit tocmai ca shell de comandă și din acest motiv: Să presupunem că vrem să oferim cuiva posibilitatea de a face tuneluri ssh prin serverul nostru care rulează Linux sau Unix. Citiți mai multe despre tunelul ssh. Dar nu avem nevoie de acel cineva pentru a avea acces la linia de comandă și la sistemul de fișiere al serverului nostru. Sleepshell este conceput pentru un astfel de caz. Creăm un cont pe server ca shell și instalăm sleepshell pentru acesta. Proprietarul contului va putea să se conecteze și să redirecționeze porturi, dar nu va putea executa comenzi.

Asta e tot. Sper că a fost interesant. Voi fi bucuros să primesc orice comentarii și sfaturi cu privire la textul articolului.

Linkuri conexe
www.faqs.org/faqs/unix-faq/shell/shell-differences - tabel rezumat al diferențelor și asemănărilor shell-ului
www.mariovaldez.net/software/sleepshell - Sleep Dummy Shell
ipython.org/ipython-doc/dev/interactive/shell.html - IPython ca shell de sistem
www.opennet.ru/base/dev/ipython_sysadmin.txt.html - IPython shell ca instrument de administrator de sistem
  • 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.

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 - 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;
    • nici funcțiile de personalizare a shell-ului interactiv (afectarea invitației, schimbarea directorului, setarea variabilelor de mediu) nu sunt 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ă rulați Program 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 - 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. a apărut în linia de intrare comanda anterioară. Puteți utiliza 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 multe acțiuni tipice 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 l-ai copiat 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ă dați instrucțiuni universale, din păcate, nu va funcționa. 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 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 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 referință 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 funcția de la bibliotecă standard C, iar man 1 printf este 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 în fereastra mica terminal, trebuie să vizualizați un text foarte lung (conținutul unui fișier, un om lung etc.), ei folosesc programe speciale „de paginare” (de la pagina de cuvinte, adică flippers de pagină). 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 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 realizează 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 data trecută;
  • 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: arbore , arbore -d (directorul poate fi transmis 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 cele mai consumatoare de 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 rezultatul 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 . Utilizaț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ă acest moment ca utilizator 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.