This shows you the differences between two versions of the page.
unixmix:capitole:capitol-07 [2013/07/11 11:36] alexef [Shell scripting] |
unixmix:capitole:capitol-07 [2014/09/12 10:09] (current) razvan [Afișare fișiere executabile pentru procese] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | = Interpretorul tcsh = | + | = Interpretorul bash = |
+ | |||
+ | [[https://docs.google.com/presentation/d/1btwpQIcgu5F9Upw0EKD7ufhzgLycuacE3q07N-_f_6w/pub?start=false&loop=false&delayms=3000|Slide-uri de prezentare]] | ||
== Tutorial == | == Tutorial == | ||
+ | |||
+ | === Completare automată === | ||
+ | |||
+ | * Aflați toate comenzile care încep cu "who". | ||
+ | ** Tastați "who<TAB><TAB>". | ||
+ | * Rulati comanda ''whoami'' tastând un număr minim de taste. | ||
+ | ** Tastați "whoa<TAB><ENTER>". | ||
+ | * Intrați în directorul rădăcină a sistemului de fișiere. Întorceți-vă, apoi, în directorul vostru home. | ||
+ | ** Rulați ''cd /''. | ||
+ | ** Rulați, apoi, fie ''cd'' (fără argumente), fie ''cd ~''. | ||
+ | * Întorceți-vă iar în directorul rădăcină (directorul în care erați înainte) apoi iar în directorul vostru home. | ||
+ | ** Rulați ''cd -'' și apoi ''pwd'' să verificați unde sunteți. | ||
+ | ** Ruați încă o dată ''cd -'' și verificați că ați ajuns în directoul home. | ||
+ | * Intrați în directorul //Documents// din directorul home, folosind un număr minim de caractere. | ||
+ | ** Tastați "cd Do<TAB>". | ||
+ | ** Nu este suficient? Mai tastați un <TAB> să vedeți opținile pe care le aveți. | ||
+ | ** Mai adăugați o literă ('c') și tastați <TAB> pentru a completa cu numele directorului. | ||
+ | * Creți în directorul curent (~/Documents) o ierarhie de directoare ''~/Documents/These/are/not/the/droids/you/are/looking/for/''. | ||
+ | ** Rulăti comanda ''mkdir These/are/not/the/droids/you/are/looking/for/''. | ||
+ | ** Nu merge? De ce? Căutați în pagina de manual al lui mkdir (''mkdir'') informații despre parametrul **-p**. | ||
+ | ** Rulați comanda ''mkdir -p These/are/not/the/droids/you/are/looking/for/''. | ||
+ | * Intrați în cel mai adânc director din ierarhia nou creată (directorul 'for'). | ||
+ | ** Fiți eficienți! | ||
+ | ** Sper că nu ați pus mâna pe mouse să dați copy/paste la cale. | ||
+ | ** Tastați "cd ~/Documents/T<TAB><TAB><TAB><TAB><TAB><TAB><TAB><TAB><TAB><TAB>" | ||
+ | * Reveniți în directorul precedent. | ||
+ | ** Hint: -. | ||
+ | * Creați ierarhia de directoare //~/Documents/May/the/Force/by/with/you///. | ||
+ | ** Aduceți-vă aminte de parametrul -p. | ||
+ | * Intrați în cel mai adânc director din ierarhie fără să scrieți, efectiv, calea. | ||
+ | ** Folosiți-vă de ultimul argument al comenzii precedente, care a fost fix calea. | ||
+ | ** Tastați "cd <Atl+.>". | ||
+ | * Reveniți în directorul vostru home. | ||
+ | * Intrați iar în directorul //~/Documents/These/are/not/the/droids/you/are/looking/for///. | ||
+ | ** Vă aduceți aminte că ați mai făcut asta odată? Refolosiți comanda precedentă! | ||
+ | ** Tastați Ctrl-r și apoi un cuvânt cheie cum ar fi "droids". | ||
+ | * Vizualizați ce comenzi ați dat până acum. | ||
+ | ** Rulați comanda ''history''. | ||
+ | * Sțergeți directoarele noi create. | ||
+ | ** Aduceți-vă aminte laboratoarele trecute. | ||
=== Scurtături la tastatură === | === Scurtături la tastatură === | ||
- | **Modificare în mașina virtuală pentru ca exercițiile să meargă**: | + | **Este posibil să fie nevoie de următoarea modificare în terminal pentru ca exercițiile să meargă**: |
* Din meniul gnome-terminal accesați Edit -> Keyboard shortcuts. | * Din meniul gnome-terminal accesați Edit -> Keyboard shortcuts. | ||
- | * Dezactivați cele două opțiuni din fereastra nouă. | + | * Dezactivați cele două opțiuni din ferastra nouă. |
* Tastați în prompt mesajul "Ana are mere". | * Tastați în prompt mesajul "Ana are mere". | ||
* Oups... am greșit comanda. Voiam să fie afișat acel mesaj. | * Oups... am greșit comanda. Voiam să fie afișat acel mesaj. | ||
** Rulați 'echo !!'. | ** Rulați 'echo !!'. | ||
- | ** Ce face "!!" ? | + | ** Ce făcea "!!" ? |
- | + | * Folosiți reverse search (Ctrl-r) pentru a rescrie la prompt comanda ''echo Ana are mere'', dar fără a o rula. | |
- | * Folosiți reverse search (up arrow) pentru a rescrie la prompt comanda ''echo Ana are mere'', dar fără a o rula. | + | |
** Verificați că promptul conține "echo Ana are mere". | ** Verificați că promptul conține "echo Ana are mere". | ||
* Transformați mesajul în "Maria are pere". | * Transformați mesajul în "Maria are pere". | ||
Line 27: | Line 68: | ||
* Încercați să găsiți executabilul pentru comanda ''alias''. | * Încercați să găsiți executabilul pentru comanda ''alias''. | ||
- | ** Hint: ''whatis'', ''which''. | + | ** Hint: ''which''. |
** De ce nu găsiți nimic? | ** De ce nu găsiți nimic? | ||
- | + | * Folosiți comanda (internă) ''help'' pentru afla informații despre comanda (internă) ''alias''. | |
- | * Folosiți ''man tcsh'' pentru afla informații despre comanda (internă) ''alias''. | + | |
* Creați un alias în bash, astfel încât când rulați comanda ''ll'', să ruleze ''ls -l''. | * Creați un alias în bash, astfel încât când rulați comanda ''ll'', să ruleze ''ls -l''. | ||
- | ** Rulați ''alias ll ls -l''. | + | ** Rulați ''alias ll="ls -l"''. |
** Verificați cu ''type ll'' că aliasul a fost creat și rulați ''ll'' pentru a vedea efectul. | ** Verificați cu ''type ll'' că aliasul a fost creat și rulați ''ll'' pentru a vedea efectul. | ||
* Deschideți un nou terminal și încercați să rulați 'll'. | * Deschideți un nou terminal și încercați să rulați 'll'. | ||
Line 39: | Line 79: | ||
=== Operatori === | === Operatori === | ||
+ | |||
Un proces se poate termina cu succes (status 0) sau cu eroare (status diferit de 0). | Un proces se poate termina cu succes (status 0) sau cu eroare (status diferit de 0). | ||
Line 61: | Line 102: | ||
Folosind operatorii **&&** și **||**, putem rula un al doilea proces doar dacă primul proces a avut succes, respectiv eroare. | Folosind operatorii **&&** și **||**, putem rula un al doilea proces doar dacă primul proces a avut succes, respectiv eroare. | ||
- | Testați următoarele comenzi și observați dacă se execută sau nu procesul ''echo'': | + | Testați următoarele comenzi și observați dacă se execută sau nu procesul echo: |
<code> | <code> | ||
Line 83: | Line 124: | ||
<code> | <code> | ||
- | set a=Alice | + | a=Alice |
- | set b=Bob | + | b=Bob |
</code> | </code> | ||
Line 91: | Line 132: | ||
<code> | <code> | ||
- | echo "$a and $" | + | echo "$a and $b" |
</code> | </code> | ||
Line 104: | Line 145: | ||
The program 'alice' is currently not installed. You can install it by typing: | The program 'alice' is currently not installed. You can install it by typing: | ||
sudo apt-get install alice | sudo apt-get install alice | ||
+ | |||
+ | |||
</code> | </code> | ||
Line 109: | Line 152: | ||
* Intrați în directorul /////. | * Intrați în directorul /////. | ||
- | * Printați valoarea variabilei **PWD**. | + | * Printați valoarea variabilei **OLDPWD**. |
+ | ** Hint: echo, $. | ||
* Rulați comanda cd -. | * Rulați comanda cd -. | ||
- | ** Ce face variabila PWD? | + | ** Ce face variabila ODLPWD? |
+ | * Modificați variabila OLDPWD în /tmp și rulati comanda cd -. | ||
+ | ** Observați efectul modificării variabilei de mediu. | ||
- | * Afișați valoarea variabilei **PATH** | ||
- | ** Ce face PATH? | ||
- | * Modificați PATH să includă directorul curent, ca prima cale de căutare | ||
- | <code> | ||
- | set PATH=.:$PATH | ||
- | </code> | ||
- | * Copiați /bin/pwd în directorul curent, cu numele ls | ||
- | * Rulați comanda ''ls'' | ||
- | ** Ce se întâmplă? | ||
- | ** Refaceți configurația. | ||
Line 131: | Line 168: | ||
<code> | <code> | ||
- | set A=42 | + | |
- | set B=28 | + | |
+ | A=42 | ||
+ | B=28 | ||
echo "A=$A and B=$B" | echo "A=$A and B=$B" | ||
- | @ SUM = $A + $B | + | echo "A+B=$(($A+$B))" |
- | echo "A+B=$SUM" | + | A=$(($A+1)) |
- | @ A = $A + 1 | + | B=$(($B*10)) |
- | @ B = $B * 10 | + | |
echo "A=$A and B=$B" | echo "A=$A and B=$B" | ||
+ | |||
+ | |||
</code> | </code> | ||
Line 144: | Line 184: | ||
* Salvați în variabila OUTPUT ieșirea de la rularea comenzii ''ls''. | * Salvați în variabila OUTPUT ieșirea de la rularea comenzii ''ls''. | ||
- | ** Rulați ''set OUTPUT=`ls`''. | + | ** Rulați ''OUTPUT=$(ls)''. |
* Vizualizați conținutul variabilei OUTPUT. | * Vizualizați conținutul variabilei OUTPUT. | ||
** Hint: echo, $. | ** Hint: echo, $. | ||
Line 152: | Line 192: | ||
<code> | <code> | ||
- | set OUTPUT=`which ls` | + | OUTPUT=$(which ls) |
ls -lah $OUTPUT | ls -lah $OUTPUT | ||
</code> | </code> | ||
+ | == Recapitulare == | ||
+ | |||
+ | # Afișați fișierele din directorul ''/bin'' sortat în ordinea dimensiunii fișierelor. Folosiți-vă de comanda ''stat'' și de opțiunea de formatare a acesteia (''-c'' sau ''%%--%%format''). | ||
+ | # Afișați linie sub linie directoarele conținute de variabila de mediu ''PATH''. | ||
+ | # Afișați fișierele din ierarhia ''/usr/include'' în ordinea numărului de apariții ale **cuvântului** ''FILE''. Folosiți ''grep'' cu opțiunile aferente și apoi ''sort''. **Indicație**: Căutați în pagina de manual a lui ''grep'' după, respectiv, ''recursive'', ''count'' și ''word''. | ||
+ | # Afișați interfețele și adresele IP ale sistemului în formatul ''eth0,141.85.37.225'', linie sub linie. **Soluție și exemplu de rulare**:<code> | ||
+ | razvan@einherjar:~$ /sbin/ifconfig | awk -F '[ :]+' '/Link encap/ {printf "%s,", $1;} /inet addr/ {printf "%s\n", $4;}' | ||
+ | docker0,172.17.42.1 | ||
+ | eth0,172.16.14.167 | ||
+ | lo,127.0.0.1 | ||
+ | vboxnet0,virbr0,192.168.122.1 | ||
+ | </code> | ||
+ | |||
+ | === Afișare caractere speciale === | ||
+ | |||
+ | Inițializați variabila ''text'' la un șir de caractere. | ||
+ | |||
+ | Afișați la ieșirea standard mesajul //"Variabila text are valoarea '"...'". Valorea poate fi actualizata."//. În mesaj, toate caracterele ghilimele (''"'') și apostrof (''%%'%%'') se vor afișa întocmai. | ||
+ | |||
+ | === Afișare fișiere localizate === | ||
+ | |||
+ | Folosiți comanda ''locate'' pentru a afișa fișierele din sistem care au extensia ''.conf''. | ||
+ | |||
+ | Pentru fișierele de mai sus afișați directoarele din care fac parte. Eliminați duplicatele. | ||
+ | |||
+ | <note tip> | ||
+ | Folosiți comanda ''dirname'' pentru extragerea directoarelor. | ||
+ | </note> | ||
+ | |||
+ | Pentru directoarele de mai sus afișați numele directorului și inode-ul, separate prin virgulă ('',''). | ||
+ | |||
+ | <note tip> | ||
+ | Folosiți comanda ''stat''. | ||
+ | </note> | ||
+ | |||
+ | Sortați directoarele de mai sus în ordinea inode-ului. Afișați numele directorului și inode-ul (separate prin virgulă ('','')). | ||
+ | |||
+ | === Afișare fișiere executabile pentru procese === | ||
+ | |||
+ | Afișați procesele al căror proces părinte este ''init'', procesul cu PID-ul ''1''. | ||
+ | |||
+ | Pentru procesele de mai sus afișați **doar** comanda completă. | ||
+ | |||
+ | Filtrați doar acele comenzi care încep cu ''/'' (adică este calea completă către executabil). | ||
+ | |||
+ | Selectați **doar** calea către executabil, fără argumente către acesta. | ||
+ | |||
+ | Pentru executabilele de mai sus afișați numele și timpul ultimei schimbării (//change time//), separate prin virgulă ('',''). | ||
+ | |||
+ | <note tip> | ||
+ | Folosiți comanda ''stat''. | ||
+ | </note> | ||
+ | |||
+ | Sortați executabilele de mai sus în ordinea timpului ultimei schimbări. | ||
+ | |||
+ | <note tip> | ||
+ | Sortarea poate fi simplă, nu este nevoie de sortare numerică. Formatul datei afișat de ''stat'' permite sortare de orice fel. | ||
+ | </note> | ||
+ | |||
+ | === Creare fișiere === | ||
+ | |||
+ | Creați 100 de fișiere cu numele "myfile-XY.txt", unde ''XY'' este indexul fișierului între ''00'' și ''99''. | ||
+ | |||
+ | <note tip> | ||
+ | Folosiți comenzile ''seq'' și ''touch''. | ||
+ | </note> | ||
+ | |||
+ | <note tip> | ||
+ | Ca model folosiți-vă de comanda<code> | ||
+ | seq -f "%02g" 1 100 | ||
+ | </code> | ||
+ | </note> | ||