You are on page 1of 21

INTRPRET DE

COMANDES UNIX

Enric Morancho

Universitat Oberta de Catalunya

Intrpret de comandes Unix

INTRODUCCI
Aquest document aporta els coneixements necessaris per comenar a treballar sobre un
intrpret de comandes tpic de Unix. Sassumeix que utilitzeu Knoppix, la distribuci
GNU/Linux facilitada per la UOC (C03/05011/01026). El document t 4 mduls: Sistema
de fitxers, Gesti de processos, Comandes usuals i Programaci de shellscripts.

INTRPRET DE COMANDES (SHELL)


Lintrpret de comandes (shell) s una aplicaci que llegeix les comandes teclejades per
lusuari, les analitza, i invoca als serveis pertinents del sistema operatiu per a lexecuci
de les comandes. Per iniciar lexecuci de lintrpret de comandes cal obrir una consola
de shell (icona Konsole de lentorn Knoppix).
Als sistemes Unix hi ha diversos intrprets de comandes disponibles: sh (Bourne shell),
csh (Cshell), ksh (Korn shell), zsh (Zshell), bash (Bourne again shell),... Sassumeix
que utilitzeu bash, lintrpret de comandes configurat per defecte a Knoppix.
L'intrpret de comandes mostra un indicador (prompt) quan est preparat per rebre les
ordres de l'usuari. A la distribuci facilitada per la UOC, el prompt s semblant a
knoppix@ttyp0[knoppix]$, on el primer knoppix indica lidentificador dusuari,
ttyp0 identifica la finestra on sexecuta lintrpret de comandes i el segon knoppix
indica el directori de treball. A aquest document sassumeix que el prompt s prompt$.

MANUAL DEL SISTEMA


Els sistemes Unix disposen duna versi del manual del sistema en format electrnic. El
manual cont informaci sobre les comandes, crides al sistema, rutines de llibreria, etc.
Per accedir-hi, executeu la comanda man parametritzant-la amb el nom de comanda,
crida al sistema,... de la qual vulgueu informaci (exemple1: man fprintf). Per
navegar dins de la informaci mostrada utilitzeu les tecles especials AvPg, RePg, Ini i
Fi. Per buscar una paraula dins de la informaci premeu /, escriviu la paraula a buscar
i torneu a prmer return. Per finalitzar la visualitzaci del manual cal prmer la tecla q.
El manual sestructura en vuit seccions, on la secci 1 informa sobre les comandes, la 2
sobre crides al sistema i la 3 sobre rutines de llibreria. A lexemple anterior
(man fprintf), observeu que a la primera lnia apareix printf(3); aix indica que
fprintf s una rutina de llibreria. Si la informaci sol.licitada existeix a vries seccions
(per exemple write s comanda i crida al sistema), per defecte la comanda man mostra
nicament la informaci trobada a la primera de les seccions relacionades; per consultar
laltra secci cal indicar el nmero de secci que volem consultar (ex: man 2 write).
Si el manual mostra alguns parmetres de les comandes entre corxets ([]), aix indica
que aquests parmetres sn opcionals.
1.Per provar els exemples, heu descriure el text en negreta i acabar-lo amb un salt de lnia.

-1-

Universitat Oberta de Catalunya

Intrpret de comandes Unix

MDUL 1: SISTEMA DE FITXERS


L'objectiu d'aquest mdul s descriure les caracterstiques del sistema de fitxers de Unix
i les comandes bsiques per interaccionar-hi.

INTRODUCCI
Inicialment, podem considerar que un fitxer no s ms que un conjunt de bytes que t
associat un nom. Aquest nom permet que els usuaris puguin fer referncia al fitxer de
forma lgica, sense haver de preocupar-se de com semmagatzema el fitxer al disc; els
serveis del sistema operatiu seran els responsables de les operacions de baix nivell.
El sistema de fitxers s la part del sistema operatiu encarregada de ladministraci de
les dades als dispositius demmagatzemament secundari. Proporciona mecanismes per
emmagatzemar la informaci de forma segura i confidencial, tot i que un usuari ha de
tenir la possibilitat de compartir els seus fitxers amb altres usuaris.

CARACTERSTIQUES DEL SISTEMA DE FITXERS DE UNIX


A continuaci s'indiquen algunes de les caracterstiques del sistema de fitxers Unix:
Els fitxers estan organitzats en directoris. Un directori s un fitxer gestionat pel
sistema operatiu que permet localitzar els fitxers que sn al directori. A ms, un
directori pot contenir fitxers de tipus directori.
El sistema de fitxers Unix t una estructura jerrquica. Existeix un directori arrel
(root directory) representat amb el smbol / que representa el punt dinici
daquesta estructura.
Cada fitxer de tipus directori cont dos fitxers especials (. i ..). El primer (.) fa
referncia al propi directori i el segon (..) fa referncia al directori superior dins
de la jerarquia de directoris.
Dins daquesta estructura, cada usuari del sistema t assignat un directori on pot
guardar els seus fitxers. Aquest directori s coneix com a directori dusuari
(home directory) i a la distribuci que feu servir s /home/knoppix.
Cada usuari pot associar proteccions als seus fitxers i directoris.
El nom dun fitxer pot tenir fins a 255 carcters. Els fitxers on el nom comenci per
. (punt) sn ocults. Tot i que tots els carcters sn vlids dins del nom dun fitxer,
s aconsellable que no apareguin metacarcters2 del shell com *, ?, &, $.
A la distribuci Knoppix, el primer nivell del sistema de fitxers t aquesta estructura:
/

..

bin

boot

cdrom

dev

etc

home

KNOPPIX

lib

mnt

opt

proc

ramdisk

root

sbin

tmp

usr

var

El sistema de fitxers de Unix us resultar familiar ja que el de MsDOS i el de Windows


estan inspirats en el de Unix. Una de les diferncies ms visibles s que el carcter
separador de directoris s diferent: a Unix s / mentre que a MsDOS i Windows s \.
2.Els metacarcters sn carcters que el shell interpreta de forma especial.

-2-

Universitat Oberta de Catalunya

Intrpret de comandes Unix

Navegaci al sistema de fitxers


Tot intrpret de comandes t associat un directori de treball (o actual o
current/working directory) dins del sistema de fitxers. Quan inicieu un intrpret de
comandes, el seu directori de treball, per defecte, coincideix amb el directori dusuari.
Per saber quin s el directori de treball heu d'executar la comanda pwd (print working
directory). Aquesta comanda mostra el cam que hi ha des del directori arrel fins el
directori de treball.
Per modificar el directori de treball associat a un intrpret de comandes cal utilitzar la
comanda cd (change directory). Per exemple, la comanda cd .. ens permet pujar un
nivell dintre de l'estructura (a diferncia de MsDOS, a Unix s precs separar la comanda
cd i el directori .. amb un espai en blanc); tamb permet anar directament a un directori
(per exemple, cd / o cd /etc). Per tornar al directori d'usuari podeu executar la
comanda cd sense parmetres (executeu a continuaci pwd per comprovar-ho).
Creaci/Destrucci de directoris
Les comandes que permeten crear i eliminar directoris sn mkdir i rmdir. Totes dues
esperen com a parmetre el nom del directori a crear o a eliminar respectivament.
Visualitzaci del contingut d'un directori
La comanda ls mostra quins fitxers estan emmagatzemants a un directori. Per exemple,
situeu-vos al directori arrel i executeu ls: es mostrar la llista de fitxers del directori.
prompt$ cd /
prompt$ ls
bin boot cdrom dev etc home KNOPPIX lib mnt none opt proc ramdisk root sbin tmp usr var
prompt$

La comanda ls admet parmetres, com ara -l, que permeten obtenir ms informaci
sobre els fitxers. Un resultat possible de la comanda ls -l podria ser:
prompt$ ls -l
lrwxrwxrwx
1 root
lrwxrwxrwx
1 root
dr-xr-xr-x
7 root
...
prompt$

root
root
root

12 2003-05-20 23:34 bin -> /KNOPPIX/bin


13 2003-05-20 23:34 boot -> /KNOPPIX/boot
2048 2003-06-03 00:36 cdrom

Podeu observar que cada lnia mostrada est associada a un fitxer. La interpretaci de
les lnies s la segent:
El primer carcter indica si es tracta d'un fitxer ordinari (-), un fitxer de tipus
directori (d), un enlla (l),... Un fitxer de tipus enlla (link) permet que un mateix
fitxer tingui dos (o ms) noms diferents, per sense replicar el contingut del fitxer
al disc. Per exemple, a la distribuci Knoppix, fer cd /bin s equivalent a fer
cd /KNOPPIX/bin ja que /bin s un link a /KNOPPIX/bin.
El color de la lnia indica el tipus de fitxer: el blanc representa un fitxer ordinari,
blau fosc un fitxer de tipus directori, blau clar un link, verd un executable,...

-3-

Universitat Oberta de Catalunya

Intrpret de comandes Unix

Els segents 9 carcters indiquen les proteccions del fitxer. Tot seguit s'explicar
con interpretar-los i modificar-los.
El segent nombre est relacionat amb el nombre de links al fitxer.
A continuaci hi ha dos identificadors. Indiquen qui s l'usuari propietari del fitxer i
a quin grup d'usuaris pertany respectivament.
El segent nombre representa la mida (en bytes) del fitxer.
Posteriorment trobem la data de darrera modificaci del fitxer.
Finalment figura el nom del fitxer (i si es tracta dun link, la seva equivalncia).
Per defecte, la comanda ls no mostra informaci sobre els fitxers ocults. Perqu la
comanda ls llisti els fitxers ocults cal passar-li el parmetre -a.
Noms relatius i absoluts
Sempre que invoqueu una comanda que necessiti com a parmetre un nom de fitxer o
directori, podeu escollir entre dos formes d'especificar el nom:
Nom absolut: cam des del directori arrel fins el fitxer (sempre comenar per / i
el carcter / separar els directoris).
Nom relatiu: cam des del directori actual fins el fitxer (mai comenar per /).
Exemple: si el vostre directori de treball s /etc/X11 i voleu situar-vos sobre el directori
/home/knoppix, podeu fer-ho indicant el nom absolut del fitxer (cd /home/knoppix)
o indicant el nom relatiu respecte el directori de treball (cd ../../home/knoppix).
Comandes bsiques relacionades amb fitxers
Les comandes que realitzen les operacions ms comuns sobre fitxers sn:
rm : esborra (remove) un fitxer. T com a parmetre el nom del fitxer a esborrar.
cp : cpia (copy) un fitxer. Els seus parmetres sn el(s) nom(s) del(s) fitxer(s) a
copiar i el directori dest, o el nom del fitxer a copiar i el nom que tindr la cpia.
mv: canvia el nom (move) d'un fitxer. Cal indicar el nom antic i el nom nou.
cat: mostra el contingut d'un fitxer. T com a parmetre el nom del fitxer.
more: mostra el contingut d'un fitxer pgina a pgina. Cal indicar el nom del fitxer.
Exemple:
prompt$ cd
prompt$ mkdir direc
prompt$ cd direc
prompt$ cp /etc/passwd .
prompt$ ls
passwd
prompt$ mv passwd copia
prompt$ ls
copia
prompt$ cat copia
root:x:0:0:root:/root:/bin/bash
...
prompt$ rm copia
prompt$ ls
prompt$

<<<<<<<<-

Ens situem al directori dusuari


Creaci dun directori
Ens situem al directori creat
Copiem /etc/passwd al directori actual
Llistem fitxers directori actual
Apareix la cpia del fitxer /etc/passwd
Canviem nom del fitxer passwd
Tornem a llistar fitxers

<- Ens mostra el contingut del fitxer copia

<- Esborrem fitxer copia


<- Tornem a llistar fitxers

-4-

Universitat Oberta de Catalunya

Intrpret de comandes Unix

Proteccions
Tots els usuaris d'un sistema Unix estan treballant sobre el mateix sistema de fitxers. Per
garantir la confidencialitat de les dades apareix el concepte de proteccions dels fitxers.
Les proteccions determinen les operacions que pot fer cada usuari sobre cada fitxer.
Es consideren tres tipus doperacions: lectura (r), escriptura (w) i execuci (x).
Es consideren tres tipus d'usuaris: lusuari propietari del fitxer3, els usuaris que
pertanyen al seu mateix grup d'usuaris4 i la resta d'usuaris de la mquina.
Les proteccions dun fitxer es representen amb nou carcters. Els tres primers indiquen
les operacions que pot realitzar el propietari del fitxer, els tres segents fan referncia a
les operacions realitzables pels usuaris del mateix grup i els tres darrers fan referncia a
les operacions realitzables per la resta d'usuaris de la mquina. Per exemple, les
proteccions rwxr----- indiquen que el propietari pot fer totes les operacions sobre el
fitxer (rwx), que els membres del seu grup noms poden fer lectures (r--) i que la resta
d'usuaris no pot fer cap operaci sobre el fitxer (---). La comanda ls -l mostra
aquesta informaci just desprs dindicar el tipus del fitxer.
Per modificar les proteccions d'un fitxer s'utilitza la comanda chmod. Aquesta comanda
codifica les proteccions seguint el codi r=4, w=2 i x=1 i sumant els drets de cada tipus
d'usuari5. s a dir, les proteccions rwxr-x--- es representen com 750 (4+2+1, 4+0+1,
0+0+0). Per exemple, chmod 751 file fa que file passi a tenir proteccions
rwxr-x--x.
Directoris habituals
Presentem els directoris ms habituals de tot sistema de fitxers Unix i el seu contingut:
/bin i /usr/bin: trobareu els executables de la majoria de comandes (ls,
cp,...) i aplicacions
/dev : cont fitxers que representen els dispositius del sistema (terminals,...)
/etc : cont dades de configuraci (fitxer de passwords /etc/passwd, ...)
/home : cont els directoris d'usuari dels usuaris de la mquina
/proc: cont informaci sobre els programes en execuci a la mquina
/tmp : cont arxius temporals dels processos
/usr/include : conte els fitxers de capalera de les crides al sistema
/usr/lib : cont les llibreries de funcions

3.Al fitxer /etc/passwd podeu veure tots els usuaris del sistema. La primera paraula de cada lnia (s a
dir, fins al carcter :) s lidentificador dun usuari del sistema. La resta de la lnia cont dades de lusuari
com el seu directori dusuari, el shell que t associat,... A Knoppix hi podeu trobar informaci dels usuaris
knoppix, root,...
4.El fitxer /etc/group cont informaci sobre els grups dusuaris definits al sistema.
5.Tamb podeu pensar en la codificaci en base 2 de les proteccions: r=100, w=010 i x=001. Com a
exemple, les proteccions rwxr-x--- es representarien com a 111101000.

-5-

Universitat Oberta de Catalunya

Intrpret de comandes Unix

Metacarcters per enumerar fitxers


L'intrpret de comandes permet utilitzar metacarcters per fer referncia a varis fitxers
de cop o a directoris d's com.
* : representa qualsevol seqncia de carcters. ls /bin/l*n mostraria els
fitxers del directori /bin amb nom que comena per l i acaba en n.
? : representa un carcter qualsevol. ls /bin/l???n mostraria els fitxers amb
nom que comena per l, acaba en n, i t exactament 5 carcters.
[ ] : representa un carcter dins d'un rang. ls /bin/[aeiou]*[a-f]
mostraria els fitxers amb nom que comena amb una vocal, i acaba en un
carcter entre a i f.
~ : representa el directori d'usuari6. ls ~ mostraria els fitxers del nostre directori
d'usuari independentment de quin s el nostre directori actual.

EDICI DE TEXTOS
L'editor de textos ms caracterstic de Unix s el vi; de totes formes, moltes mquines
Unix tamb tenen instal.lats altres editors com ara joe, emacs, nedit, vim, xedit,...
Tot i que no sn els editors ms potents, els editors ds ms intuitiu sn el nedit i el
xedit. Si penseu continuar treballant sobre Unix, es recomana que estudieu a fons el
funcionament deditors ms potents com vi, vim o emacs.
Per editar un fitxer heu d'indicar el nom del editor a utilitzar i el nom del fitxer a editar. Un
cop fetes les modificacions desitjades, cal actualitzar el contingut del fitxer a disc.

PER ANAR PRACTICANT7


1.-Utilitzant cd i ls, exploreu els directoris habituals del sistema de fitxers Unix.
2.-Creeu un directori al vostre home directory, copieu-hi el fitxer /bin/ls, i feu que
s'anomeni ls2.
3.-Situeu-vos al directori arrel (cd /). Sense canviar de directori, copieu el fitxer
/etc/passwd al directori que heu creat abans.
4.-Busqueu al manual del sistema la utilitat del parmetre -r de la comanda rm.
5.-Consulteu al manual del sistema els parmetres de la comanda ls.

6.Per escriure el carcter ~ cal prmer AltGr 4.


7.Podeu trobar les respostes a algunes daquestes preguntes al final daquest document.

-6-

Universitat Oberta de Catalunya

Intrpret de comandes Unix

MDUL 2: GESTI DE PROCESSOS


L'objectiu d'aquest mdul s descriure les caracterstiques de lintrpret de comandes
relacionades amb la gesti de processos. Concretament, la noci de procs, les
modalitats d'execuci de comandes, la redirecci d'entrada/sortida, la comunicaci de
processos mitjanant pipes i les variables d'entorn.

NOCI DE PROCS
Un procs s un programa en execuci. Cada intrpret de comandes en execuci s un
procs. Normalment, l'intrpret de comandes crea un nou procs per a cada comanda
que llegeix i aquest nou procs executa la comanda indicada; quan aquest nou procs
finalitza, l'intrpret de comandes torna a mostrar el prompt del sistema.
Informaci sobre processos: comandes ps i top
La comanda ps informa respecte els processos existents a la mquina. Per defecte,
informa sobre els processos associats a la finestra des de la que hem executat ps, per
podem parametritzar-la perqu doni ms informaci sobre els processos (parmetres
-f, -l o u), informaci sobre tots els processos d'un usuari (parmetre -u i el nom de
l'usuari) o sobre tots els processos de la mquina (parmetre -e). Per exemple:
prompt$ ps
PID TTY
TIME CMD
677 ttyp0
00:00:00 bash
<- Lintrpret de comandes
706 ttyp0
00:00:00 ps
<- El propi procs ps
prompt$ ps -l
F S
UID
PID PPID C PRI NI ADDR
SZ WCHAN TTY
TIME CMD
0 S 1000 677
670
0 75
0
- 1314 wait4 ttyp0
00:00:00 bash
0 R 1000 717
677
0 78
0
808 ttyp0
00:00:00 ps
prompt$ ps -f
UID
PID PPID C STIME TTY
TIME CMD
knoppix
677
670 2 21:58 ttyp0
00:00:00 /bin/bash
knoppix
718
677 0 21:59 ttyp0
00:00:00 ps -f
prompt$ ps u
USER
PID %CPU %MEM
VSZ RSS TTY
STAT START
TIME COMMAND
knoppix
677 0.0 0.6 5424 2320 ttyp0
S
21:58
0:00 /bin/bash
knoppix
740 0.0 0.1 2488 760 ttyp0
R
21:59
0:00 ps u
prompt$ ps -ef
...

A continuaci es descriu el significat dalgunes daquestes columnes:


PID identificador del procs. s un nombre enter.
TTY terminal associat al procs. Al directori /dev hi trobareu el un fitxer amb
aquest nom (en aquest cas /dev/ttyp0) que us permetr accedir al terminal.
TIME: indica el temps de CPU que porta consumit el procs.
CMD: comanda responsable de la creaci del procs.
USER/UID: usuari propietari del procs (pot aparixer en format numric).
PPID: identificador del procs pare. Tot procs Unix s fill d'algun altre procs.
SZ/VSZ/RSS : diferents formes de mesurar la memria ocupada pel procs.
STIME: instant en qu es va iniciar l'execuci del procs.

-7-

Universitat Oberta de Catalunya

Intrpret de comandes Unix

Una altra possibilitat per veure els processos que hi ha a la mquina s utilitzar la
comanda top. Aquesta comanda mostra peridicament informaci del nombre de
processos existents, l'ocupaci global de la memria i quins sn els processos que
estan fent ms s del processador. Per acabar l'execuci de top cal prmer la tecla q.
Eliminaci de processos: comanda kill
Si voleu eliminar un procs immediatament, podeu utilitzar la comanda kill; cal
parametrizar-la amb -9 i el pid del procs a matar.

MODALITATS D'EXECUCI DE COMANDES


Per defecte, un cop llegida una comanda, l'intrpret de comandes no torna a mostrar el
prompt fins que la comanda hagi finalitzat la seva execuci. Aquesta forma d'executar
les comandes rep el nom de foregrund (en primer pla).
Els intrprets de comandes tamb permeten iniciar l'execuci d'una comanda de forma
que el prompt es mostri abans que la comanda finalitzi la seva execuci. Aquesta forma
d'executar les comandes rep el nom d'execuci en background (en segon pla). A Unix,
podeu executar comandes en background utilitzant el metacarcter &.
A mode d'exemple, inicialment s'invoca la comanda nedit en foreground. Podeu veure
que el shell no est disponible fins que sortim de leditor. En canvi, desprs sinvoca
nedit en background (metacarcter &), per tant, el shell est disponible inmediatament.
prompt$ nedit
<- El shell no est disponible fins que sortim de leditor
prompt$ nedit &
[1] 1665
prompt$ ps
...
prompt$
...
[1] Done nedit

<- El shell passa a estar disponible i podem editar

Els nombres que apareixen a l'iniciar l'execuci d'una comanda en background


representen un identificador de comanda i l'identificador de procs. Quan la comanda en
background finalitza la seva execuci, apareix un missatge indicant-ho (Done).
Canvi de modalitat d'execuci d'una comanda
El segent diagrama mostra com canviar el mode d'execuci d'una comanda. Per aturar
una comanda que s'executi en foreground cal prmer les tecles Ctrl i Z (prement Ctrl i C
provocarem la finalitzaci de la comanda, tot i que algunes comandes sn immunes al
Ctrl-C). La resta de transicions s'efectuen mitjanant comandes.
Foreground

fg

Background

Ctrl-C

fg

Destrucci
Ctrl-Z

Aturat
(Stopped)

-8-

bg

Destrucci

kill -9 pid

Universitat Oberta de Catalunya

Intrpret de comandes Unix

REDIRECCI D'ENTRADA/SORTIDA
A Unix, els processos no llegeixen directament del teclat ni escriuen directament a
pantalla, sin que ho fan sobre uns dispositius intermitjos anomenats entrada estndar
(stdin) i sortida estndar (stdout). Per defecte, aquests dispositius intermitjos fan
referncia al teclat i a la pantalla respectivament, per des de l'intrpret de comandes
podeu modificar aquesta associaci (redireccionar els canals estndar).
El metacarcter < permet redireccionar l'entrada estndar a un fitxer; anlogament, el
metacarcter > permet redireccionar la sortida estndar a un fitxer. El metacarcter >>
afegeix la sortida estndar al contingut actual dun fitxer.
A mode d'exemple, podeu executar la comanda ls redireccionant la seva sortida
estndar al fitxer tmp i desprs executar la comanda wc (compta el nombre de
carcters, paraules i lnies) fent que la seva entrada estndar sigui tmp.
prompt$ ls /bin > tmp
propmpt% ls
... tmp ...
prompt$ wc < tmp
93
93
555
prompt$

Els missatges derror de les comandes no sescriuen a la sortida estndar sin que
sescriuen a un dispositiu anomenat canal derror (stderr). Per defecte, aquest dispositiu
est associat a la pantalla per el podem redireccionar al fitxer que vulgueu amb els
metacarcters 2>. Per exemple, ls
KKKK mostra un missatge derror;
ls KKKK 2> err
redirecciona
el
missatge
al
fitxer
err;
finalment,
ls -l KKKK 2> /dev/null es desf del missatge derror ja que /dev/null s un
dispositiu que actua com una paperera: fa desaparixer tota la informaci que hi enviem.
Com a Unix tots els dispositius estan presents al sistema de fitxers (al directori /dev),
podeu redireccionar la sortida estndar d'una comanda cap al fitxer que representa un
terminal qualsevol. Proveu-ho obrint dos intrprets de comandes i executeu comandes
des d'un d'ells tot redireccionant la sortida cap al fitxer que representa el terminal de
laltre (repasseu el significat del camp TTY mostrat per ps).

COMUNICACI DE PROCESSOS MITJANANT PIPES


L'intrpret de comandes permet executar concurrentment dos o ms processos facilitant
que es comuniquin. Per fer-ho cal utilitzar el metacarcter |, que indica que volem
comunicar la sortida estndar d'un procs amb l'entrada estndar d'un altre; s a dir, tot
el que un procs escrigui per la seva sortida estndar anir a parar a l'entrada estndar
de laltre. Per tant, executant ls /bin | wc aconseguireu un resultat similar al
resultat obtingut a l'exemple anterior.
Utilitzant aquest metacarcter, podem combinar vries comandes senzilles i aconseguir
resultats complexos. Les comandes que acostumen a combinar-se utilitzant pipes tamb
sn conegudes com filtres; totes elles llegeixen les seves dades d'entrada de l'entrada

-9-

Universitat Oberta de Catalunya

Intrpret de comandes Unix

estndar i escriuen el seu resultat per la sortida estndar. Al mdul 3 es descriu el


funcionament dels filtres ms tpics.

VARIABLES D'ENTORN
Els intrprets de comandes permeten definir un seguit de variables i assignar valors a
aquestes variables. Les variables sn de tipus alfanumric.
Els programes poden consultar el valor de les variables i, en funci d'aquests, poden
modificar el seu comportament. Per exemple, acostuma a existir una variable
anomenada TERM que indica el tipus de terminal que esteu utilitzant. En funci del valor
d'aquesta variable, un programa pot presentar els seus resultats de forma ms o menys
sofisticada (per exemple, utilitzant colors,...).
Per veure totes les variables definides actualment podeu utilitzar la comanda set. Si
voleu veure el valor d'una nica variable podeu utilitzar la comanda echo i el
metacarcter $ (indica que fem referncia a una variable). Per exemple, echo $TERM
Per definir o modificar el valor duna variable cal fer servir loperador =. Per exemple:
prompt$ a=hola; echo $a Assigna a la variable a la paraula hola. Fixeu-vos
que no ha d'haver cap espai entre el nom de la variable, el signe = i el valor assignat.
El metacarcter ; s un separador de comandes (s equivalent a executar la primera
comanda i a continuaci la segona comanda).
prompt$ b=(pri seg ter); echo ${b[*]}; echo ${b[1]} Inicialitza la
variable b com un vector. El primer echo mostra el contingut sencer del vector i el
segon mostra el contingut del segon element (la primera posici del vector s la 0).
A continuaci es detalla el significat d'algunes de les variables ms usuals:
PATH: Cont la llista de directoris on el shell busca els fitxers executables
corresponents a les comandes. La bsqueda es realitza en lordre com els
directoris estan emmagatzemats a la variable; la bsqueda finalitza en el moment
que es troba un directori que contingui l'executable; si no s'en troba cap, el shell
mostra un missatge d'error com ara Command not found. Per afegir un directori a
aquesta llista podeu executar PATH=$PATH:nou_directori
TERM: Indica el tipus del terminal en s, per exemple vt100, xterm,...
HOME: Cont el directori d'usuari. s consultada per la comanda cd quan
l'executem sense parmetre; cd canvia al directori indicat per aquesta variable.
Consideracions finals sobre variables
s habitual que cada cop que entrem al sistema ens interessi que determinades
variables tinguin un valor diferent al valor per defecte. Per realitzar aquests canvis
automticament podem aprofitar el fitxer ~/.bashrc. Les comandes presents a
aquest fitxer sexecuten automticament cada cop que iniciem un intrpret de
comandes bash.
Si voleu que les variables que definiu siguin heretades pels processos creats des
del shell, cal utilitzar la comanda export. Consulteu el manual del sistema
(comanda man).

- 10 -

Universitat Oberta de Catalunya

Intrpret de comandes Unix

Per esborrar una variable cal utilitzar la comanda unset.

PER ANAR PRACTICANT


1.-Llisteu tots els processos que t en execuci l'usuari root.
2.-Utilitzant el camp PPID mostrat per la comanda ps, obtingueu tota la genealogia del
procs que executa el vostre intrpret de comandes.
3.-Interpreteu el significat de la informaci mostrada per la comanda top.
4.-Entreu al manual de la mquina (per exemple, man ps) i premeu les tecles Ctlr-Z.
Qu ha passat? Feu el necessari per continuar la consulta del manual.
5.-Podria haver alguna diferncia entre executar les comandes ps i /bin/ps ?

- 11 -

Universitat Oberta de Catalunya

Intrpret de comandes Unix

MDUL 3: ALGUNES COMANDES USUALS


Lobjectiu del mdul s presentar algunes de les comandes ms usuals de Unix amb
exemples del seu s. Consulteu el manual per veure ms possibilitats de les comandes.

FILTRES
Els filtres sn comandes que acostumen a rebre dades per lentrada estndar,
processar-les i escriure el resultat per la seva sortida estndar. Els filtres acostumen a
estar comunicats amb altres comandes mitjanant pipes. Es presenten exemples ds
daquests filtres; s aconsellable executar-los pas a pas per veure lefecte de cada filtre.
more
Mostra per pgines les dades rebudes per lentrada estndar. Prement la barra despai
podeu avanar una pgina i prement q podeu finalitzar lexecuci de more. Exemple:
prompt$ ls -l /bin | more
sort
Ordena les lnies dun fitxer dentrada segons el criteri que indiquem. Podem ordenar
alfabticament o numricament, ascendentment o descendentment, definir la part de la
lnia que sha de considerar per ordenar,... Exemples:
prompt$
sort
/etc/passwd
Mostra per stdout el resultat dordenar
alfabticament el fitxer /etc/passwd considerant el contingut sencer de la lnia.
prompt$ sort -t: -k3 -n /etc/passwd Mostra el resultat dordenar
numricament (parmetre -n) pel tercer camp (parmetre -k3), considerant que el
carcter separador de camps s : (parmetre -t:). Proveu-la tamb sense el -n.
prompt$ ls -l /etc | sort -k5 -n -r | more Ordena el resultat de
ls -l /etc pel cinqu camp (la mida del fitxer) descendentment (parmetre -r).
Fem servir el separador de camps per defecte (un o ms espais en blanc).
cut
Selecciona una porci de totes les lnies dun fitxer dentrada. Podem especificar la
porci de la lnia com a un rang de carcters o com a un rang de camps. Exemples:
prompt$ cut -d: -f3,5 /etc/passwd
Mostra el tercer i el cinqu camp de
totes les lnies de /etc/passwd considerant que el separador de camps s :
(parmetre -d). Fixeu-vos que lespecificaci del separador difereix respecte sort.
prompt$ date | cut -c12-19
Mostra nicament lhora actual (estem
seleccionant el rang de carcters entre la columna 12 i la 19).
head
Selecciona les primeres lnies o els primers carcters dun fitxer. Exemple:
prompt$ sort /etc/passwd | head -2 | cut -d: -f1 Mostra els dos
primers identificadors dusuari (alfabticament parlant) de la mquina.

- 12 -

Universitat Oberta de Catalunya

Intrpret de comandes Unix

tail
Selecciona les darreres lnies o els darrers carcters dun fitxer. Exemple:
prompt$ ls -l /etc | sort -k5 -n | tail -2 Mostra els dos fitxers ms
grans de /etc.
tr
Fa una traducci carcter a carcter de lentrada estndar. Exemples:
prompt$ tr aeiou AEIOU </etc/passwd Mostra el resultat de substituir les
vocals minscules per majscules de /etc/passwd. El primer parmetre (aeiou)
sn els carcters a substituir; el segon per quins substituir-los (correspondncia u a u).
prompt$ ls -l / | tr -s ' ' Mostra el resultat de ls -l separant els
diferents camps per un nic espai en blanc (la comanda tr est substituint totes les
aparicions consecutives de lespai en blanc per un nic espai en blanc).
grep
Mostra les lnies que continguin una o vries cadenes de carcters a unes posicions
determinades. La comanda grep disposa dun seguit de metacarcters per a especificar
les cadenes de carcters; cal no confondrels amb els del shell. Exemples:
prompt$ grep ro /etc/passwd Mostra les lnies de /etc/passwd que
contenen ro a qualsevol posici
prompt$ ls -l /etc | grep ^d Mostra les lnies retornades per ls que
comencen per d (metacarcter ^), s a dir, mostra els directoris de /etc.
prompt$ ls -l /etc | grep ^-......r-x Mostra les lnies retornades per ls
que comencen per -, continuen amb 6 carcters qualsevol (metacarcter .) i
continuen amb els carcters r-x.
prompt$ grep bash$ /etc/passwd Mostra les lnies del fitxer /etc/passwd
que acaben amb bash (metacarcter $).
prompt$ grep -v /bin/bash /etc/passwd Mostra les lnies del fitxer
/etc/passwd que no contenen (parmetre -v) la paraula /bin/bash.
prompt$ grep ^n[aeiou] /etc/passwd Mostra les lnies de /etc/passwd
que comencen per na, ne, ni, no o nu (els metacarcters [] especifiquen rangs).
wc
Compta el nombre de lnies, paraules i carcters dun fitxer. Exemples:
prompt$ wc -c /etc/passwd
Mostra el nombre de carcters (parmetre -c)
de /etc/passwd.
prompt$ ls -l / | grep ^d | wc -l
Mostra el nombre de lnies (parmetre
-l) retornades per ls -l /|grep ^d, que s el nombre de directoris de /.
uniq
Compacta en una lnia totes les lnies repetides i consecutives. Exemple:
prompt$ ps -e | cut -c25- | sort | uniq -c Per a cada comanda en
execuci, mostra el nombre de processos que lestan executant

- 13 -

Universitat Oberta de Catalunya

Intrpret de comandes Unix

Altres filtres: sed i awk


Dos dels filtres ms potents sn sed i awk. Descriure en detall el seu funcionament est
fora dels objectius daquest document.
sed: per cada lnia de lentrada estndar, pot realitzar substituci de carcters,
eliminaci de paraules, intercanvi de paraules, eliminaci de lnies,...
awk: per cada lnia de lentrada estndar executa un programa escrit en un
llenguatge semblant a C.

ALTRES COMANDES
find
Busca fitxers que compleixin una determinada condici. Exemples:
prompt$ find / -user root -perm 555 -type f 2> /dev/null Mostra
els fitxers ordinaris (parmetre -type f) de lusuari root (-user root) que tinguin
proteccions r-xr-xr-x (-perm 555); aquests fitxers es busquen al directori /
(primer parmetre) i els seus descendents. Per no mostrar els missatges derror
produts a lexaminar directoris protegits, el canal derror ha estat redireccionat.
prompt$ find /bin -follow -size +100k
Mostra els fitxers de /bin amb
mida superior a 100 Kbytes.
diff
Mostra les diferncies entre dos fitxers.
date
Mostra la data actual del sistema.
which / type
Mostren el nom absolut del fitxer executable corresponent a una comanda. Exemples:
prompt$ which top; type ls

PER ANAR PRACTICANT


1.-Escriviu una comanda que mostri per el nom del segon fitxer ms gran de /etc.
2.-Escriviu una comanda que mostri els 5 processos que estan consumint ms
memria.
3.-Escriviu una comanda que digui quants processos estan executant la comanda bash.
4.-Escriviu una comanda que indiqui el nombre de fitxers ocults del directori actual.
5.-Escriviu una comanda que mostri el nombre dusuaris que tenen un identificador que
comena per m.

- 14 -

Universitat Oberta de Catalunya

Intrpret de comandes Unix

MDUL 4: PROGRAMACI DE SHELLSCRIPTS


Lobjectiu daquest mdul s explicar els fonaments de la programaci de shellscripts
sobre lintrpret de comandes bash. Els shellscripts dexemple als que es fa referncia
en aquest mdul estan disponibles a la prestatgeria virtual de lassignatura.

INTRODUCCI
Tots els intrprets de comandes incorporen un llenguatge de programaci amb
sentncies de control de fluxe, assignaci de variables, funcions,... Els usuaris poden
escriure programes (shellscripts) utilitzant aquest llenguatge i aix automatizar lexecuci
de seqncies de comandes. Els shellscripts seran interpretats pel shell.
Per crear un shellscript invocareu a un editor de textos i escriureu el codi corresponent.
La primera lnia ha de ser #!/bin/bash (indica el shell que interpretar el programa) i
podeu introduir lnies de comentari amb el carcter #. Un cop gravat, heu dactivar el
perms dexecuci del shellscript amb la comanda chmod 700 nom_script, i ara ja el
podeu executar utilitzant el nom del shellscript.
Per buscar informaci al manual del sistema sobre les sentncies prpies del bash
relacionades la programaci de shellscripts heu dexecutar man bash.

COMANDES QUE ACOSTUMEN A ESTAR PRESENTS A SHELLSCRIPTS


A continuaci es descriuen algunes comandes que acostumen a estar presents als
shellscripts, tot i que tamb poden executar-se fora dels shellscripts.
sleep
Atura lexecuci del shellscript durant el nombre de segons indicat com a parmetre.
prompt$ sleep 5 Retorna el control passats 5 segons
echo
Mostra un missatge per la sortida estndar. Permet imprimir el valor de les variables.
prompt$ echo Hola Mostra un missatge
prompt$ echo Valor de home: $HOME Mostra el contingut de la variable HOME
prompt$ echo -n Sense salt de lnia No mostra salt de lnia (parmetre -n)
prompt$ echo -e "\ta\t" El parmetre -e activa la interpretaci de carcters
especials (com ara el \t, que representa el tabulador).
test
Avalua condicions respecte un arxiu (si existeix, si s llegible, si s modificable, si s de
tipus directori,...), respecte a cadenes de carcters (si sn iguals,...) o numriques
(igualtat, desigualtat, major que, major o igual que,...). test no escriu res per la sortida
estndar, per t un codi dacabament (que s accessible amb la variable del shell ?)

- 15 -

Universitat Oberta de Catalunya

Intrpret de comandes Unix

que s 0 si la condici s certa i un valor diferent de 0 si la condici s falsa (noteu que


s el conveni contrari al utilitzat al llenguatge C). Consulteu el manual per veure totes les
opcions. Exemples (s necessari respectar els espais entre els parmetres):
prompt$ test -d /bin; echo $? Escriu 0 perqu /bin s un directori
prompt$ test -w /bin; echo $? Escriu 1 perqu no podem escriure a /bin.
prompt$ test hola = adeu; echo $? Escriu 1 perqu les cadenes sn diferents
prompt$ test 4 -gt 5; echo $? Escriu 1 perqu 4 no s ms gran que 5
prompt$ test 3 -ne 6; echo $? Escriu 0 perqu 3 no s igual a 6.
prompt$ test 3 -gt 2 -a 5 -lt 7; echo $? Escriu 0 perqu es compleixen
ambdues condicions (parmetre -a indica funci and). El parmetre -o avaluaria la
funci or i el parmetre ! avaluaria la funci not.
expr
Avalua una expressi aritmtica i mostra el resultat per la sortida estndar. Exemples:
prompt$ expr 3 + 4 Mostra un 7 com a resultat. Observeu que s precs que
existeixi algun espai en blanc entre els operands i loperador.
prompt$ expr 3 \* 4 Mostra un 12. Observeu que s precs protegir loperador *
amb el metacarcter \ perqu el shell no substitueixi * pels fitxers del directori actual
(ls del metacarcter \ sexplicar ms endavant).
read
Permet llegir una lnia de lentrada estndar i guardar-la a una variable. Tamb permet
guardar les paraules que composen la lnia a variables diferents. Exemples:
prompt$ read lin; echo L: $lin Carrega la lnia llegida a la variable lin
prompt$ read word1 word2; echo L1: $word1; echo L2: $word2 Carrega
la primera paraula llegida a word1; la segona paraula (i la resta, si s que nhi ha) s
guardaran a word2.
exit
Finalitza lexecuci del shellscript.
true/false
Comandes que es fan servir per generar les condicions de control dels bucles infinits.

COMETES
El shell disposa de tres metacarcters de tipus cometa:
Cometes simples (' '): Indiquen que cal interpretar literalment la cadena que hi
ha entre les cometes (s a dir, sense expandir metacarcters, sense interpretar
els espais en blanc com a separadors,...). Per interpretar literalment un carcter
tamb es pot utilitzar el metacarcter \.
Cometes dobles (" "): Difereixen de les anteriors en qu nicament permeten
interpretar el metacarcter $ per remplaar el valor de les variables.

- 16 -

Universitat Oberta de Catalunya

Intrpret de comandes Unix

Cometes inverses (` `): Indiquen que cal executar la comanda que hi ha entre
les cometes i utilitzar el resultat de lexecuci com a parmetre duna altra
comanda. Aquestes cometes permeten interpretar el metacarcter $.
Exemples:
prompt$ echo $PATH *; echo '$PATH *'; echo "$PATH *"
Al primer cas
mostra el valor de la variable PATH i la llista de fitxers del directori actual. Al segon
mostra la cadena literalment. Al tercer nicament substitueix el valor de PATH.
prompt$ ls -l `which sort` Utilitzem el resultat dexecutar la comanda
which sort com a parmetre del ls.
prompt$ echo \*; echo * Mostra com \ inhibeix lexpansi del metacarcter *

VARIABLES
Respasseu el que es va explicar sobre les variables al final del mdul 2.

CONTROL DE FLUXE
A continuaci es descriuen les estructures de control de fluxe del bash.
if
La sintaxi daquesta sentncia s:
if condici1
then
sentncies1
[ elif condicio2
then
sentncies2 ]
...
[ else
sentncies3 ]
fi

Aquesta sentncia avalua la condici. Si s certa executa sentncies1; si s falsa i


condici2 s certa, executa sentncies2,...; si totes les condicions sn falses,
executa sentncies3.
A condici tindrem una o ms comandes i, en funci del codi dacabament de la
darrera daquestes comandes, es decidir si la condici es compleix o no (repasseu la
comanda test). Les formes tpiques de generar les condicions sn:
La comanda test
La comanda grep (retorna cert si ha trobat la paraula).
La resta de comandes acostumen a retornar cert si han pogut fer correctament la
seva tasca i fals en cas derror. En cas de dubte, consulteu el manual del sistema
de la comanda i busqueu on es parli dels codis dacabament (return codes).
Si indiqueu vries comandes comunicades mitjanant pipes, es fa servir el valor
retornat per la darrera comanda.

- 17 -

Universitat Oberta de Catalunya

Intrpret de comandes Unix

A sentncia podem posar qualsevol comanda disponible al sistema. Com a


referncia, podeu analitzar el shellscript dexemple if.sh8.
while/until
La sintaxi daquestes sentncies s:
while condici
do
sentncies
done

until condici
do
sentncies
done

La sentncia while avalua la condici. Si el seu resultat s cert, executa les


sentncies de linterior de bucle i torna a iterar; si s falsa, surt del bucle. La sentncia
until itera mentre la condici savalu com a falsa. La condici es genera de la
mateixa forma que la condici de la sentncia if. Com a referncia, podeu analitzar els
shellscripts dexemple while.sh i until.sh
for
La sintaxi daquesta sentncia s:
for variable in llista_valors
do
sentncies
done

La sentncia for itera sobre cadascun dels elements de llista_valors i executa les
sentncies existents a linterior del bucle. A cada iteraci, variable pren el valor de
lelement corresponent de llista_valors.
llista_valors es pot generar de moltes formes. Algunes de les ms tpiques sn:
* per iterar sobre els noms de fitxer del directori actual
comanda per iterar sobre cada paraula mostrada per lexecuci de comanda
$* per iterar sobre els parmetres del shellscript (explicat ms endavant)
Com a referncia, podeu analitzar el shellscript dexemple for.sh
case
La sintaxi daquesta sentncia s:
case paraula in
patr1) sentncies1 ;;
patr2) sentncies2 ;;
...
patrN) sentnciesN ;;
esac

La sentncia case busca quin s el primer patr corresponent a paraula i executa les
sentncies associades al patr.
8.Els exemples estan disponibles a la prestatgeria virtual de lassignatura.

- 18 -

Universitat Oberta de Catalunya

Intrpret de comandes Unix

La forma ms tpica de generar paraula s fent un accs a variable. Per especificar


patr podem fer servir metacarcters: per exemple a* s el patr corresponent a
paraules que comencen per a, el patr a*|b* correspon a paraules que comencen per
a o per b, el patr * correspon a totes les paraules (acostuma a posar-se com a darrer
patr per tractar el cas que una paraula no coincideixi amb cap dels patrons anteriors).
Com a referncia, podeu analitzar el shellscript dexemple case.sh
Comentaris finals respecte les sentncies de control de fluxe
Dins dels bucles for, while i until poden utilitzar les sentncies break (fa sortir del
bucle) i continue (fa que es comenci a executar la segent iteraci).
s possible redireccionar lentrada estndar i/o la sortida estndar duna sentncia de
tipus for, while i until. Aquesta redirecci afecta a totes les comandes executades
dins del bucle. Com a exemple, fixeu-vos en el bucle while de la soluci proposada al
problema de comptar (comptar.sh).
Oblidar alguna de les paraules clau duna sentncia de control de fluxe (com ara done)
o no tancar una cometa, pot provocar lerror dexecuci Unexpected EOF.

PAS DARGUMENTS ALS SHELLSCRIPTS


Quan invoquem un shellscript podem passar-li arguments. Per accedir-hi cal considerar:
$# permet obtenir el nombre de parmetres del shellscript.
$* cont la llista de tots els parmetres del shellscript.
El primer parmetre s accessible amb $1, el segon amb $2,..., el nov amb $9.
Si el shellscript t ms de 9 parmetres, per accedir als segents cal executar la
comanda shift. Aquest comanda descarta el valor de $1, mou el valor de $2 a
$1, el de $3 a $2,..., el de $9 a $8, i posa el valor del primer parmetre no
accessible a $9. Aquesta comanda actualitza el valor de $# i $*. Lefecte de la
comanda shift no pot ser desfet.
La variable $0 sempre cont el nom del shellscript.
Quan un shellscript espera arguments, s aconsellable comprovar que el valor de $# s
lesperat. Com a referncia, podeu analitzar el shellscript dexemple args.sh

GESTI DE SENYALS (SIGNALS)


Els processos Unix poden rebre senyals (signals) generats pel propi sistema operatiu o
per altres processos. Aquest senyals interrompen lexecuci del procs i, per defecte,
provoquen lacabament de lexecuci del procs. Aquests senyals estan associats a
locurrncia alguns esdeveniments (que lusuari premi Ctrl-C, un accs a memria
il.legal,...) o a lexecuci de la comanda kill sobre aquest procs.
La sentncia trap permet definir les comandes que shan dexecutar quan un shellscript
rep un senyal. La sintaxi de la sentncia s trap 'comandes' senyals. Exemple:
trap "echo Interromput per Ctlr-C; rm $fitxer_temporal; exit" 2 .
Un shellscript que hagus executat aquesta lnia respondria al Ctrl-C (senyal 2)
imprimint un missatge, esborrant el fitxer temporal i acabant lexecuci del shellscript.
Com a referncia, podeu analitzar el shellscript dexemple trap.sh

- 19 -

Universitat Oberta de Catalunya

Intrpret de comandes Unix

RESPOSTES A ALGUNES QESTIONS PLANTEJADES


Observaci: La majoria daquestes qestions admeten diverses respostes vlides.

MDUL 1: SISTEMA DE FITXERS


2.- cd; mkdir prova; cd prova; cp /bin/ls ls2
3.- cd /; cp /etc/passd ~/prova
4.- Esborra els fitxers del directori que passem com a parmetre.

MDUL 2: GESTI DE PROCESSOS


1.- ps -u root
4.- Hem susps lexecuci de lintrpret de comandes. Per continuar-la cal executar la
comanda fg
5.- Dependr del valor de la variable PATH. Aquesta variable indica els directoris on el
shell buscar lexecutable ps quan no indiquen el nom absolut de la comanda.

MDUL 3: ALGUNES COMANDES USUALS


1.- ls -l /etc | sort -n -k5 | tail -2 | head -1 | cut -c61Ordenem el llistat per mida, seleccionem les dos darreres lnies (els dos fitxers ms
grans) i desprs seleccionem la primera (el segon fitxer ms gran). Finalment, ens
quedem amb el nom del fitxer.
2.- ps hu -e | sort -k4 -r | head -5
Llistem tots els processos sense la lnia de capalera, ordenem per la columna que
mostra el percentatge de memria i ens quedem amb les 5 primeres lnies.
3.- ps -ef | grep /bin/bash | wc -l
Llistem tots els processos i busquem les lnies que contenen /bin/bash. Finalment, les
comptem.
4.- ls -a |grep ^. | wc -l
Llistem tots els fitxers i ens quedem amb els que sn ocults. Finalment, els comptem.
5.- grep ^m /etc/passwd | wc -l
Seleccionem les lnies que comencen per m i les comptem.

- 20 -

You might also like