Professional Documents
Culture Documents
Shell Cat
Shell Cat
COMANDES UNIX
Enric Morancho
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.
-1-
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.
..
bin
boot
cdrom
dev
etc
home
KNOPPIX
lib
mnt
opt
proc
ramdisk
root
sbin
tmp
usr
var
-2-
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
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-
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$
<<<<<<<<-
-4-
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-
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.
-6-
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
...
-7-
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.
fg
Background
Ctrl-C
fg
Destrucci
Ctrl-Z
Aturat
(Stopped)
-8-
bg
Destrucci
kill -9 pid
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).
-9-
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 -
- 11 -
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 -
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 -
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
- 14 -
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.
- 15 -
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 -
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
- 17 -
until condici
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 -
- 19 -
- 20 -