UNIX, Shell y Scripts

Anuncio
UNIX,
Shell y Sripts
Franiso Rosales Gar
a
Departamento de Arquitetura y Tenolog
a de Sistemas Inform
atios
Faultad de Inform
atia
Universidad Polit
enia de Madrid
Febrero 2003
Indie General
1 El Entorno
UNIX
1
2 Uso del Shell
15
3 Programaion de Sripts
27
i
ii
Cap
tulo 1
El Entorno
UNIX
En este apartado intentaremos haernos una idea de uales son las araterstias y los
oneptos basios que se manejan en el entorno UNIX.
>Que es UNIX?
Es sin lugar a dudas uno de los sistemas operativos mas extensos y potentes que hay. Sus
prinipales virtudes son:
Multiusuario En una maquina UNIX pueden estar trabajando simultaneamente muhos
usuarios. Cada usuario tendra la impresion de que el sistema es suyo en exlusiva.
Multiproeso Cada usuario puede estar ejeutando simultaneamente muhos proesos.
Cada proeso se ejeuta independientemente de los demas omo si fuese el unio
en el sistema. Todos los proesos de todos los usuarios son ejeutados onurrentemente sobre la misma maquina, de forma que sus ejeuiones avanzan de forma
independiente. Pero tambien podran omuniarse entre si.
Multiplataforma El nuleo del sistema operativo UNIX esta esrito en mas de un 95%
en lenguaje C. Graias a ello ha sido portado a maquinas de todos los tama~nos y
arquiteturas. Los programas desarrollados para una maquina UNIX pueden ser
llevados a ualquier otra failmente.
<Como es UNIX!
Desde el punto de vista del usuario, hay que resaltar las siguientes araterstias:
Sensible al tipo de letra. Distingue entre mayusulas y minusulas . No es lo mismo
unix que Unix que UNIX.
Fiheros de onguraion textuales. Para failitar su ediion sin neesidad de herramientas sostiadas.
Para usuarios NO torpes. Otros Sistemas Operativos someten ada aion \peligrosa"
(Ej. reesribir un hero) al onsentimiento del usuario.
En UNIX, por defeto, se entiende que el usuario sabe lo que quiere, y lo que el
usuario pide, se hae, sea peligroso o no.
1
!!
Lo borrado es irreuperable. Es un ejemplo del punto anterior. Hay que tener uidado. Como veremos mas adelante existe la posibilidad de que el usuario se proteja de
s mismo en este tipo de mandatos.
<Como es Linux!
POSIX. Es una version de
Interfae.
UNIX que umple el estandar Portable Operating System
Libre. Se distribuye bajo lienia GNU, lo que implia que se debe distribuir on todo
su odigo fuente, para que si alguien lo desea, lo pueda modiar a su antojo o
neesidad.
Evoluiona. Por ser libre, esta en permanente desarrollo y mejora, por programadores
voluntarios de todo el mundo.
Gratis. Al inreble preio de 0 euros.
Contenidos
En este aptulo se presenta el entorno UNIX desde el punto de vista de un usuario del
mismo. El objetivo es que el usuario se sienta mnimamente onfortable en UNIX.
Veremos, en este orden:
1. Usuarios y Grupos
2. Sesion
3. Mandatos
4. Proesos
5. Arbol
de Fiheros
6. Desriptores de hero
7. Interprete de mandatos
8. Conguraion
9. Xwindows
2
1.1 Usuarios y Grupos
Para que una persona pueda utilizar un determinado sistema UNIX debe haber sido
previamente dado de alta omo usuario del mismo, es deir, debe tener abierta una uenta
en el sistema.
Usuario
Todo usuario registrado en el sistema se identia ante el on un nombre de usuario (login
name) que es unio. Cada uenta esta protegida por una ontrase~na (password) que el
usuario ha de introduir para aeder a su uenta. Internamente el sistema identia a
ada usuario on un numero unio denominado UID (User Identier).
Grupo
Para que la administraion de los usuarios sea mas omoda estos son organizados en
grupos. Al igual que los usuarios, los grupos estan identiados en el sistema por un
nombre y por un numero (GID) unios. Cada usuario pertenee al menos a un grupo.
Privilegios
Las operaiones que un usuario podra realizar en el sistema estaran delimitadas en funion
de su identidad, esto es por la pareja UID-GID, as omo por los permisos de aeso al
hero o reurso al que desee aeder.
Superusuario
De entre todos los usuarios, existe uno, denominado \superusuario" o root que es el enargado de administrar y ongurar el sistema.
Es aquel que tiene omo UID el numero 0 (ero). El superusuario no tiene restriiones
de ningun tipo. Puede haer y deshaer lo que quiera, ver modiar o borrar a su antojo.
Ser superusuario es una labor deliada y de responsabilidad.
La administraion de un sistema UNIX es ompleja y exige amplios onoimientos del
mismo.
1.2 Sesion
Una sesion es el periodo de tiempo que un usuario esta utilizando el sistema. Como sabemos, ada usuario tiene una uenta que estara protegida por una ontrase~na o password.
Ahora siga los siguientes pasos para entrar y salir del sistema.
§
login: myname
¦
§
T 1.1
¥
Para entrar al sistema introduza su nombre de usuario o login name.
passwd: *******
¦
¤
¤
T 1.2
¥
Si ya ha puesto una ontrase~na debera usted introduirla ahora, para que el sistema
verique que usted es quien die ser.
3
¤
§
prompt> ¥
¦
Al entrar en el sistema se arrana un programa que nos servira de interprete de
mandatos. Nos presenta un mensaje de apremio.
§
T 1.4
logout
¦
¤
¥
£
Para terminar una sesion debera usar este mandato o bien ¢exit ¡.
1.3 Mandatos
Todos los sistemas operativos tienen mandatos que failitan el uso del sistema. Su forma
general es:
mandato [opiones℄ [argumentos...℄
Los ampos estan separados por uno o mas espaios. Algo entre orhetes [ ℄ es
opional. La notaion ... india uno o varios. Las opiones generalmente omenzaran
por un - (menos).
A lo largo de esta presentai
on se ir
a soliitando que usted realie numerosas
pr
atias, observe el omportamiento del sistema o onteste preguntas...
p
Ahora debe usted entrar en el sistema omo se indio en el apartado anterior.
T 1.5
UNIX distingue entre mayusulas y minusulas.
T 1.6
!!
Observe que
T 1.7
?
Conteste, >sabra usted terminar la sesion?
...en muhos asos se sugerir
a que ejeute iertos mandatos...
£
T 1.8
¢who
am i ¡
Obtenga informaion sobre usted mismo.
£
T 1.9
¢date ¡
Conoza la feha y hora.
£
T 1.10
¢al ¡
Visualie un alendario del mes atual.
...se dar
an m
as expliaiones para ampliar sus onoimientos...
La mayora de los mandatos reonoen las opiones -h o --help omo petiion de
ayuda sobre el mismo.
...y se soliitar
a que realie m
as pratias...
£
T 1.11
T 1.12
¢date
?
-h ¡
Aprenda que opiones admite este mandato.
>Que da de la semana fue el da en que usted naio?
...as
mismo, durante esta presentai
on iremos introduiendo un resumen de
algunos mandatos que se onsideran m
as importantes.
Si desea informaion ompleta sobre algo, debera usar el mandato man.
4
T 1.3
man [what℄
Manual Pages
Visualiza una opia eletronia de los manuales del sistema. Es seguro que nos asaltara
a menudo la duda de omo usar orretamente algun mandato o ualquier otra osa.
Deberemos onsultar el manual.
Los manuales se dividen en seiones:
1 Mandatos (Ej. sh, man, at).
2 Llamadas al sistema (Ej. open, umask).
3 Funiones de librera (Ej. printf, fopen).
4 Dispositivos (Ej. null).
5 Formato de heros (Ej. passwd).
6 Juegos.
7 Miselanea.
8 Mandatos de Administraion del Sistema.
£
¢man
-h ¡
£
¢man
man ¡
T 1.13
Busque ayuda breve sobre el mandato man.
T 1.14
Lea la doumentaion ompleta del mandato man.
§
¤
¦
¥
man [1-8℄ intro
En aso de onito, si ejemplo existe en diferentes seiones la misma hoja de
manual, debera expliitar la seion en la que busar.
La hoja intro de ada seion informa de los ontenidos de la misma.
Algunos mandatos utiles
A ontinuaion se itan algunos de los muhsimos mandatos disponibles en UNIX. Si
neesita mas informaion sobre alguno de ellos, onsulte el manual.
pwd Visualizaion del diretorio atual de trabajo.
d Cambio del diretorio atual de trabajo.
mkdir Creaion de diretorios.
rmdir Eliminaion de diretorios.
eho Muestra el texto que se indique por su salida.
env Muestra el valor de las variables de entorno.
ls Listado del ontenido de un diretorio.
at Visualizaion del ontenido de un hero.
5
T 1.15
pio Un senillo editor de heros.
vi El editor de heros mas extendido en entorno UNIX.
emas El editor de heros mas potente disponible.
rm Eliminaion de hero.
p Copiar heros.
mv Mover o renombrar heros.
w Contar las palabras y lneas de un hero.
grep B
usqueda de una palabra en un texto.
sort Ordenaion de heros.
find B
usqueda de heros que umplen determinadas araterstias.
hmod Cambio de los permisos de un hero.
sleep Simplemente espera que transurra los segundos indiados.
id Muestra la identidad del usuario que lo ejeuta.
1.4 Proesos
Cando usted invoa un mandato, el hero ejeutable del mismo nombre es ejeutado.
Todo programa en ejeuion es un proeso. Todo proeso de identia por un numero
unio en el sistema, denominado PID (Proess Identier).
Conurrenia
En todo momento, ada proeso ativo de ada usuario del sistema, esta ompitiendo on
los demas por ejeutar. El sistema operativo es el que mara a quien le toa el turno en
ada momento.
Todo esto suede muy muy deprisa, on el resultado de que ada proeso avanza en su
ejeuion sin notar la presenia de los demas, omo si fuera el unio proeso del sistema,
pero en realidad todos estan avanzando simultaneamente. A esta idea se le denomina
onurrenia.
T 1.16
T 1.17
£
¢
¡
ps
Permite ver una instantanea de los proesos en el sistema. Admite multitud de
opiones.
§
¤
¦
¥
top
Permite observar la atividad de los proesos en el sistema on ierta periodiidad.
6
Jerarqua de proesos
Todos los proesos del sistema se organizan en una jerarqua padre{hijo(s) que tiene omo
anestro ultimo al proeso denominado init uyo PID es 1.
Todo proeso tiene tambien asoiado un numero que identia a su proeso padre, es
el PPID.
§
¤
¦
¥
pstree
Permite ver una instantanea de la jerarqua de proesos en el sistema. Admite
multitud de opiones.
1.5 Arbol
de Fiheros
Existe una unia estrutura jerarquia de nombres de hero, es deir, no existe el
onepto de \unidad". En UNIX los dispositivos se \montan".
Diretorio raz
La raz de la jerarquia de nombres es el denominado diretorio raz y se denota on el
arater / (dividido por) no por el \ (bakslash).
Diretorio HOME
Nada mas entrar en el sistema, el usuario es situado en el denominado diretorio HOME
de su uenta.
Cada uenta tiene su propio HOME, que es reado por el administrador del sistema
al abrirle la uenta al usuario.
Este diretorio pertenee al usuario orrespondiente. Por debajo de el podra rear
uantos subdiretorios o heros quiera.
Tipos de objeto
Para averiguar que es o que hay ontenido bajo un nombre de hero puede usar el mandato
file.
Existen (basiamente) 3 tipos de \objetos", a saber:
Diretorios: Es un ontenedor uyas entradas se reeren a otros heros y/o diretorios.
El uso de los diretorios da lugar a la jerarqua de nombres. Todo diretorio ontiene
siempre las siguientes dos entradas:
. (punto) Se reere al mismo diretorio que la ontiene.
.. (punto punto) Se reere al diretorio padre de este, es deir, a su padre en la
jerarqua.
Fiheros normales: Estan ontenidos en los diretorios. Contienen seuenias de bytes
que podran ser odigos de programas, datos, texto, un fuente en C o ualquier otra
osa.
7
T 1.18
Fiheros espeiales: Son omo heros normales, pero no ontienen datos, sino que son
el interfaz de aeso a los dispositivos periferios tales omo impresoras, disos, el
raton, et, et.
Cada dispositivo, existente o posible, se haya representado por un hero espeial
que se enuentra bajo el diretorio /dev.
UNIX trata estos heros espeiales (y por lo tanto a los dispositivos) exatamente
igual que trata a los heros normales, de forma y manera que para los programas,
los unos y los otros son indistinguibles.
pwd
Print Working Diretory
Permite averiguar ual es el diretorio en que nos enontramos en ada momento, al ual
denominamos diretorio atual de trabajo.
T 1.19
§
¤
¦
¥
pwd
T 1.20
!!
T 1.21
!!
Visualie su diretorio atual de trabajo.
Observe que se muestra el amino absoluto (desde el diretorio raz) de su diretorio
HOME.
Observe que las omponente de un amino se separan entre s on el arater /
(dividido por) y no por el \ (bakslash).
d [dir℄
Change Diretory
Con este mandato ambiamos de un diretorio a otro. Admite omo argumento el nombre
del diretorio al que queremos ambiar.
Existen tres asos espeiales que son de utilidad.
£
¢d
£
¡
Invoado sin argumento, nos devuelve diretamente a nuestro HOME.
¢d . ¡
El diretorio de nombre . (punto) hae referenia siempre al diretorio atual de
trabajo. Realmente no nos va a ambiar de diretorio.
§
¤
¦
¥
pwd
T 1.22
Observe que permaneemos en el mismo diretorio.
Como veremos mas adelante, el diretorio . resulta util para referirnos a heros
que \estan aqu mismo".
£
¢d .. ¡
Todo diretorio ontiene siempre una entrada de nombre .. (punto punto) que hae
referenia siempre al diretorio padre del diretorio atual.
T 1.23
§
¤
¦
¥
pwd
Observe que asendemos al diretorio padre.
8
£
¢d .. ¡
T 1.24
Repita la operaion hasta llegar al raz.
§
¤
pwd ¥
T 1.25
¦
£
¢d ¡
Observe que no se puede ir mas alla del diretorio raz.
T 1.26
>A que diretorio hemos ido?
ls [-opt℄ [dirs...℄
List Diretory Contents
Este mandato nos presenta informaion sobre los heros y diretorios ontenidos en el(os)
diretorio(s) espeiado(s).
Si no se india ningun diretorio, informa sobre el diretorio atual de trabajo.
Este mandato admite antidad de opiones que onguran la informaion obtenida.
Entre ellas las mas usadas son, por este orden:
-l Formato \largo". Una lnea por hero o diretorio on los ampos: permisos, propie-
tario, grupo, tama~no, feha y nombre.
-a Informa tambien sobre los nombres que omienzan por . (punto), que normalmente
no se muestran.
-R Desiende reursivamente por ada subdiretorio enontrado informando sobre sus
ontenidos.
Si neesita explorar mas opiones, onsulte el manual.
£
¢ls ¡
£
¢ls
£
Pero no lo esta. Al menos siempre apareera las entradas . y ...
£
T 1.28
Es posible que aparezan otros nombres que on ¢ls ¡no vio.
Este mandato evita mostrar aquellas entradas que omienzan por el arater punto.
Podramos deir que los heros o diretorios uyo nombre omienza por un punto
estan "oultos", pero se pueden ver si usamos la opion -a.
Suelen ser heros (o diretorios) de onguraion.
T 1.29
-la ¡
T 1.30
Si queremos onoer los detalles del "objeto\ asoiado a ada entrada de un diretorio, usaremos la opion -l.
?
§
HOME paree estar vao.
-a ¡
!!
¢ls
Observe que su diretorio
T 1.27
>A quien perteneen los heros que hay en su
>Que tama~no tienen?
>Cuando fueron modiados por ultima vez?
HOME?
T 1.31
¤
ls /home ¥
¦
Observe el HOME de otros usuarios de su sistema.
Inspeione el ontenido de sus diretorios.
9
T 1.32
¤
§
ls -la / ¥
¦
Muestra el \trono" del arbol de nombres.
£
T 1.34
¢man
Lea una desripion ompleta de la jerarqua del sistema de heros UNIX que esta
usando.
¤
§
T 1.35
7 hier ¡
ls -??? /bin ¥
¦
Obtenga el ontenido del diretorio /bin ordenado de menor a mayor el tama~no de
los heros.
T 1.36
!!
Observe que aparee un hero de nombre ls. Ese es el hero que usted esta
ejeutando ada vez que usa el mandato ls.
Esos heros son solo una parte de los usted podra ejeutar, hay muhos mas.
T 1.37
?
>A quien pertenee el hero /bin/ls?
T 1.38
!!
Sus permisos permiten que usted lo ejeute.
1.6 Desriptores de hero
Los proesos manejan heros a traves de los denominados desriptores de hero. Por
ejemplo, el resultado de abrir un hero es un desriptor. Las posteriores operaiones de
manejo (letura, esritura, et.) de este hero reiben omo parametro el desriptor.
Desde el punto de vista de nuestro programa, un desriptor no es mas que un numero
entero positivo (0, 1, 2, ...).
Desriptores estandar
Los tres primeros desriptores de hero son los denominados \estandar", y se onsidera
que siempre estan disponibles para ser usados.
Normalmente estaran asoiados al terminal pero podran estar asoiados a un hero
o a ualquier otro objeto del sistema de heros, pero este es un detalle que no ha de
preouparnos a la hora de programar.
Los programas que se omporten de forma \estandar" los utilizaran adeuadamente.
Entrada estandar. Es la entrada prinipal al programa. Los programas que se omportan de forma estandar reiben los datos que han de proesar leyendo de su entrada
estandar (desriptor de hero numero 0).
Salida estandar. Es la salida prinipal del programa. Los programas que se omportan
de forma estandar emiten sus resultados esribiendo en su salida estandar (desriptor
de hero numero 1).
Error estandar. Es la salida para los mensajes de error del programa. Si un programa
que se omporta de forma estandar ha de emitir un mensaje de error debera haerlo
a traves de su error estandar (desriptor de hero numero 2).
10
T 1.33
1.7 Interprete de mandatos
La interaion del usuario on el sistema UNIX puede ser a traves de un interfaz grao,
pero lo mas omun es que sea a traves de un interfaz textual, esto es, a traves del dialogo
on un interprete de mandatos.
En UNIX se denomina shell (onha) al interprete de mandatos, esto es, el programa
apaz de interpretar y poner en ejeuion los mandatos que el usuario telea. No existe
un unio shell sino muhos.
¤
§
ls -l /bin/*sh ¥
¦
T 1.39
Los heros que apareen son los diferentes shell disponibles. Quizas apareza algun
otro hero. Quizas aparezan enlaes simbolios (otro tipo de objeto del sistema de
heros).
Se distinguen fundamentalmente en la sintaxis que reonoen y en las failidades que
proporionan para su uso interativo y para usarlos omo lenguaje de programaion de
\guiones" de mandatos (sripts).
sh Es el denominado Bourne Shell. Es el primer shell que se desarrollo para
es el preferido para la programaion de sripts.
UNIX, y
sh El "C"shell. Se llama as porque la sintaxis que reonoe se aproxima a la del lenguaje
C. Tambien es uno de los primeros shell desarrollados para UNIX, y se ha preferido
para uso interativo.
bash Bourne Again Shell, es una version mas evoluionada del sh, mas apta para el uso
interativo.
tsh Version mejorada del sh, on mas failidades para el uso interativo omo ompletar
nombres de hero y ediion de lnea de mandatos.
otros Existen otros muhos: ksh, zsh, r, et. (para gustos, olores).
Los mas omunes para uso interativo son el tsh y el bash.
Ya hemos estado usando el shell, de heho que si esta usted en su uenta, entones
esta usted ejeutando uno de ellos en este momento.
1.8 Variables de entorno
Ademas de los argumentos que indiamos en su invoaion, ada mandato que ejeutemos reibira una serie de parejas "nombre=valor", que son las denominadas variables de
entorno.
Las variables de entorno son pasadas de proeso padre a proeso hijo por un meanismo
de herenia.
Las variables del entorno se utilizan para ongurar iertos omportamientos de los
proesos. Por poner algunos ejemplos itaremos las siguientes:
HOME
Su valor es el nombre del diretorio raz de nuestra uenta en el sistema.
11
!!
PATH
Enumera un onjunto de diretorios donde se loalizara los ejeutables que invoquemos.
TERM India el nombre o tipo del terminal que estemos usando.
USER India el nombre del usuario que somos.
SHELL Es el nombre ompleto del interprete de mandatos que estemos usando.
Existen otras muhas mas variables de entorno, y podramos situar en el entorno
ualquier otra informaion que sea de nuestro interes.
Podremos visualizar las variables de entorno existentes haiendo uso del mandato env.
Variable de entorno PATH
Para entender el omportamiento del shell es onveniente profundizar en la mision de la
variable de entorno PATH.
Cuando le pedimos al shell que ejeute un mandato, este lo busara en los diretorios
indiados en la variable de entorno PATH y solo en ellos. Es onveniente que la variable
PATH se reera al menos a los diretorios mas omunes, esto es, /bin, /usr/bin y
/usr/loal/bin.
Por razones de seguridad, es altamente reomendable que el diretorio atual "." NO este inluido en la variable PATH.
1.9 Fiheros de texto ejeutables
Si un hero de texto tiene permisos de ejeuion (man hmod) y su primera lnea reza
#! ejeutable , podremos ejeutar diretamente este hero, y su ontenido sera ledo he
interpretado por el ejeutable. De esta manera podemos rear nuestros propios heros
de mandatos ejeutables, que denominamos \guiones" (sripts).
p
T 1.40
Esriba un hero uya primera lnea sea #! /bin/at , y luego a~nada las lneas
de texto de desee. Dele permisos de ejeuion y ejeutelo.
Como podra observar, un hero de texto ejeutable no tiene porque estar neesariamente asoiado a un shell, sino que puede asoiarse a ualquier mandato que haga uso de
su entrada estandar.
Ademas en la primera lnea podemos a~nadir opiones del mandato (una opion omo
maximo, aunque puede ser ompuesta).
p
T 1.41
Modique el hero anterior para que al ser ejeutado uente las lneas y las palabras
de s mismo, pero no los arateres. Para ello onsulte el manual sobre el mandato
w.
Este meanismo, de heros de texto ejeutables nos permitira la realizaion de heros
de mandatos, que seran interpretados por el shell de nuestra eleion.
12
1.10 Xwindows
Hasta ahora hemos experimentado el uso de UNIX desde un interfaz textual, esto es, desde
un terminal. Existe un entorno grao muy potente
llamado
X windows o simplemente X.
£
Para arranarlo podemos usar el mandato ¢startx ¡.
13
14
Cap
tulo 2
Uso del Shell
En este apartado exploraremos el uso interativo del interprete de mandatos. Vamos a ver
algunas araterstias basias del shell que nos seran de muha utilidad.
El prompt
Cuando el usuario entra en su uenta a traves de un terminal, el sistema arrana un nuevo
interprete de mandatos asoiado a diho terminal. Un shell arranado de esta manera
esta en modo interativo y nos informara de ello mostrando en el terminal un prompt o
mensaje de apremio. Un shell esta a nuestro serviio.
En este doumento se muestran los dialogos on el shell de la siguiente manera:
¨
«
$
ª
El prompt sera el smbolo $.
©
2.1 Estado de terminaion
Todo mandato UNIX debe terminar devolviendo un valor que permita identiar su estado
de terminaion. Un valor distinto de 0 india que ourrio un error de algun tipo, mientras
que un valor 0 india que funiono omo se esperaba. En el aso del shell el mandato
interno exit permitira terminar indiando el valor de terminaion.
exit 0 # Terminaion orreta.
Se debe esribir odigo esperando que otros lo usen, por lo tanto, hay que asegurarse
de devolver un estado de terminaion signiativo.
2.2 Primer y segundo plano
Hasta ahora hemos venido arranando mandatos que \toman el ontrol del terminal"
hasta que terminan. Se die de ellos que ejeutan en primer plano (foreground). Podemos
soliitar la ejeuion de varios mandatos en primer plano invoando ada uno en una lnea
diferente, pero tambien podramos haerlo separandolos on el arater ';'.
§
¤
¦
¥
sleep 3; ls /; sleep 3; who
Observe omo se ejeuta un mandato despues del anterior en estrita seuenia.
15
T 2.1
En UNIX es posible soliitar la ejeuion de mandatos en segundo plano (bakground)
poniendo el arater & al nal de los mismos. El mandato se ejeutara en onurrenia
on otros mandatos que ejeutemos en primer o segundo plano a ontinuaion.
§
T 2.2
sleep 3 & ls / & sleep 3 & who &
¦
¤
¥
Observe omo se ejeutan onurrentemente y la salida de los mandatos se mezla.
2.3 Redireion
En UNIX podemos redirigir la entrada estandar, salida estandar y/o error estandar de
los mandatos.
Esta es una araterstia muy muy util, ya que, sin neesidad de modiar en absoluto
un mandato podemos usarlo para que tome su entrada de un hero en vez de tener que
telearla.
De igual manera en vez de que la salida del mandato apareza en la pantalla, podramos
enviarla a un hero para usarla on posterioridad.
La sintaxis orreta para realizar redireiones es a~nadir al nal del mandato la redireion on la siguiente notaion:
§
mandato < fihero
¦
¤
¥
En su ejeuion, el mandato usara fihero omo entrada, leera de el y no del telado.
§
mandato > fihero
¦
¤
¥
En su ejeuion, la salida del mandato sera enviada a fihero y no a la pantalla. Si
fihero no existiera on anterioridad, sera reado automatiamente, pero si existe,
sera previamente trunado a tama~no ero.
§
mandato >> fihero
¦
¤
¥
A~nade la salida del mandato al nal del hero indiado.
§
mandato 2> fihero
¦
¤
¥
Los mensajes de error que un mandato pueda generar tambien pueden ser redirigidos
a un hero, pero normalmente preferimos que se visualien por la pantalla.
£
¢mandato 2>&1 ¡
Redirige la salida de error a donde quiera que este dirigida la salida estandar.
p
T 2.3
Obtenga en un hero de nombre todos los fiheros un listado en formato largo
de todo el arbol de heros reorriendolo reursivamente desde el diretorio raz.
Dado que este mandato puede llevar un rato en ejeutar, lo arranamos en segundo
plano, para poder seguir realizando otros mandatos.
£
T 2.4
T 2.5
¢ls -l todos los fiheros ¡
Compruebe que tama~no del hero esta aumentando.
!!
Apareeran en pantalla solo los mensajes de error que el mandato produe al no
poder aeder a iertos diretorios.
16
¤
§
T 2.6
grep login name < todos los fiheros > mis fiheros
¦
¥
Use el mandato grep para ltrar las lneas del hero de entrada que ontienen el
texto indiado, en este aso su nombre de usuario. Deje el resultado en un hero
de nombre mis fiheros.
2.4 Seuenia
Pipeline
En UNIX podemos redirigir la salida estandar de un mandato diretamente a la entrada
estandar de otro. Con ello onstruimos seuenias de mandatos que proesan el resultado
del anterior y emiten su resultado para que sea proesado por el siguiente mandato de la
seuenia.
Esto lo onseguimos separando los mandatos on el arater \|" (pipe).
Esta es es una failidad muy poderosa de UNIX, ya que, sin neesidad de heros
intermedios de gran tama~no podemos proesar grandes antidades de informaion.
§
¤
¦
¥
ls -la /home | grep login name
T 2.7
Obtiene un listado en formato largo de todos los diretorios de uentas y ltra aquellas lneas que ontienen nuestro nombre de usuario.
!!
p
p
No se rea ningun hero intermedio.
T 2.8
Obtenga el listado \todos sus heros" de la seion anterior, onetando el resultado al mandato grep para quedarse solo on sus heros. Mande el resultado a
un nuevo hero de nombre MIS fiheros. Pongalo as, on mayusulas, para no
mahaar el hero nombrado as pero en minusulas.
T 2.9
Reuerde invoar el mandato on & para poder seguir haiendo otras osas.
Cuando hayan terminado de ejeutar los mandatos, ompruebe las diferenias entre
los heros de nombre mis fiheros y MIS fiheros. Para ello utilie el mandato
diff, onsultando el manual si es neesario.
T 2.10
Seuenias ondiionales
Es tambien posible separar mandatos o seuenias on los siguientes smbolos:
&& Soliitamos que el mandato o seuenia a la dereha del smbolo solo se ejeute si el
de la izquierda termino orretamente.
|| Soliitamos que el mandato o seuenia a la dereha del smbolo solo se ejeute si el
de la izquierda termino inorretamente.
£
o bien" ¡
¢true && eho "El anterior termin
T 2.11
¤
§
false || eho "El anterior termino mal" ¥
¦
17
T 2.12
2.5 Metaarateres
Los metaarateres (wildards) son arateres omodn. Con su uso podemos haer referenia a onjuntos de heros y/o diretorios, indiando la expresion regular que asa on
sus nombres.
? Comodn de arater individual.
* Comodn de tira de ero o mas arateres.
~ Abreviatura del diretorio home.
~user Abreviatura del diretorio home de user.
[ab℄ Casa on un arater del onjunto espeiado entre los orhetes.
[x-y℄ Casa on un arater en el rango espeiado entre los orhetes.
[^...℄ Niega la seleion indiada entre los orhetes.
fstr,. . . g Agrupai
on. Casa suesivamente ada tira.
p
Obtenga un listado en formato largo, de los heros de los diretorios /bin y
T 2.13
p
T 2.14
/usr/bin/ que ontengan en su nombre el texto sh.
Obtenga un listado en formato largo, de los heros del diretorio /dev que omienen por tty y no terminen en dgito.
2.6 Uso interativo
Un buen shell para uso interativo ofree serviios que le failitan la tarea al usuario. Esto
signia que existen multiples ombinaiones de telas asoiadas on alguna funionalidad
espeial. Para onoerlas ompletamente debera onsultar el manual.
Ediion de lnea
Podemos mover el ursor ( ) sobre la lnea de mandatos que estamos teleando on
! , borrar antes y sobre el ursor on Bakspae y Del , ir al iniio y al nal on Iniio
y Fin , et.
!!
T 2.15
Observe que pasa si intenta editar una lnea mas larga que la pantalla.
Historio de mandatos
Si hae poo que teleamos un mandato no es preiso volverlo a telear. Basta on busarlo
haiendo uso de las ehas del telado " y # .
El mandato interno history nos informa de todos los mandatos que hemos usado
ultimamente.
§
T 2.16
history
¦
¤
¥
Visualie los mandatos que hasta ahora ha realizado en su shell.
18
Observe que history guarda los mandatos anteriores de una sesion otra.
!!
T 2.17
£
¢!! ¡
£
T 2.18
Repite el ultimo mandato.
¢!5 ¡
T 2.19
Repite el mandato que oupa la posiion 5 en la historia.
Fin de datos
La ombinaion de telas Ctrl D en una lnea vaa india \n de datos".
Si la pulsamos y hay algun programa leyendo del terminal, entendera que no hay mas
datos y terminara normalmente.
£
¢at ¡
Es un mandato que lo que lee de su entrada lo esribe en su salida. Esriba varias
lneas de datos para observar su omportamiento.
Como esta leyendo del terminal, para que termine normalmente, debera indiarle
\n de datos".
§
T 2.20
¤
$
Ctrl
¦
D
T 2.21
¥
El shell tambien es un programa que lee de su entrada estandard. Indquele \n de
datos".
!!
El shell entendera que no hay mas datos, terminara normalmente y por lo tanto
nos saara de la uenta.
Si ha sido as y este omportamiento no le agrada, hay una forma de ongurar el
shell para evitar que sueda. Mas adelante la veremos.
Control de trabajos
En UNIX podemos arranar mandatos para que se ejeuten en segundo plano (bakground)
poniendo el arater & al nal de la lnea.
Tambien, desde su shell puede suspender el trabajo que esta en primer plano (foreground), rearranar trabajos suspendidos, dejarlos en segundo plano, matarlos, et.
Ctrl
C
Ctrl
Z
Pulsando esta ombinaion de telas uando tenemos un programa orriendo en
primer plano, le mandaremos una se~nal que "lo matara".
El programa en primer plano quedara suspendido y volveremos a ver el prompt del
shell.
§
¤
¦
¥
jobs Este mandato interno nos informa de los trabajos en urso y de su estado. Podremos
referirnos a uno onreto por la posiion que oupa en esta lista.
§
¤
¦
¥
§
¤
fg Ejeutandolo, el ultimo proeso suspendido volvera a primer plano. Para referirnos
§
¤
.
al segundo trabajo de la lista de trabajos usaremos ¦fg %2 ¥
bg Ejeutandolo, el u
ltimo proeso suspendido volvera a ejeutar, pero en segundo
¦ ¥
plano! Es omo si lo hubieramos arranado on un & detras.
19
T 2.22
£
nal a un proeso, on lo que, normal¢kill ¡ Este mandato interno permite enviarle una se~
p
T 2.23
p
T 2.24
?
T 2.25
mente, lo mataremos.
§
¤
Arranque varios proesos en bakground, por ejemplo varios ¦sleep 60 & ¥
, ya
ontinuaion onsulte los trabajos ativos.
£
Arranque un proeso en primer plano, por ejemplo ¢at ¡ y suspendalo. Consulte
los trabajos ativos. Vuelva a ponerlo en primer plano y luego mandele una se~nal
que lo mate.
>Como lo matara si se enuentra en segundo plano?
Completar nombres de hero
Si tenemos un nombre de hero esrito \a medias" y pulsamos el tabulador (7!), el tsh
intentara ompletar diho nombre. Si lo que pulsamos es la ombinaion Ctrl D , nos
mostrara la lista de nombres que empiezan omo el.
Tambien funiona para nombres de mandato.
p
T 2.26
£
§
Esriba ¢ls .s7! ¡y luego intente ls .s Ctrl
¦
¤
D
, observe la diferenia.
¥
Control de sroll de terminal
Denominamos terminal al onjunto pantalla/telado o a la ventana a traves de la ual
dialogamos on el shell.
Ctrl
S
Ctrl
Q
Congela el terminal. No mostrara nada de lo que nuestros programas esriban, ni
atendera a lo que teleemos.
Si por desuido pulsamos Ctrl S podramos pensar que el sistema se ha quedado
olgado, pero no es as.
Desongela el terminal. Lo que los programas hubiesen esrito mientras la pantalla
estuvo ongelada, as omo lo que hubiesemos teleado, apareera en este momento.
El uso omun de la pareja Ctrl S Ctrl Q es para ontrolar la salida de programas
que emiten muhas lneas.
¤
§
T 2.27
Ctrl
¦
S
Ctrl
ª
§
T 2.29
¨
Q
©
Vera omo el mandato que teleamos aparee y se ejeuta on normalidad.
¤
ls -laR / ¥
¦
El resultado de este mandato son demasiadas lneas de texto. Juegue on
Ctrl Q a parar y dejar orrer la pantalla.
¤
§
T 2.30
¥
Observe que, de momento, nada de lo que hemos teleado aparee en el terminal.
«
T 2.28
ls -la
Ctrl
¦
C
¥
Cuando se anse, mate el trabajo.
20
Ctrl
S
2.7 Algunos mandatos utiles
less [files...℄
On Sreen File Browser
Filtro para la visualizaion por pantalla de heros. Es una version mejorada del lasio
mandato more.
Si lo usamos indiando un onjunto de heros, podremos pasar al siguiente y al
anterior on :n y :p respetivamente.
Con este mandato solo podremos ver los heros, pero no modiarlos, mas adelante
veremos algun editor.
£
¢less
£
¢ls
* fiheros ¡
Visualie el ontenido de los heros que existen ya en su HOME que terminan por
\ heros".
T 2.31
*¡
T 2.32
Observe que el metaarater * no alude a los heros uyo nombre empieza por
punto.
passwd
Change User Password
UNIX protege el aeso a las uentas de los usuarios mediante una palabra lave.
Las uentas del sistema, sus ontrase~nas y resto de informaion, estan registradas en
el hero /et/passwd.
§
¤
¦
¥
less /et/passwd
Visualie el ontenido del hero de ontrase~nas.
Este hero ontiene la informaion sobre las uentas de usuario que hay en su
sistema.
Compruebe que existe una uenta on su nombre de usuario.
§
man 5 passwd
¦
T 2.33
¤
T 2.34
¥
Estudie ual es el ontenido del hero de ontrase~nas.
Un usuario puede ambiar su palabra lave haiendo uso del mandato passwd. Es
muy importante que la ontrase~na no sea trivial, ni una feha, ni una matrula de ohe,
telefono, nombre propio, et.
§
passwd
¦
¤
T 2.35
¥
<Si no tiene un buen password, ambielo ahora mismo!
p orig dest
Copy Files
Obtiene una opia de un hero o bien opia un onjunto de heros al diretorio indiado.
Admite variedad de opiones, que no vamos a desribir en este doumento (si tiene
dudas, onsulte el manual).
Interesa destaar que este es un mandato peligroso, dado que (por defeto) hae
lo que le pedimos sin onsultar, lo ual puede suponer que mahaquemos heros que ya
existan. Para que nos onsulte deberemos usarlo on la opion -i.
21
§
p /et/passwd ~
¦
T 2.37
Copie en su
!!
p
T 2.38
T 2.39
?
p
T 2.40
¤
T 2.36
¥
HOME
el hero /et/passwd.
Visualie que su ontenido es realmente una opia del original.
Copie el hero .shr sobre el que ahora tiene en su uenta on el nombre passwd.
>Le ha onsultado p antes de reesribir? >Se ha modiado el hero?
Intente las mismas operaiones usando la opion -i.
rm files...
Remove Files
Borrar heros. Para ver sus opiones onsulte el manual.
Tambien es un mandato peligroso. En este aso, rm no solo hae lo que le pedimos
sin onsultar, sino que en UNIX no existe manera de reuperar un hero (o diretorio) que haya sido borrado. Por lo tanto se hae impresindible usarlo on la opion
-i.
p
T 2.41
p
T 2.42
T 2.43
!!
p
T 2.44
T 2.45
?
§
¤
Intente borrar el hero passwd de su uenta on ¦rm -i passwd ¥
. Conteste que
no.
Borre el hero passwd que ahora tiene en su uenta.
Observe que efetivamente ha sido eliminado.
Intente borrar el hero /et/passwd.
>Puede haerlo? >Porque?
mv orig dest
Move (Rename) Files
Cambia el nombre de un hero o bien mueve un hero o onjunto de heros a un
diretorio.
Tambien es un mandato peligroso, porque podra \mahaar" el(os) hero de
destino sin pedirnos onrmaion. Se debe usar on la opion -i.
p
T 2.46
p
T 2.47
T 2.48
?
p
T 2.49
T 2.50
?
Intente mover el hero /et/passwd a su
HOME.
Intente mover algun hero de su uenta (uno que no le valga) al diretorio /et.
>Puede haer estas operaiones? >Porque?
Cambie de nombre al hero mis fiheros a MIS fiheros.
>Pudo haerlo? >Le onsulto?
22
mkdir dir
Make Diretory
Crea un nuevo diretorio. Por supuesto, si ya existe un hero o diretorio on diho
nombre dara un error.
Los diretorios que usted ree seran suyos. Solo podra rear heros o diretorios en
aquellos diretorios donde usted tenga permiso de esritura.
p
T 2.51
p
p
£
¢ls
Cree en su uenta un subdiretorio de nombre subarbol.
Visualie su ontenido on ls -la.
T 2.52
Cree otros subdiretorios mas profundos, pero sin haer uso del d.
T 2.53
-laR ~ ¡
Visualie el ontenido atual de su
T 2.54
HOME reursivamente.
rmdir dir
Remove Diretory
Borra un diretorio. Por supuesto el diretorio debe estar vao.
p
?
p
p
Intente borrar un diretorio no vao, Ej. subarbol.
T 2.55
>Puede haerlo?
T 2.56
Visualie el ontenido de subarbol.
T 2.57
Elimine los diretorios mas profundos, y vaya asendiendo, hasta onseguir eliminar
el diretorio subarbol.
2.8 Conguraion
Cada usuario puede ongurar el omportamiento de su uenta editando onvenientemente
iertos heros presentes en su HOME que dependen de que shell use usted.
El hero de onguraion que es de nuestro interes en este momento es:
.bashr Se ejeuta siempre que el usuario arrana un nuevo bash.
.shr Se ejeuta siempre que el usuario arrana un nuevo sh o tsh.
Dado que estos heros solo se leen al arranar el shell, para que los ambios que
hagamos en ellos tengan efeto, deberemos bien salir de la uenta y volver a entrar o bien
haer uso del mandato interno soure para que su shell lea e interprete el ontenido del
hero.
Mandatos peligrosos
En UNIX, si se borra un hero o un diretorio no hay forma de reuperarlo.
Ademas, los mandatos obedeen iegamente a quien los usa, y no onsultan. Para evitar
meter la pata es onveniente usar iertos mandatos de forma que onsulten antes de atuar.
Para ello, vamos a usar el mandato interno alias, para protegernos de los mandatos
problematios.
23
T 2.58
Fin de datos
Evitaremos que el shell termine a la pulsaion
£
T 2.59
pidiendole que lo ignore.
Ejeutando este mandato observara que alias estan en funionamiento.
Los alias modian \al vuelo" los mandatos que queremos ejeutar, justo antes de
ser nalmente ejeutados.
pio file
¦
¤
¥
Es un editor de uso muy senillo. Uselo
para realizar la siguiente modiaion en el
hero de onguraion de su shell.
Esoja entre la version de la izquierda, si usted usa el tsh o el sh, o la de la dereha
si usa el bash. A~nada al nal del hero de onguraion indiado las siguientes
lneas:
.bashr
.shr
alias p 'p -i'
alias mv 'mv -i'
alias rm 'rm -i'
set ignoreeof
T 2.61
D
¢alias ¡
§
T 2.60
Ctrl
alias p='p -i'
alias mv='mv -i'
alias rm='rm -i'
IGNOREEOF=10
£
¢soure ¡
Reuerde que debe pedirle a su shell que lea e interprete el ontenido del hero de
onguraion, para que tenga onstania de la modiaion que aaba de haer.
£
T 2.62
T 2.63
¢alias ¡
Observara si los alias que ha estableido estan en funionamiento.
Ctrl
D
Compruebe si esta seuenia hae terminar su shell.
24
2.9 Explorando el mandato ln
Con este mandato podremos rear \enlaes", esto es, rear otros nombres que se reeran
a un hero ( o diretorio) ya existente.
£
¢ln
£
¢ln
£
¢ls
... ¡
Cree un enlae fsio (hard link) del hero /et/passwd en su uenta.
-s ... ¡
T 2.65
Cree un enlae simbolio (symboli link) del hero /et/passwd en su uenta.
-l ¡
T 2.66
Observe los atributos (permisos, propietario, numero de enlaes, et.) de los enlaes
que aaba de rear.
!!
£
¢rm
T 2.64
>Tiene usted permiso para esribir sobre dihos enlaes? Intente esribir en ellos,
por ejemplo redirigiendo sobre ellos la salida de otro mandato.
... ¡
Ahora borre los enlaes que reo. >Puede haerlo? >Como es posible? De una
expliaion razonable.
T 2.67
T 2.68
2.10 Explorando el mandato find
Explore en profundidad las opiones de este mandato. Para ello onsulte el manual y
realie los siguientes ejeriios.
£
¢find ... -name ... ¡
£
¢find
£
¢find
£
¢find
£
¢find
§
... -ls ¡
T 2.70
Repita la operaion anterior, pero ahora obtenga un listado que detalle los atributos
de los heros enontrados.
... -mtime ... ¡
Loalie todos los heros del sistema que han sido modiados en los 3 ultimos das.
Guarde el resultado en un hero de nombre signiativo.
T 2.71
... -user ... ¡
T 2.72
Loalie todos los heros del sistema que le perteneen. Guarde el resultado en un
hero de nombre signiativo.
... -and ... ¡
Loalie todos los heros del sistema que han sido modiados en los 3 ultimos das
y le perteneen. Guarde el resultado en un hero de nombre signiativo.
find ... -type
¦
T 2.69
Loalie todos los heros del sistema uyo nombre termina en sh. Guarde el resultado en un hero de nombre signiativo.
NOTA: use omillas simples para evitar la expansion de los metaarateres.
T 2.73
¤
T 2.74
¥
Loalie todos los heros del sistema que no son hero ni diretorio ni hero
espeial (orientados a arater o a bloque). Guarde el resultado en un hero de
nombre signiativo.
25
2.11 Explorando el mandato sort
Explore en profundidad las opiones de este mandato. Para ello onsulte el manual y
realie los siguientes ejeriios.
£
T 2.75
¢ls -lRa ¡
T 2.76
¢sort
Obtenga un listado detallado de todos los heros de su uenta. Guarde el resultado
en un hero de nombre MIOS.
£
£
T 2.77
¢sort
£
T 2.78
¢ls
Ordene las lneas del hero MIOS, alfabetiamente.
... ¡
Ordene las lneas del hero MIOS, por tama~no del hero, de memor a mayor.
-S ... ¡
£
T 2.79
... ¡
¢sort
Intente obtener el mismo resultado usando diretamente el mandato ls.
... ¡
Ordene las lneas del hero MIOS, por feha del hero, del mas antiguo al mas
moderno.
2.12 Explorando seuenias de mandatos
¤
§
T 2.80
sort ... | head ... ¥
¦
Combine el mandato anterior on el mandato head en una seuenia para quedarnos
solo on las 4 primeras lneas.
¤
§
T 2.81
sort ... | tail ... ¥
¦
p
T 2.82
p
T 2.83
p
T 2.84
Combine el mandato anterior on el mandato tail en una seuenia para quedarnos
solo on las 4 ultimas lneas.
Combine los mandatos find, sort y head para omponer una seuenia de mandatos uyo resultado sea un listado que detalle los atributos de los 10 heros (no
diretorios) del sistema on mayor numero de enlaes.
De forma similar, y ombinando tambien el mandato ut omponga una seuenia
de mandatos uyo resultado sea solo en nombre de los 10 heros de tama~no mayor
en el sistema, uno por lnea.
De forma similar, omponga una seuenia de mandatos uyo resultado sea solo
en nombre de los 10 heros de mas antguos del sistema.
26
Cap
tulo 3
Programai
on de Sripts
En este apartado usaremos el Bourne Shell para programar heros de mandatos (sripts),
pero en oasiones, para probar un mandato omplejo o un sript senillo, lo usaremos de
forma interativa.
Simplemente ejeutaremos el mandato sh y este nos devolvera el arater $ que es
prompt araterstio del sh. Para salir de nuevo al sh pulsaremos Ctrl-D o bien usaremos
el mandato interno exit.
Ejemplo
userhostname>
userhostname> ps
PID TTY STAT TIME COMMAND
1154 p1 S
0:02 -sh
2556 p1 R
0:00 ps
userhostname> eho Mi PID es $$
Mi PID es 1154
userhostname> date
Thu Jul 30 18:20:37 CEST 1998
userhostname> who am i
hostname.domain!user ttyp1
Jul 30 11:23 (:0.0)
userhostname> sh
$
$ ps
PID TTY STAT TIME COMMAND
1154 p1 S
0:02 -sh
2561 p1 S
0:00 sh
2562 p1 R
0:00 ps
$ eho $$
2561
$ ^D
userhostname>
27
3.1 Comentarios
Tanto el programa en su onjunto omo ada una de sus partes o funiones deben estar
bien doumentados, a base de omentarios que lariquen que hae y omo lo hae.
Los omentarios son ualquier texto, omenzando on el arater almohadilla (#) y
terminando al nal de la lnea. Esto se ejeuta. # Esto no.
3.2 Variables y Entorno
El shell proporiona variables uyo valor son tiras de arateres. El nombre de una variable podra ontener letras, dgitos y el arater ' ', pero no puede empezar por ' '. Las
minusulas y las mayusulas se onsideran distintas.
Para dar valor a una variable esribiremos variable=valor , sin espaios en blano!
Para obtener el valor de una variable usaremos la notaion $variable o $fvariableg
si a ontinuaion del nombre de la variable viene letra o dgito.
El entorno es un subonjunto de las variables del shell que son heredadas por todo proeso derivado de este. Una variable puede ser a~nadida al onjunto de variables de entorno
on el mandato export variable . Las variables de entorno pueden ser visualizadas on
el mandato env.
Ejeriio 3.1.
Esriba el mandato identidad on el siguiente ontenido y ejeutelo:
#! /bin/sh
# identidad
# Identifia al usuario usando las variables de entorno.
eho Usted es el usuario \"$USER\".
Como podra observar el sh lee, interpreta y ejeuta el ontenido del hero. Este
peque~no programa hae uso ademas de la variable de entorno USER.
Ejeriio 3.2.
Ample el programa anterior para que visualie una desripion ompleta del usuario
y la maquina basandose en la informaion ontenida en el entorno.
3.2.1 Variable PATH
Cuando le pedimos al shell que ejeute un mandato, lo intentara enontrar entre sus
mandatos internos y entre las funiones que tengamos denidas. Si no se enuentra, lo
busara en el onjunto de diretorios indiados en la variable de entorno PATH y solo en
ellos.
Dado que un sript puede fallarle a alguna persona si tiene un PATH diferente o inompleto, se reomienda inluir en una orreta espeiaion de esta variable de entorno.
PATH=/usr/bin:/bin
Ejeriio 3.3.
Experimente on el siguiente mandato en PATH:
28
#!/bin/sh -x
# en_PATH
# Experimento sobre la variable PATH.
# El valor de esta variable afeta a la
# loalizaion de los mandatos que usamos.
PATH=""; ls # No se enuentra.
PATH=""; /bin/ls # SI se enuentra.
PATH=/bin; ls # SI se enuentra.
Observe que la opion -x del shell permite "depurar"nuestro programa.
3.2.2 Variables espeiales
La denominadas variables espeiales, no perteneen al entorno. Es el shell quien les da
valor.
$0 Nombre del sript.
$9 Parametro del sript o funion en la posiion indiada (1 a 9).
$# Numero de parametros posiionales o argumentos.
$* Lista de argumentos.
$ Lista de argumentos. Pero "$" no es una tira de arateres, sino opia exata de
la lista de argumentos
$$ Identiador del propio proeso shell.
$? Valor devuelto por el u
ltimo mandato ejeutado.
$! Identiador del ultimo proeso lanzado en segundo plano.
Ejeriio 3.4.
Codique el siguiente mandato argumentos que visualiza el valor de todas las variables espeiales relativas a los argumentos. Experimente la diferenia entre "$", $,
"$*" y $*.
#! /bin/sh
# argumentos args...
# Experimento sobre variables espeiales relativas a argumentos.
eho '"$"' vale "$", y si lo reorro obtengo:
for ARG in "$"; do eho __${ARG}__; done
eho '$' vale $, y si lo reorro obtengo:
for ARG in $; do eho __${ARG}__; done
eho '"$*"' vale "$*", y si lo reorro obtengo:
29
for ARG in "$*"; do eho __${ARG}__; done
eho '$*' vale $*, y si lo reorro obtengo:
for ARG in $*; do eho __${ARG}__; done
Ejeutelo on los siguientes argumentos.
argumentos 1 "Dos 2" "3 III" 'Cuatro ****'
Conteste >Donde y uando se expanden los omodines de 'Cuatro ****'?
Conteste >Porque es preisa la notaion $fARGg?
Ejeriio 3.5.
El mandato interno shift desplaza los parametros posiionales un lugar a la izquierda, perdiendose el antiguo valor de $1, que pasara a valer lo que vala $2, et. y
derementa $#.
A~nada al nal del mandato argumentos un ultimo reorrido del siguiente modo:
eho Y si voy desplazando los parametros on "shift" obtengo:
while [ $# -ne 0 ℄
# Equivalente a...
until test $# -eq 0
do
eho __${1}__
shift
done
3.3 El mandato test
Es uno de los mandatos mas usados en shell sripts, estudielo en profundidad puede serle
muy util man test . Puede ser un mandato interno del shell o ser un mandato externo.
ls -l /usr/bin/[ /usr/bin/test
Puede usarse de dos maneras: test expression o [ expression ℄ . Observe que
sus argumentos (as omo el arater ℄) deben estar onvenientemente separados por espaios.
Un buen shell sript debe veriar que los argumentos on los que ha sido invoado (si
es preiso alguno) son orretos, y si no lo son debe indiarle al usuario la forma orreta
de utilizaion. Para veriar el numero de argumentos usaremos el mandato test.
Ejeriio 3.6.
Ample el siguiente mandato test test para que realie todos los posibles test de uno
o dos argumentos.
#!/bin/sh
# test_test arg1 [arg2℄
# Usa el mandato test(1) de todas las formas posibles
# sobre 1 o 2 argumentos.
30
test_as_file()
{
for opt in b d e f g
do
test -$opt "$1" && : TRUE || : false
done
}
if [ $# -eq 2 ℄
then
set -x
# Ativamos el modo depuraion.
test_as_file "$1"
test_as_file "$2"
...
elif [ $# -eq 1 ℄
then
...
else
...
fi
Ejeutelo on. . . "" , /dev/onsole , . , 2 02 , "1 -lt 3" , et.
Conteste >$1 hae referenia al mismo parametro uando se usa en el programa prinipal
que uando se usa dentro de una funion?
Conteste >Porque es preisa la notaion entreomillada "$1"?
Conteste >Que signia la notaion mandato && mandato || mandato ?
Conteste : es un mandato interno. >Para que sirve? (man sh y busque :).
Conteste set es un mandato interno. >Para que sirve?
3.4 Funiones
Usando el Bourne Shell podemos haer uso de grupos de mandatos, agrupados entre llaves
'fg' all donde podramos haber usado un mandato simple.
Las funiones en Bourne Shell son simplemente el resultado de ponerle un nombre unio
a un onjunto de mandatos agrupados mediante llaves. Son una de las araterstias mas
poderosas del sh y es neesario aostumbrarse a usarlas.
funtion() {
# Conjunto de mandatos
# que implementan la funion
return 0 # terminaion orreta
}
En una funi
on los parametros posiionales $1, $2, et. son los argumentos de la
funion (no los argumentos del sript).
31
Una funi
on puede ser usada de igual modo que se puede usar un mandato externo.
Una funi
on devolvera su propio estado de terminaion usando la sentenia return.
Si se usa exit dentro de una funion, se estara terminando el sript ompleto, no
solo la funion.
return 0
# Terminaion orreta
Las funiones son ideales para enapsular una determinada labor. Se pueden redirigir
su entrada, salida o error, onetarlas por pipes, et.
Las funiones del Bourne Shell
pueden ser reursivas!
Ejeriio 3.7.
Esriba el mandato arbol que reiba omo argumentos una lista de heros y/o diretorios e imprima los nombres ompletos de ada hero y reorra ada diretorio
de forma reursiva en profundidad.
El resultado debe ser un nombre ompleto de hero por lnea, onvenientemente
endentado (on tabuladores) para indiar la profundidad de la reursion.
Utilie una funi
on reursiva de nombre sub arbol que reiba omo primer argumento una tira de tabuladores, omo segundo el nombre del diretorio que se
esta explorando en este momento y a ontinuaion ualquier numero de nombres de hero o diretorio a evaluar.
Para obtener el ontenido de un diretorio utilie `ls -A1 $DIR`.
3.5 Entrada, salida y error estandar
La entrada, salida y error estandar son los desriptores de hero 0, 1 y 2. Cada uno tiene
una mision onreta y deben ser usados onvenientemente.
Error Los mensajes de error deben apareer en el estandar error y no en la salida estandar.
eho Fihero de onfiguraion inexistente. >&2
A vees, por estetia, interesara sileniar posibles mensajes de error generados por
los mandatos que usamos. Lo onseguiremos dirigiendo la salida de error de diho
mandato a /dev/null.
expr $NUM 2> /dev/null || reintentar
Salida La salida estandar es para los mensajes que van dirigidos al usuario o a otros proesos.
eho -n "Desea rearlo?[s℄ "
Entrada La entrada estandar es para reoger la respuesta de los usuarios o la salida de otros
proesos.
read RESPUESTA
CWD=`pwd`
32
Interativo Es posible que la entrada estandar no este asoiada al terminal (haya sido redirigida)
y no haya un usuario al ual onsultar. Si es preiso nuestros programas pueden tener
esto en uenta y omportarse de forma distinta segun esten siendo usados de forma
interativa o no tty -s .
in-situ Podemos inorporar en nuestro propio sript el texto que queremos que sea la entrada
a un mandato.
at << 'Fin ayuda'
Las lneas de texto siguientes, hasta una que literalmente ree Fin ayuda seran la
entrada al mandato. Si la mara de "n de doumento in-situ"presenta algun quoting
el texto sera literal, si no seran expandidas las variables y los mandatos entre omillas
inversas.
Ejeriio 3.8.
Esriba el mandato reto que retara al usuario a que adivine un numero (por ejemplo
el PID del proeso). Para ello leera los valores numerios que el usuario telee y
respondera indiando si el numero sereto es mayor, menor o igual, en uyo aso
terminara.
Para omparar los valores numerios haga uso del mandato test.
El programa s
olo debe admitir ser usado de forma interativa.
El programa debe llamar al usuario por su nombre haiendo uso de la variable
USER.
Debe evitar morir si el usuario le manda una se~
nal desde telado. Para ello
apturara las se~nales SIGINT y SIGQUIT (man 7 signal) haiendo uso del
mandato interno trap.
Si el usuario responde al reto on Ctrl-D (n de datos), el programa pedir
a una
onrmaion positiva antes de terminar.
3.6 Manipulaion de tiras de arateres
Internamente el shell ofree poos meanismos para manipular tiras de arateres, si bien
siempre se puede haer uso de mandatos externos apaes de manipular heros de texto
de forma sostiada.
ase La sentenia ase permite loalizar patrones senillos en tiras de arateres. Se usa
por ejemplo para analizar los parametros de entrada de los shell sripts y reonoer
opiones.
ase $1 in
0) eho Cero ;;
1|2|3|4) eho Positivo ;;
-[1234℄) eho Negativo ;;
*.*) eho Deimal ;;
*) eho Otra osa ;;
esa
33
read El mandato interno read lee una lnea de su entrada estandar y asigna valor a las
variables que se le pasan omo argumentos. La lnea se divide por los arateres que
se onsideran separadores de ampo que normalmente son el tabulador y el espaio.
set El mandato interno set. Si le pasamos una lista de argumentos, los separa por los
arateres que se onsideran separadores de ampo y los asigna omo valores a los
parametros posiionales $1, $2, et. y atualiza $#.
Ademas, el mandato set sirve para ativar opiones del propio shell, omo el modo
depuraion, modo verbose, et. Consulte el manual.
IFS El onjunto de arateres que el shell onsidera separadores de ampo son los que
ontiene la variable de entorno IFS (Input Field Separator). Cambiando el valor de
esta variable podemos dividir lneas por los arateres que queramos.
IFS=':' read field 1 field 2 rest < file
IFS=', ' set "1,2,3,4 5.6"
Observe en el ejemplo anterior la forma de asignar valor a una variable en la misma
lnea en la que se invoa al mandato, sin separarlos por ;. Usando esta sintaxis la
modiaion del valor de la variable solo afeta a diha invoaion, y no es permanente.
Ejeriio 3.9.
Doumente adeuadamente el siguiente odigo. Para ello, onsulte el manual hasta
entender omo se onsigue el valor adeuado en ada aso.
#!/bin/sh -x
# hora
# Experimento manipulaion de tiras de arateres.
TIME=`date | ut -12-19`
TIME=`date | ut -d\ -f4`
TIME=`date | sed 's/.* .* .* \(.*\) .* .*/\1/'`
TIME=`date | awk '{print $4}'`
TIME=`set \`date\`; eho $4`
TIME=`date | (read u v w x y z; eho $x)`
TIME=`date +%T`
Ejeriio 3.10.
Esriba el mandato adivina que tendra que intentar adivinar el valor de un parametro
numerio que solo el usuario onoe, preguntandole osas que solo debe responder on
si o no.
El programa s
olo debe admitir ser usado de forma interativa.
El programa debe presentar un men
u de los oneptos que sabe adivinar (edad,
altura, et.) y leer la opion que el usuario seleione. Para identiar la opion
utilie la sentenia ase.
34
Esriba la funi
on auxiliar pregunta si que reiba omo argumentos el texto de
una pregunta, se lo presente al usuario, lea su respuesta (usando el mandato
interno read) y on un ase ompruebe si la respuesta es armativa. Si lo es
terminara bien, sino terminara mal.
Esriba la funi
on auxiliar diotoma que ontrole dos valores numerios menor
y mayor que representan un rango, y pregunte al usuario sobre el valor medio
del rango, de forma que se pueda reduir el rango a la mitad. Para alular el
valor medio utilie el mandato externo expr.
35
Descargar