Introducción a UNIX y su Estructura
Introducción a UNIX y su Estructura
Los objetivos que persiguieron los primeros diseñadores de UNIX fueron conseguir un
sistema operativo que permitiera un desarrollo eficiente de programas, que fuera pequeño y
eficiente en el uso de la memoria y fácil de mantener.
Los sistemas operativos, hasta la aparición de UNIX, estaban pensados para funcionar
únicamente en el sistema en que eran desarrollados. Esto implicaba un gran esfuerzo en
aprender un nuevo sistema operativo cada vez que se usaban sistemas distintos. Aplicaciones
que funcionaban en un sistema no estaban disponibles en otros e incluso los propios
programas requerían modificaciones para transportarlos a otro sistema.
Una de las razones que han hecho que UNIX haya alcanzado una gran popularidad es
resolver estos problemas, pues permite transportarlo fácilmente a diferentes sistemas. Esto se
consiguió diseñando el sistema operativo de forma que hiciera muy pocas suposiciones sobre
la arquitectura de la computadora y escribiendo la mayor parte del sistema operativo en un
lenguaje de alto nivel (C). Sólo una pequeña parte (el kernel) está escrito en lenguaje
ensamblador.
Actualmente UNIX puede ser usado desde pequeños ordenadores personales a grandes
computadoras. Así pues un programador puede encontrar las mismas herramientas de
programación, entornos similares y ejecutar fácilmente sus programas en cualquier sistema
que use UNIX.
1
COMPUTACIÓN III
1.2.1-Kernel
Puede considerarse como el núcleo del sistema operativo y es leido cada vez que se inicializa
el sistema. Realiza una serie de tareas básicas como son:
? Distribuir el trabajo realizado por la CPU de forma que sea lo más eficiente posible
1.2.2-Shell
La forma que el usuario tiene de acceder a los servicios del kernel es mediante la shell. Se
puede considerar como el interprete de comandos, que permite que los comandos y
programas que tecleamos sean ejecutados.
? C shell (csh)
? TC shell (tcsh)
Bourne shell. Es la original de UNIX y está disponible en todos los sistemas, sin embargo no
ofrece las facilidades de interacción con el usuario que ofrecen las shell más modernas.
C shell. Es la que tenemos normalmente cuando nos abren la cuenta en el IAC, (aunque
podemos pedir que nos pongan otra).
TC shell es similar a la anterior pero ofrece más facilidades para editar la línea de comandos
de forma interactiva. En lo que resta del curso supondremos que estamos trabajando con la
TC o C shell.
Korn shell y Bourne Again SHell proporcionan las facilidades de interacción de TC shell
pero el lenguaje de programación en shell es más parecido al original Bourne shell que a TC
o C shell.
2
COMPUTACIÓN III
En la tabla se muestra un resumen de las características más importantes de las distintas
shells.
________________________________________________________
* Esta opción no está puesta por defecto
Para cambiar de shell basta con teclear en la línea de comandos el nombre de la shell que
deseemos (sh, csh, tcsh, ksh o bash). Sin embargo no podemos cambiar la opción que
tenemos por defecto al entrar en la cuenta, si queremos cambiarla hay que pedirlo al
administrador del sistema.
Los directorios que cuelgan de root pueden variar dependiendo del sistema, aunque los
mostrados a cotinuación, sí son comunes a todos los sistemas UNIX.
3
COMPUTACIÓN III
/(root)
|
----------------------------------------------------
| | | | | | |
/bin /dev /etc /home /lib /tmp /usr
? /bin contiene comandos y utilidades, son ficheros ejecutables
? /dev contiene los ficheros que representan a los dispositivos conectados al sistema
? /usr contiene ficheros del sistema que son comunes a los usuarios como programas o
documentación.
El sistema UNIX permite tener muchos usuarios simultáneamente. Como usuario, cada uno
tiene un directorio home en el que se sitúa cuando se conecta al sistema. Una vez conectado
se puede cambiar de un directorio a otro indicando el nombre completo (pathname ) del
directorio al que queramos cambiar y utilizando el comando (cd). Ej: cd /usr/local/bin/ue. Si
queremos saber en qué directorio estamos basta con teclear (pwd) y el sistema nos devolverá
el nombre completo del directorio en el que nos encontramos. Todo fichero y directorio
pueden ser identificados por una lista completa de nombres de directorios, empezando en el
directorio raíz y terminando en el fichero o directorio deseado. Por ejemplo: /usr/local/bin/ue.
También se puede identificar un fichero o directorio por su localización en relación al
directorio en el que nos encontremos. Tomando como ejemplo el anterior fichero, si nos
encontramos en el directorio local, la localización del fichero `ue' en relación a este directorio
sería: bin/ue.
Ejemplos:
[comun@volvo /]$ ls -F -> Muestra el contenido indicando los ficheros con un *, los
4
COMPUTACIÓN III
directorios con una / y los links con @
bin/ datos/ export/ impresion lost+found/ opt/ sbin/ tmp/
boot/ dev/ fichero * floppy@ lib/ misc/ proc/ scratch@ usr/
cdrom@ etc/ home/ localsoft/ mnt/ root/ soft/ var/
1.3-Comandos y procesos
Cuando introducimos un comando, el sistema operativo ejecuta un programa. Mientras este
programa esté funcionando se le denomina proceso. Cada proceso generado en el sistema
tiene un número de identificación conocido como PID (proceso ID).
Los ficheros pueden clasificarse dentro de las siguientes categorías:
? Ficheros normales
? Directorios
? Ficheros especiales
? Pipes
Los ficheros normales pueden tener contenidos muy diferentes, por ejemplo texto, imágenes,
ejecutables, etc. Todos los ficheros tienen un propietario, los que creamos nosotros desde
nuestra cuenta nos pertenecen y cada propietario es el que puede controlar los permisos de
acceso a ese fichero.
Los directorios son ficheros que contienen referencias a otros ficheros. Aunque todos los
ficheros se encuentran dentro de algún directorio, no residen realmente dentro de él. El
directorio mantiene dos informaciones básicas sobre cada fichero contenido en él: El nombre
y un número llamado inode number que es un puntero que le indica al sistema donde
encontrar toda la información que necesita del fichero.
Los dispositivos especiales son ficheros que representan dispositivos físicos como
impresoras, dispositivos magnéticos, el ratón, etc. Se encuentran dentro del directorio /dev.
Por ejemplo, si la salida por pantalla de un programa no nos interesa podemos enviarla al
dispositivo /dev/ null que en realidad no tiene un dispositivo físico asociado, perdiendose de
esta forma la salida del progrma.
programa1 >/dev/null
Los pipes permiten enlazar la salida de un comando a la entrada de otro, esto se hace a través
de la creación de un fichero temporal donde se guarda la salida del primer programa hasta
que es leido por el segundo.
5
COMPUTACIÓN III
2.-Permisos de acceso a ficheros y directorios
Todos los ficheros y directorios de la cuenta de un usuario pueden estar accesibles o
protegidos a otros usuarios cambiando los permisos de acceso.
Cada usuario sólo puede cambiar los permisos de accesos de los ficheros y directorios que
han sido creados por él.
Para conocer los permisos de acceso de un fichero o directorio se utiliza el comando:
La primera parte de esta línea -rwxr-xr-x representa los permisos de acceso que tiene el
fichero o directorio.
r - lectura
w -escritura
x -ejecución
Cada uno de estos permisos se agrupan para dar acceso a tres tipos de usuarios:
Los permisos de accesos para estos tres tipos de usuarios vienen dados por una serie de nueve
caracteres:
6
COMPUTACIÓN III
Estos permisos tienen diferentes significados para ficheros y directorios:
Renombrar ficheros
Borrar f]icheros
Escribir un fichero
Ejecutar ficheros
También podemos cambiar el grupo al que pertenece un fichero propio siempre que
pertenezcamos al grupo al que queramos cambiarlo.
chgrp group file
Cuando entramos en la cuenta estamos en un grupo por defecto. Si queremos cambiar a otro
grupo al que pertenezcamos usamos el comando:
newgrp group
Para volver al grupo anterior tecleamos:
exit
7
COMPUTACIÓN III
2.3.-Cambio de los permisos de acceso
El mode consta de tres partes: a quién se cambia el permiso, cambio de los permisos y tipo de
permiso a cambiar:
-A quién se le cambia los permisos: Los permisos pueden ser aplicados a uno de los tres tipos
de usuarios (u, g, o).
-Cambio de los permisos: los permisos pueden ser agrupados para cada tipo de usuario de la
siguiente forma: + añnade un permiso, - quita un permiso, = asigna un permiso y reagrupa
los demás.
-Tipo de permiso a cambiar: lectura (r), escritura (w) o ejecución (x).
Ejemplos:
chmod
u+x Da permiso al usuario a ejecutar el fichero `file1'
file1
Chmod
Da permiso a todos los miembros del grupo a poner ficheros en el directorio `dir1' en
g+wx
el `home' del usuario, permitiendo además listar el contenido de este directorio.
~/dir1
r w x
4 2 1
8
COMPUTACIÓN III
Estos valores pueden ser sumados para hacer varios cambios en los permisos de los diferentes
usuarios:
1 sólo ejecución
2 sólo escritura
3 escritura + ejecución
4 sólo lectura
5 lectura + ejecución
6 lectura + escritura
7 lectura + lectura + ejecución
Por lo tanto, el cambio de permisos de acceso pueden expresarse por tres dígitos, por
ejemplo:
Una vez dentro de la cuenta utilizamos una terminal (por ejemplo una xterm) para ejecutar
los comandos.
Podemos empezar por cambiar el password que nos ha dado el administrador del sistema con
el comando:
nispasswd
que nos pedirá nuestro password anterior y el nuevo (lo pide dos veces para evitar errores).
La elección del password, por razones de seguridad, debe evitar palabras de diccionarios, es
conveniente mezclar números con letras o algún caracter especial.
La forma básica de un comando en UNIX es: command_name opciones argumento(s)
9
COMPUTACIÓN III
La descipción de muchos comandos viene dada en la ayuda del propio UNIX y utiliza una
sintaxis mucho más precisa:
Esta sintaxis tiene unas reglas simples. Aplicadas a la descripción del comando, se puede
entender cómo utilizar dicho comando.
. Las palabras en negrita deben aparecer literalmente. Esto se aplica generalmente a los
nombres de los comandos y a sus opciones.
. Los argumentos que aparecen en itálica deben ser reemplazados por lo que los
representan. Son generalmente el nombre de un fichero o directorio.
. Elipses '...' significa que el argumento anterior puede repetirse varias veces.
10
COMPUTACIÓN III
Un pequeño número de comandos requieres que las opciones le sean dadas por separado.
Consultar la sipnosis del comando para ver cómo se deben introducir las opciones.
Una opción que se aplica a un fichero, como el nombre de la impresora, se suele dar
separado.
Argumentos de un comando
Muchos comandos son utilizados con más de un argumento. Para algunos comandos, estos
argumentos son opcionales; otros requieren un argumento para poder funcionar.
Si el argumento contiene un espacio vacío, entonces se debe medir el tamaño del argumento.
Los comando son más efectivos cuando se utilizan expresiones regulares. Ejemplos:
dir ls -l
fgrep
11
COMPUTACIÓN III
change file protection attrib chmod
? NAME
? SYNOPSIS
? DESCRIPTION
? OPTIONS
? ENVIRONMENT
? EXAMPLES
? FILES
? SEE ALSO
? WARNINGS
12
COMPUTACIÓN III
? DIAGNOSTICS
? BUGS
Se nos muestra la página de ayuda sobre el comando man. En la sección SYNOPSIS se nos
muestra las distintas opciones que tiene el comando.
Utilizando la opción -k en el comando man y una palabra clave o frase entre comillas,
mostrará el nombre de todos los comandos que en la sección name incluyen esa palabra o
frase. Por ejemplo para buscar que comandos pueden servir para copiar ficheros:
man -k 'copy files'
Otra forma de consultar el manual es con el comando xman que nos abre una ventana donde
tendremos diferentes opciones. También podemos utilizar el comando answerbook que nos
abre un "navegador" donde podemos consultar diferentes documentos no sólo de UNIX.
ls
Nos muestra los ficheros contenidos en un directorio. Tiene varias opciones muy útiles como
-l para un formato largo con una serie de características de cada fichero. La opción -a muestra
los ficheros ocultos (ficheros que empiezan por el caracter .). Se puede ordenar la salida por
diferentes opciones como por fecha o alfabéticamente.
La información que nos muestra cuando empleamos la opción -l es:
? Una serie de 10 caracteres donde el primero nos informa del tipo de fichero que es y
los nueve restantes sobre los permisos que tiene el fichero.
? El propietario.
? El tamaño en bytes
? El nombre del fichero (si es un link simbólico se muestra también el fichero al que
hace referencia).
13
COMPUTACIÓN III
Este comando y otros como cp, rm, etc pueden usar una serie de caracteres llamados
"wildcards" que nos permiten seleccionar ficheros que siguen un cierto patrón en su nombre.
[...] Podemos poner dentro una lista de caracteres que son los posibles para un solo
caracter.
Ejemplos:
cp * ~/textos
Copia todos los ficheros del directorio actual al subdirectorio textos de mi home.
Si tenemos una serie de ficheros [Link] [Link] [Link] [Link], el comando
mv cap?.tex ~
ls b[Aa]*
Nos hará una lista de todos los ficheros cuya segunda letra sea una A o a y empiecen por
b.
En los corchetes puede incluirse un rango como por ejemplo [0-5] [a-z] [A-Z], que
respectivamente significan cualquier número del 0 al 5, cualquier letra minúscula y
cualquier letra mayúscula.
mkdir
Nos crea un nuevo directorio.
rmdir
Borra un directorio.
14
COMPUTACIÓN III
cd
Cambia de directorio. Se puede dar la ruta completa al directorio (cd /home/...) o podemos
darla relativa al directorio en que estamos (este directorio se representa por el caracter .
mientras .. representa el inmediatamente superior). También podemos dar la ruta relativa a
nuestro home con el caracter ~ (cd ~/texto). Para ir a nuestro home basta con ejecutar cd sin
argumentos.
mv
Es similar al comando anterior pero no hace una copia sino mueve el fichero (lo cambia de
nombre). También está disponible la opción -i.
rm
Borra ficheros. También está la opción -i que nos pide confirmación para borrar cada fichero
y la opción -r para borrar todos los ficheros que cuelguen de un directorio.
ln
Permite realizar links entre ficheros. Cada fichero tiene un inode number y al menos un
nombre. La correspondencia entre un inode y el nombre es un link y podemos asociar varios
nombres a un mismo fichero. Para crear un link ejecutamos el comando:
ln filename1 linkname
Se puede también hacer un link de varios ficheros a un directorio. Sin embargo no podemos
hacer links entre directorios, esto sólo lo puede hacer el super-user. Si queremos hacer un link
entre directorios hay que utilizar la opción -s que crea lo que se llama un link simbólico. Por
ejemplo para hacer un link simbólico a un directorio llamado /net/oso/scratch/fcabrera
desde nuestro home llamandolo scratch sólo tenemos que situarnos en nuestro home y
ejecutar:
ln -s /net/oso/scratch/fcabrera scratch
Ahora tendremos en el home un directorio scratch que al acceder a él accedemos a
/net/oso/scratch/fcabrera . No es una copia de este directorio sino que físicamente sólo
existe el directorio en el disco. También es necesario usar la opción -s entre ficheros
normales, si se encuentran en dispositivos físicos distintos. Para borrar un link se usa el
15
COMPUTACIÓN III
comando rm que no borra el fichero sino el link a ese fichero. Por ejemplo:
rm scratch
no borra el directorio sino el link a /net/oso/scratch/fcabrera .
find
Permite buscar un fichero en la estructura de directorios. Hay varias opciones de busqueda
como por ejemplo para buscar los ficheros con un determinado nombre, ficheros que tengan
un determinado tamaño, que hayan sido modificados en los últimos n dias etc. Por ejemplo:
find . -name text
buscará cualquier fichero que se llame text que se encuentre en el directorio actual o
cualquiera que cuelgue de él.
wc
Este comando sirve para contar. Dependiendo de la opcion cuenta unas cosas u otras.
ej:
wc -w [Link] -> Cuenta palabras -> 433
wc -l [Link] -> Cuenta las lineas -> 49
head y tail
El comando head muestra las n primeras líneas de un fichero y tail las últimas líneas.
ej:
grep
Busca un patrón de caracteres en uno o varios ficheros.
ej: grep lo que buscamos donde lo buscamos
16
COMPUTACIÓN III
page y more
Para mostrar un fichero por pantalla de forma que espere cuando el terminal este lleno a que
pulsemos alguna tecla.
sort
Permite ordenar las líneas de uno o varios ficheros, hay varias opciones para realizar la
ordenación. Por ejemplo:
sort l1 l2 +1
ordena los ficheros l1 y l2 por la segunda palabra (+1) y la salida es dirigida a la salida
estandar.
ej:
du
Nos da la cantidad de disco usado por el directorio y todos los subdirectorios que cuelgan del
directorio especificado. La opción -k nos lo da en kilobytes.
quota
Con la opción -v nos muestra la cantidad de espacio que tenemos de cuenta en el home y la
que tenemos ocupada.
top
Nos muestra en pantalla los procesos que ocupan más CPU con el porcentaje
correspondiente, así como otras informaciones como memoria de la máquina, memoria
17
COMPUTACIÓN III
utilizada. La información se va actualizando periodicamente.
ps
Nos permite ver los procesos que se están ejecutando.
who
Para saber quien está conectado a la máquina en la que estamos trabajando.
rusers
Nos muestra quien está en cada máquina del sistema. La opción -l nos da información más
detallada de cada uno.
whereis o which
Localiza un comando, es decir nos muestra la ruta de acceso del fichero ejecutable.
finger
Muestra información sobre los usuarios como username, nombre completo, cuando a leido su
mail por última vez, si está o no conectado y desde donde, etc. Podemos crear un fichero en
nuestro home con el nombre .plan cuyo contenido se mostrará cuando alguien haga un finger.
Podemos utilizar el username si lo sabemos, o bien buscar por el nombre o apellidos reales.
Para redireccionar la entrada estandar se usa < seguido del nombre del fichero. Por ejemplo:
mail fcabrera < file1
Envía un mail a fcabrera tomando como texto el cotenido del fichero file1.
Para redireccionar la salida estandar hay varias opciones (>, >&, >!, >&!, >>, >>&, >>!,
>>&!) seguido del fichero al que se dirige la salida.
> Envía el resultado del comando a un fichero reescribiendolo, si se añade & se envían
también los errores, si se añade ! se asegura que se pueda escribir al fichero aunque tengamos
definida la variable noclobber que evita la sobrescritura.
>> Envía el resultado a un fichero pero añadiendolo al final. En este caso si esta definida la
variable noclobber se produciría un error si el fichero no existe previamente, a menos que
18
COMPUTACIÓN III
añadamos !.
Ejemplos:
cat [Link] > /dev/audio
Enviará el fichero de sonido [Link] a /dev/audio, que es el fichero asociado al dispositivo
de audio.
crypt zyxst < texto > [Link]
Este comando toma como entrada el fichero texto, lo codifica con la clave zyxst y lo escribe
en el fichero [Link].
3.4.2- Pipes
Se denomina un "pipeline" a una serie de comandos separados por | o |&. En el primer caso la
salida estandar del primer comando es direccionada a la entrada del segundo, mientras |&
redirecciona la salida estandar y los errores.
Los pipelines y los comandos pueden separarse por ; y se ejecutan secuencialmente, o pueden
separarse con condicionales. && ejecuta el segundo pipe si el primero se ejecuta sin errores
(standard error es 0). || ejecuta el segundo pipe si se produce un error en la ejecución del
primero (standard error distinto de 0).
Ejemplos:
Para contar el número de usuarios de la máquina en que estamos trabajando
who | wc -l
who tiene como salida una línea con información por cada usuario conectado a la máquina.
Esto es enviado a la entrada del comando wc -l, que cuenta el número de líneas.
El siguiente ejemplo muestra los procesos ordenados por el porcentaje de CPU que emplean.
El ejemplo:
19
COMPUTACIÓN III
3.5- El uso de las comillas en UNIX
UNIX trata de forma diferente los caracteres especiales dependiendo de si sencuentran entre
comillas, y del tipo de comillas que sean. Vamos a ver varios ejemplos utilizando el comando
echo, que simplemente escribe sus argumentos en la salida estandard separados por espacios
y terminando con un retorno de línea.
Otros caracteres que pierden su significado especial entre las comillas son *, ?, >, <, >>, |.
Además las dobles comillas también mantienen el significado de los espacios en blanco.
echo "$shell"
echo '$shell'
Los dos primeros casos tienen el mismo efecto y muestra por pantalla el valor de la variable
shell. Esto se debe a que el caracter $, que sirve para referirse al valor de una variable, no
pierde su significado dentro de las dobles comillas. Sin embargo esto si sucede dentro de las
comillas simples y el resultado en el tercer caso es mostrar por pantalla $shell. También
pierden su signicado los caracteres especiales que pierden su significado en las dobles
comillas, así como las dobles comillas.
3.5.3- El caracter \
Este caracter sirve para quitar cualquier significado especial que tenga para la shell el caracter
que va a continuacion de \ . Por ejemplo:
echo \$shell
como resultado muestra por pantalla $shell.
20
COMPUTACIÓN III
man `ls`
23
COMPUTACIÓN III
make - maintain, update, and regenerate related programs and files
man - display reference manual pages; find reference pages by keyword
mesg - permit or deny messages on the terminal
mkdir - make a directory
mkstr - create an error message file by massaging C source files
more, page - browse or page through a text file
mv - move or rename files
N
nawk - pattern scanning and processing language
nice - run a command at low priority
nm - print symbol name list
nroff - format documents for display or line-printer
O
od - octal, decimal, hexadecimal, and ascii dump
P
passwd, chfn, chsh - change local or NIS password information
paste - join corresponding lines of several files, or subsequent lines of one
file
pr - prepare file(s) for printing, perhaps in multiple columns
printenv - display environment variables currently set
prof - display profile data
ps - display the status of current processes
ptx - generate a permuted index
pwd - display the pathname of the current working directory
Q
quota - display a user's disk quota and usage
R
ranlib - convert archives to random libraries
rcp - remote file copy
rcs - change RCS file attributes
rcsdiff - compare RCS revisions
rev - reverse the order of characters in each line
rlogin - remote login
24
COMPUTACIÓN III
rm, rmdir - remove (unlink) files or directories
roffbib - format and print a bibliographic database
rsh - remote shell
rup - show host status of local machines (RPC version)
ruptime - show host status of local machines
rusers - who's logged in on local machines (RPC version)
rwall - write to all users over a network
rwho - who's logged in on local machines
S
script - make typescript of a terminal session
sed - stream editor
sh - shell, the standard UNIX system command interpreter and command-
level
language
size - display the size of an object file
sleep - suspend execution for a specified interval
sort - sort and collate lines
sortbib - sort a bibliographic database
spell, hashmake, spellin, hashcheck - report spelling errors
split - split a file into pieces
strings - find printable strings in an object file or binary
strip - remove symbols and relocation bits from an object file
stty - set or alter the options for a terminal
su - super-user, temporarily switch to a new user ID
symorder - rearrange a list of symbols
T
tabs - set tab stops on a terminal
tail - display the last part of a file
talk - talk to another user
tar - create tape archives, and add or extract files
tbl - format tables for nroff or troff
tee - replicate the standard output
telnet - user interface to a remote system using the TELNET protocol
test - return true or false according to conditional expression
tftp - trivial file transfer program
time - time a command
touch - update the access and modification times of a file
25
COMPUTACIÓN III
troff - typeset or format documents
true, false - provide truth values
tsort - topological sort
tty - display the name of the terminal
U
ue - Full Screen Text Editor Version 3.9e
ul - do underlining
unifdef - resolve and remove ifdeféd lines from cpp input
uniq - remove or report adjacent duplicate lines
units - conversion program
uptime - show how long the system has been up
users - display a compact list of users logged in
uucp, uulog, uuname - system to system copy
uuencode, uudecode - encode a binary file, or decode its ASCII
representation
uusend - send a file to a remote host
uux - remote system command execution
V
vacation - reply to mail automatically
vgrind - grind nice program listings
vi, view, vedit - visual display editor based on ex
vtroff - troff to a raster plotter
W
w - who is logged in, and what are they doing
wait - wait for a process to finish
wall - write to all users logged in
wc - display a count of lines, words and characters
what - extract SCCS version information from a file
whatis - display a one-line summary about a keyword
whereis - locate the binary, source, and manual page files for a command
which - locate a command; display its pathname or alias
who - who is logged in on the system
whoami - display the effective current username
write - write a message to another user
X
26
COMPUTACIÓN III
xargs - construct the arguments list(s) and execute a command
xstr - extract strings from C programs to implement shared strings
Y
yacc - yet another compiler-compiler: parsing program generator
yes - be repetitively affirmative
Z
zcat - display compressed files
4.-PROCESOS
Cada vez que introducimos un comando o un programa, la shell lo ejecuta. Mientras está en
memoria ejecutándose se le denomina proceso. Puede haber varios procesos ejecutando un
mismo programa. Es decir, existe una sola copia del programa en el file system y cada vez
que se ejecuta se crea un proceso.
Los procesos que nos pertenecen podemos manipularlos de diferentes formas. Al entrar un
comando desde una shell, ésta crea un child process donde se ejcutará el comando. La shell
esperará a que se ejecute el comando y cuando esto suceda podemos volver a ejecutar nuevos
comandos. La ejecución de comandos de esta manera se le denomina ejecución en el
foreground y nos impide usar la shell mientras se ejecuta el comando.
Existe sin embargo otra forma de ejecutar los comandos a la que se le denomina en el
background. Para ello se añade al final de la línea de comandos el caracter &. Al introducir el
comando nos imprime en la terminal dos números, el primero es el número del trabajo y el
segundo el PID asociado al proceso.
Los procesos que queramos ejecutar en el background no deben ser comandos que esperen a
que introduzcamos alguna información desde la shell interactivamente, pues en ese caso el
proceso se parará. Se puede solucionar redireccionando la standard input a un fichero que
contenga exactamente lo que teclearíamos en la línea de comandos.
27
COMPUTACIÓN III
Los procesos que ejecutamos en el foregound podemos cancelarlos o también suspenderlos
momentaneamente para traerlos nuevamente al foreground o al background.
Para cancelar un proceso utilizamos CTRL-C y Para suspenderlo CTRL-X. Para mandar
nuevamente al foreground un proceso suspendido se usa fg, mientras para mandarlo al
bacground se usa bg. Podemos traer al foreground un proceso ejecutado en el background
con el comando:
fg job_number
donde job_number es el número del trabajo, no el PID. Para ver el estado en que se
encuentran los procesos en el background utilizamos el comando jobs que nos dará el
número y el estado de cada proceso en el background. Con la opción -l también nos dará el
PID.
Con la opción -a se muestran los procesos que son requeridos más frecuentemente, y no sólo
los procesos asociados a un terminal. La opción -e muestra información de todos los procesos
que se están ejecutando. Para obtener información más detallada están las opciones -f y -l.
Parte de la información que suministran es la siguiente (se incluye entre parentesis a que
opción corresponde):
28
COMPUTACIÓN III
Los posibles estados de un proceso son:
O El proceso se está ejecutando en el procesador
S (sleeping) El proceso está esperando por un suceso
para terminar
R (runnable) El proceso está en la cola de ejecución
I Indica que el proceso está siendo creado
Z (zombie) El proceso ha terminado y el proceso padre
no está esperando
T El proceso está parado por una señal del proceso padre
X El proceso está esperando por más memoria
top
Nos muestra y actualiza periodicamente información sobre los procesos que más tiempo de
CPU utilizan. Además muestra información sobre el estado del sistema como: El último PID.
Un promedio del número de trabajos en la cola de ejecución. El número de procesos y
cuantos se hayan en cada estado. El porcentaje de tiempo que usa la CPU en diferentes
estados. Información sobre la memoria del sistema.
La información de los procesos que se ofrece es:
PID
USERNAME
PRI
NICE
SIZE
RES
STATE
TIME
WCPU
CPU
COMMAND
Con significados similares a los de ps. Las diferencias son SIZE y RES que representan el
tamaño real del proceso y la parte residente en memoria respectivamente. WCPU y CPU son
dos estimaciones del porcentaje de tiempo de CPU usado.
4.2-Prioridades
La CPU tiene que compartir su tiempo entre los distintos procesos. El cálculo de la prioridad
que tiene un proceso lo hace el kernel y se basa en varios factores como el tiempo de CPU
que ha usado recientemente, el estado del proceso (si está esperando que introduzcamos un
dato o está listo para ser ejecutado) y el valor de nice del proceso.
Cada proceso tiene un valor de nice que varia entre -20 y 20. Cuanto más bajo mayor
prioridad tendrá el proceso.
Los procesos normalmente heredan de sus procesos padres la prioridad. Los usuarios sólo
pueden tener procesos con nice 0 o mayor, mientras que el super-user puede tener procesos
con valores menores. Por defecto los usuarios en la consola van a tener procesos con una
prioridad de 0. Podemos lanzar procesos con menor prioridad o bajar la prioridad de procesos
que ya se están ejecutando, pero nunca podremos aumentar la prioridad a un proceso, aunque
previamente se la hubieramos bajado, sólo el super-user puede hacer esto.
29
COMPUTACIÓN III
El valor de nice lo podemos ver con ps o top ( el primero nos lo muestra de 0 a 40 y el
segundo de -20 a 20).
Hay varias razones para lanzar procesos con menor prioridad. La principal es que con ello se
evita que un proceso pueda acaparar el tiempo de la CPU haciendo que la máquina vaya muy
lenta al trabajar de forma interactiva. En la red del IAC, cuando ejecutamos procesos en una
máquina en la que no estamos trabajando en la consola, nice tendrá un valor de 10 para que el
usuario que trabaja en consola tenga preferencia y pueda trabajar interactivamente.
30
COMPUTACIÓN III
Los comandos para hacer esto son at, batch y crontab.
at Nos permite especificar el momento en que queremos ejecutar los comandos. Si los
procesos producen una salida por pantalla o se producen errores nos envía un mail. Podemos
especificar la hora con una gran variedad de formatos. Algunos ejemplos que no requieren
mayor explicación son:
at 0815am Jan 24
at 8:15am Jan 24
at now + 1 day
at now next day
at 5 pm Friday
Una vez introducido el comando, at nos cambia el prompt a:
at>
Entonces empezamos a teclear los comandos y cuando hayamos terminado salimos con
CTRL-Z.
El comando batch es similar a at, sólo que no indicamos cuando ejecutar los comandos. Al
ejecutar el comando batch nos cambiará directamente al prompt at> donde tecleamos los
comandos. Al salir con CTRL-Z empezarán a ejecutarse los comandos.
crontab
Este comando sirve para crear, modificar o borrar un fichero donde cada usuario define una
serie de comandos que quiere que se ejecuten periodicamente o en determinadas fechas. Estos
ficheros no están en nuestro home o cualquier otro directorio que nos pertenezca, sino que
estan en un directorio donde se encuentran todos los crontabs de los usuarios del sistema. Las
tablas dependen de la máquina, es decir un usuario puede tener una tabla en cada máquina y
cada máquina sólo ejecuta los comandos de la tabla creada en ella.
Estas tablas tienen un formato definido. Son seis columnas separadas por espacios o Tab. La
primera columna corresponde a los minutos. La segunda corresponde a las horas. La tercera
al dia del mes. La cuarta al mes. La quinta al dia de la semana. La sexta el comando a
ejecutar.
Por ejemplo
#ejemplo de crontab
#min hora dia mes dia comando
#0-59 0-23 1-31 1-12 0-6
0 11,18 * * 1-5 cat [Link]>dev/audio
0 4 * * * cp -r /scratch/tesis /scratch2
Los comandos se ejecutarán cuando la hora y fecha coincida con las indicadas en la tabla. En
cada columna pueden indicarse varios valores separados por comas, dar rangos con números
separados por el signo menos, o pueden tener un asterisco que indica cualquier valor. Los
dias pueden indicarse por el dia del mes o de la semana, si se indican valores para los dos el
comando se ejecutará cuando se cumpla que la fecha coincida con cualquiera de los dos (por
ejemplo indicar que se ejecute el primero de mes y todos los sabados). Si queremos definir el
31
COMPUTACIÓN III
dia bien por el mes o bien por la semana, ponemos un asterisco en el que no vamos a utilizar.
5.1.-Impresoras
Los comandos básicos para controlar las impresoras son lp, lpstat, cancel.
lp
Envía a la impresora un fichero. Si no indicamos a que impresora lo enviamos, la máquina
selecciona la que tiene definida que será la más cercana. Podemos cambiar la impresora que
tenemos por defecto con la variable PRINTER. Por ejemplo incluyendo en el .login
setenv PRINTER lw1
Si queremos enviar un fichero a otra impresora usamos la opción -d
lp -d lw3 file1
Se pueden enviar varios ficheros simultáneamente:
lp file1 file2 file3 ....
Podemos también usar pipes:
man ls | lp
Al enviar el fichero nos mostrará el nombre del trabajo de impresora.
lpstat
Nos permite ver cual es el estado de los trabajos de impresión que hemos enviado. Tiene
también varias opciones que nos permiten ver el estado de la impresora.
cancel
Nos permite cancelar un trabajo que hayamos enviado a impresora y todavía esté en la cola
de impresión. Tenemos que conocer el nombre del trabajo (podemos verlo con lpstat). La
32
COMPUTACIÓN III
sintaxis es:
cancel nombre_trabajo
5.2.-Dispositivos magnéticos
En el IAC existen dos tipos de dispositivos magnéticos: DATs y exabytes. Estos dispositivos
se usan para guardar grandes cantidades de datos a los que no vamos a acceder con frecuencia
y para hacer copias de seguridad (backups).
La capacidad de los dats es aproximadamente 2GB sin compresión que puede llegar a ser
hasta 4GB con compresión. Todos los DATs usan la compresión al escribir, y al leer pueden
hacerlo con o sin compresión, según hayan sido grabados.
Los exabytes ofrecen una mayor capacidad de almacenamiento de datos aunque son algo más
lentos. Dependiendo de la densidad y de si usan compresión o no, su capacidad puede variar
entre 2 y 10GB.
Los comandos para utilizar los dispositivos magnéticos son mt y tar.
mt
Este comando permite controlar los dispositivos magénticos. Para ello envía diferentes
comandos a los dispositivos. Si no especificamos a que dispositivo, utilizará el que haya
definido en la variable de entorno TAPE. La sintaxis básica del comando es:
mt [ -f tapename ] command [ n ]
Algunos de los comandos que podemos enviar al dispositivo magnético son:
eof, weof Escribe n marcas de final de fichero (EOF) en
la posición actual.
33
COMPUTACIÓN III
tar
Este comando sirve para crear tarfiles, que son ficheros que se pueden almacenar en cinta
(estos ficheros pueden guardarse también en disco). Además el comando permite guardar y
extraer ficheros de estos tarfiles.
Cuando grabamos los ficheros en cinta no los hacemos uno a uno sino que son agrupados en
los tarfiles que son los que se graban en la cinta (o en cualquier otra parte del sistema de
ficheros a la que tengamos acceso y en este caso generalmente se les pone la extensión .tar al
nombre del fichero).
tar Tiene cinco argumentos clave (c, r, t, u, x) que realizan las siguientes acciones:
c Crea un nuevo tarfile.
34
COMPUTACIÓN III
el tamaño del tarfile.
Hay varias precauciones a tener en cuenta al hacer un backup de un disco. Los ficheros que se
van incluir deben darse con una ruta de acceso relativa, no la ruta de acceso completa. Si no
lo hacemos, cuando queramos recuperar los ficheros con tar, tratará de crearlos exactamente
con la misma ruta de acceso cuando posiblemente queremos utilizar otro disco o estamos en
otro sistema donde no existen los directorios que se guardaron en la cinta.
No se van a copiar directorios vacios, ni ficheros de los que no tengamos permisos de lectura
aunque sean nuestros. Normalmente tampoco se siguen los links simbólicos.
5.3.-Floppies
Los floppy disks pueden ser montados, en las máquinas que tengán instalado el dispositivo
para leerlo, de forma sencilla. En general lo más fácil es emplear alguna utilidad como
filemanager para montarlos, pero puede accederse a ellos también desde la shell.
El floppy quedará montado en el directorio /floppy, que estará vacio antes de que lo
montemos. Lo primero es introducir el floppy en el dispositivo. Si nos situamos en /floppy y
ejecutamos ls veremos que sigue vacio. Para que se reconozca el disco tenemos que usar el
comando volcheck, que examinará si hay algún floppy en el dispositivo. Una vez hecho esto
ya aparecerá un subdirectorio en /floppy, asociado al floppy y al que podemos acceder.
Si necesitamos formatear el floppy ejecutamos fdformat.
Para sacar el floppy del dispositivo hay que hacerlo por software, pues las estaciones de SUN
no tienen un botón para sacarlo manualmente. El comando para hacerlo es eject.
35
COMPUTACIÓN III
6.-TRABAJ0 EN RED
6.1- FTP
El comando ftp es una interface para que el usuario acceda al File Transfer Protocol, que
permite transferir ficheros entre sistemas remotos.
La sintaxis del comando es la siguiente:
ftp
ftp hostaname
En el primer caso nos cambia el prompt a ftp> y accedemos a una serie de comandos que son
del ftp. Estos comandos, aunque en muchos casos coinciden con los de UNIX, no son
comandos de UNIX y realizan funciones diferentes.
En el segundo caso entramos en ftp y nos conectamos directamente a otra máquina que
generalmente no será una máquina local.
Los comandos propios de ftp son:
Para saber lo que hace un comando tecleamos help comand_name (no se usa el comando
man).
Los comandos que más se usan con ftp son los siguientes:
open ->Si entramos en ftp sin indicar a que máquina nos queremos conectar, podemos abrir
posteriormente una conexión con este comando. Por ejemplo:
open [Link]
close -> Cierra la conexión que tengamos abierta.
ls -> Nos hace un listado del directorio remoto, es decir del directorio en que nos hemos
situado en la máquina a la que nos conectamos.
36
COMPUTACIÓN III
cd ->Cambia de directorio en la máquina remota.
get, put, mget, mput -> Son comandos muy utilizados. get y mget sirven para copiar un
fichero de la máquina remota a la local. mget permite traer varios ficheros de una sola vez.
put y mput son similares pero copian los ficheros de la máquina local a la remota. Veamos
algunos ejemplos:
get file1
mget *
mput l1 l2 l3
El primero nos traerá el fichero l1. El segundo nos traerá todos los ficheros. El tercero nos
pondrá en la máquina remota los ficheros locales l1 y l2.
prompt -> Ejecutando prompt off, desactivamos el modo interactivo que nos pregunta por
cada fichero al utilizar mget o mput.
lcd ->Cambia el directorio en la máquina local.
ascii y bin ->Son dos modos de transferencia de datos. ascii se utiliza solamente para ficheros
con contenido de texto en formato ASCII. bin se utiliza para ficheros en formato binario
(imágenes, ejecutables, etc).
bye -> Cierra la conexión y sale de ftp.
6.1.1-Servidores de ftp
La mayor parte de centros de investigación, universidades, empresas comerciales, etc, que
tengan una red local, van a tener un servidor de ftp al que podemos conectarnos para traer y
dejar ficheros, aunque con ciertas restricciones.
Al conectarnos por ftp a una máquina externa, nos va a pedir un login y un password. Si
tenemos una cuenta en esa máquina podemos darle nuestro username y nuestro password. Sin
embargo lo más usual es utilizar el ftp anonimo, si el sistema en cuestión ofrece este
servicio. Cuando nos pide el login introducimos anonymous y en el password damos nuestra
dirección completa de mail. Con esto no entraremos realmente en el sistema sino en un área
restringida en la que sólo vamos a poder acceder a una serie de directorios. También suele
haber diferentes restricciones sobre la posibilidad de dejar ficheros o sobre el tiempo que
éstos permanecen sin ser borrados.
37
COMPUTACIÓN III
6.1.2-Uso eficiente de ftp
Para que la transferencia de ficheros sea rápida es conveniente preparar los ficheros para la
transmisión. El primer paso es agrupar los ficheros. Si queremos transferir toda una estructura
de directorios lo mejor es crear un tarfile de disco. Por ejemplo:
tar -cvf [Link] .
Una vez tenemos el [Link] podemos reducir su tamaño comprimiéndolo. De esta forma
ahorraremos tiempo en la transmisión. Los comandos más usados para comprimir ficheros
son compress y gzip. Por ejemplo:
compress [Link]
gzip [Link]
Los dos comprimen el fichero. En el primer caso añade al nombre del fichero la extensión .Z
y en el segundo la extensión .gz. Para descomprimirlo usaríamos:
uncompress [Link]
gunzip [Link]
No hace falta indicar la extensión.
Por último se puede dar un paso más que es codificar el fichero comprimido para que pueda
ser transmitido en formato ASCII (esto permitiría además enviarlo por mail como un fichero
de texto). Los comando son uuencode y uudecode para codificar y decodificar
respectivamente.
uuencode [Link].Z [Link].Z > [Link]
uudecode [Link]
El primero codifica [Link].Z (primer argumento) indicando que al decodificar el fichero se
llamará [Link].Z (segundo argumento que podría ser otro nombre) y es direccionado al
fichero [Link]. El segundo comando decodifica creando un fichero cuyo el nombre es el
del segundo argumento utilizado en uuencode .
Al ejecutar telnet a una máquina remota nos pedirá el login y el password. Le daremos el
username y el password correspondiente a la cuenta que tengamos en la máquina remota.
Una vez hecho esto ya entramos en la cuenta remota donde se ejecuta su .cshrc y .login
correspondiente y podremos empezar a trabajar.
El comando rlogin lo utilizaremos para conectarnos a una máquina de la red local. Al hacer
un rlogin a otra máquina local no nos va a pedir el password, a no ser que queramos entrar
como otro usuario (por ejemplo si tenemos dos cuentas). En este caso usamos la opción -l. La
sintaxis sería:
rlogin -l username host
username es el nombre de la cuenta en que queremos entrar y host la máquina. Con esta
opción nos pedirá el password.
38
COMPUTACIÓN III
Para salirnos de una conexión remota bien con telnet o con rlogin ejecutamos el comando
exit o logout.
rsh
Este comando nos permite ejecutar un proceso en otra máquina sin necesidad de entrar en ella
con rlogin. La standard input, la standard output y la estandard error siguen siendo la
terminal de la máquina local. Por ejemplo:
rsh volvo last -10
Ejecutará en la máquina volvo el comando last-10. Este comando con esta opción nos escribe
en la terminal los 10 últimos usuarios que se han conectado a la máquina (en este caso la
máquina remota volvo), aunque ya no estén conectados.
6.3- MAIL
mail es el comando para enviar y leer correo electrónico desde la shell. Normalmente el
correo electrónico lo vamos a enviar o leer con algún programa que nos permita hacerlo de
forma más sencilla como puede ser el mailtool o desde netscape . Sin embargo es
conveniente conocer algún programa que permita hacerlo desde la shell, pues no siempre
vamos a poder abrir ventanas y tendremos que leerlo desde una terminal de texto. Hay varios
comandos que permiten leer el mail desde la shell. Los más usados son mail, mailx, y pine .
El comando mail es el más básico y suele estar instalado en todos los sistemas (es el que se
va describir a continuación). En mailx se ofrecen más facilidades y opciones al usuario y es
similar a mail (puede considerarse como una versión más avanzada). El programa pine nos
permite interactuar con él a través de un sistema de menus. En cualquier caso una vez
aprendido el funcionamiento de mail es muy fcáil utilizar cualquiera de los otros.
El comando mail funciona en dos modos: para enviar y para recibir, que a continuación se
describen.
mail aateca@[Link]
Una vez tecleado el comando, esperará a que introduzcamos el texto. Si queremos introducir
39
COMPUTACIÓN III
un subject ponemos en la primera línea:
Subject: texto_del_subjet
Luego escribimos el texto del mail. Para terminar y que lo envíe ponemos al principio de una
nueva línea el caracter . y pulsamos return.
En el segundo ejemplo no introducimos por teclado el texto sino que previamente lo hemos
editado en un fichero que se tomará como la standard input.
Listas de mail
Existen en todos los sistemas unas listas de mail, que pueden ser definidas por el
administrador del sistema. Estas listas permiten comunicarse entre si a los usuarios que
pertenecen a estas listas. Al enviar un mail dirigido a la lista se enviará a todos los usuarios
de ésta.
Para ver que listas hay definidas y quien pertenece a ellas podemos enviar un mail a
majordomo. Majordomo es un sistema automático que nos permite subscribirnos o borrarnos
de una lista pedir información sobre ella etc.
Para utilizarlo envía un mail sin subject a majordomo y ponemos un comando en el texto que
puede ser para subscribirnos a una lista, para pedir ayuda, etc. Majordomo nos contestará con
un mail donde nos informa de los resultados del comando enviado. Por ejemplo, si enviamos
un mail con el comando help nos devuelve un mail con información de como funciona
majordomo y los comandos que podemos enviar. Enviando el comando lists nos devuelve un
mail con las listas que están definidas.
7.- EMACS
Existen multitud de editores de texto que pueden ser utilizados en UNIX. El más primitivo es
ED. VI y PICO son otros editores un poco más sofisticados, así como TEXTEDIT o
NEDIT. Pero, sin duda, el editor de textos más completo y moderno es EMACS. La palabra
EMACS procede del término inglés editing macros. EMACS no es simplemente un editor de
textos, es un fenómeno. Todas las operaciones dentro de EMACS pueden realizarse con
combinación de diferentes teclas. No obstante, existen versiones de EMACS que también
funcionan en X y son las versiones llamadas XEMACS.
41
COMPUTACIÓN III
7.1.1.- Combinaciones importantes
Ctrl+x + Salva un nuevo fichero. EMACS preguntará el nombre del fichero y luego lo
Ctrl+w salvará al disco.
Ctrl+x +
Salva el fichero actual.
Ctrl+s
EMACS incluye una ayuda que la podemos obtener con Ctrl+h. Seleccionando la opción t
dentro de la ayuda entramos en un pequeño curso de EMACS que nos ayudará si es nuestro
primer contacto con él.
8.-SHELL SCRIPTS
Como se vió al principio del curso, la shell nos permite acceder al kernel del sistema
operativo. La shell en reaildad lo que hace es interpretar la línea de comandos y ejecutar los
programas que
ésta indica. Sin embargo, además de leer la línea de comandos, también puede ejecutar los
comandos que se encuentren en un fichero. Cualquier comando que pueda ser tecleado en la
línea de
comandos puede ser incluido en un fichero al que se le denomina como shell script o shell
program.
Un shell script es un fichero donde hemos introducido cualquier comando que se puede
ejecutar en la shell. Se pueden incluir comandos UNIX, utilidades, emplear pipes,
redireccionar
entradas y salidas, definir y utilizar variables, además del uso de una serie de comandos
UNIX creados para ser usados fundamentalmente en los shell scripts, como son condicionales
y
comandos para controlar el flujo del programa.
Si queremos poner comentarios en nuestros scripts, lo hacemos con el símbolo #
8.1.-Declaración de variables
42
COMPUTACIÓN III
Para definir variables se utilizan las palabras reservadas set y setenv seguidas de la variable
que queramos definir. Set sirve para declarar variables locales y setenv para variables de
entorno. Variables del mismo tipo pueden declararse juntas al principio del programa (Ej: set
name, name1). Antes de darle un valor a una variable, ésta debe estar definida.
1.1- Asignar números a variables ->Para asignar un valor numérico a una variable se utiliza
@ variable = valor, dejando los espacios.
1.2.- Asignar palabras a variables -> Se utiliza set name = "Esto es una frase"
1.3.- Asignar variables a otras variables -> Se utiliza el símbolo del dollar set name1 =
$name
1.4.- Crear arrays -> Para definir arrays, se hace también con set. Los datos que componen
el array hay que separarlos por espacios y deben ir encerrados entre paréntesis.
Ej: set direction = (Norte Sur Este Oeste)
echo $direction
echo $direction[1]
echo $direction[1-3]
Hacer un pequeño script que pregunte varios datos, los incluya en un fichero y muestre el
contenido del fichero por pantalla.
#!/bin/csh
echo " "
echo "Nombre:"
43
COMPUTACIÓN III
set nombre = $<
echo "Cual es tu número de teléfono?"
@ telefono = $<
echo "Cual es tu edad?"
@ edad = $<
echo $nombre $telefono $edad >> [Link]
cat agenda
8.3.- Operaciones
8.3.1- Operadores matemáticos
Operador Operación
+ Suma dos números
* Multiplica
/ Divide
Ej: @ a = 47
@ b = 32
@ suma = $a + $b
@ resta = $a - $b
@ producto = $a * $b
@ divide = $a / $b
@ resto = $a % $b
Operador Operación
! Operador NO
&& Operador Y
|| Operador O
44
COMPUTACIÓN III
Operador Operación
== Igual a
!= No igual a
8.4.-Condicionales
La instrucción para el condicional es if. Es interesante utilizar el condicional cuando
queremos que nuestro programa chequee si una condición es verdadera o falsa. La forma del
condicional es la siguiente:
if (condición) then
instrucción
end if
if (condición) then
instrucción1
else
instrucción 2
endif
if (condición1) then
instrucción1
else if (condición2) then
instrucción2
endif
endif
EJERCICIO
45
COMPUTACIÓN III
Hacer un pequeño script que nos pregunte la edad y dependiiendo de la edad que tengamos
escriba una cosa u otra
#!/bin/csh
echo " "
echo " Cuantos años tienes?"
@ edad = $<
if ($edad < 18) then
echo "Eres un poco joven para estar aqui"
else if ($edad >= 18 ) then
if ($edad > 65) then
echo "Eres un poco mayor para estar aqui"
else
echo " Cual es tu nombre?"
set nombre = "$<"
echo " "
echo "Hola" $nombre
echo " "
endif
endif
endif
8.5.- SWITCH
Cuando se tienen muchos condicionales es conveniente utilizar lo que se llama el switch. La
forma de utilizarlo es la siguiente:
switch (Variable)
case valor1:
Instrucción1
breaksw
case valor2:
Instrucción2
breaksw
endsw
EJERCICIO
#!/bin/csh
echo "1. Leer un número de la agenda"
echo "2. Introducir un nuevo número"
46
COMPUTACIÓN III
echo " "
echo "Q quit"
echo " "
echo "Opción:"
set elecci = $<
switch ($elecci)
case "1":
echo "Quieres leer un número de teléfono"
breaksw
case "2":
echo "Quieres introducir un nuevo número"
breaksw
case "Q":
exit 0
breaksw
case "q":
exit 0
breaksw
default:
echo "Has elegido mal. Eso no era una opción"
breaksw
endsw
El while loop se utiliza cuando queremos que nuestro programa repita unas intrucción/es.
Supongamos que queremos hacer un menú como el anterior, pero sólo salir del programa
cuando queramos nosotros, no una vez hayamos seleccionado una opción. Para ello
utilizamos el while.
Ej:
#!/bin/csh
47
COMPUTACIÓN III
set flag = "1"
while ($flag == "1")
echo " "
echo "1. Leer un número de la agenda"
echo "2. Introducir un nuevo número"
echo " "
echo "Q quit"
echo " "
echo "Opción:"
set elecci = $<
switch ($elecci)
case "1":
echo "Quieres leer un número de teléfono"
breaksw
case "2":
echo "Quieres introducir un nuevo número"
breaksw
case "Q":
set flag = "0"
breaksw
case "q":
set flag = "0"
breaksw
default:
echo "Has elegido mal. Eso no era una opción. Elige de nuevo"
breaksw
endsw
end
EJERCICIO:
Hacer un pequeño script que nos escriba en pantalla que ha habido un error, espere unos
segundo y vuelva a escribir el mensage.
#!/bin/csh
set j = 0
clear
while ($j < 20)
@i=0
while ($i < 2)
echo " "
echo "=============== "
echo " Hay un ERROR! "
48
COMPUTACIÓN III
echo "=============== "
echo " "
@ i = $i + 1
end
@k=0
while ($k < 5000)
@ k = $k + 1
end
@ j = $j + 1
end
Ej:
#!/bin/csh #!/bin/csh
set amigo set amigo
foreach amigo (Antonio Angel Monica) foreach amigo ("Antonio Manuel"
"Angel Garcia" "Monica")
echo " " echo " "
echo "Hola $amigo" echo "Hola $amigo"
echo " " echo " "
end end
#!/bin/csh
set flag = "go"
while ($flag == "go")
echo "Nombre o teclea STOP para salir"
set amigo = $<
if ($amigo == "stop") then
break
endif
49
COMPUTACIÓN III
if ($amigo == "STOP") then
break
endif
echo " "
echo " Hola $amigo"
echo " "
end
echo "Hasta luego"
Para no salir del bucle, pero que no se ejecuetn las instrucciones que siguen, se utiliza
continue , que hace que el programa vuelva al principio del bucle.
EJERCICIO:
Hacer un script que pregunte el nombre y si el nombre es el de una persona que uno no
quiere, pues pase de él y vuelva a prguntar el nombre:
#!/bin/csh
set flag = "go"
while ($flag == "go")
echo "Nombre o teclea STOP para salir"
set amigo = $<
if ($amigo == "stop") then
break
endif
if ($amigo == "STOP") then
break
endif
if ($amigo == "Juan") then
continue
endif
echo " "
echo " Hola $amigo"
echo " "
end
echo "Hasta luego"
8.9.- Subprogramas
En muchas ocasiones es útil escribir nuestros scripts utlizando subprogramas. Un conjunto de
subprogramas formarán un programa más complejo. Esto facilitará la compresión del script y
será mucho más cómodo corregir los subprogramas con errores, o adaptarlos a nuevos
scripts.
Antes de empezar a escribir un script es útil construir un diagrama de flujo de él. El diagrama
de flujo nos va a dar una idea de como organizar y oredenar nuestros subprogramas.
Supongamos que queremos hacer una pequeña agenda de teléfonos:
50
COMPUTACIÓN III
Ej: Menú
de
Opciones
#!/bin/csh
set flag = "go"
while ($flag == "go")
echo " "
echo " "
echo " AGENDA DE TELEFONOS"
echo " "
echo "1. Buscar un numero de telefono"
echo "2. Añadir un numero de telefono"
echo "3. Modificar un numero ya existente"
echo "4. Mostrar la agenda de telefonos"
echo "5. Salir"
echo " "
set eleccion = $<
switch ($eleccion)
case "1":
buscartel
breaksw
51
COMPUTACIÓN III
case "2":
metertel
breaksw
case "3":
modiftel
breaksw
case "4":
mostragen
breaksw
case "5":
set flag = "exit"
breaksw
default:
echo "Te has equivocado. Vuelve a elegir."
breaksw
endsw
end
awk '/galaxia/ {print $1, $2, $3}' [Link] -> Buscará dentro del fichero [Link] la
palabra galaxia y escribirá en pantalla las tres primeras columnas de las líneas en la que
aparezca esta palabra.
Si queremos buscar pero sólo tomando el principio de la línea, no todas las columnas de una
misma línea, utilizaremos el caracter ^ al principio de la expresión de búsqueda
awk '/^galaxia/ {print $1, $2, $3}' [Link]
También podemos decirle al ordenador que busque las columnas que no presenten una serie
de caracteres. Lo hacemos anteponiendo a la tilde ( ~ ) la admiracion ( !~ ):
awk '$11 !~ /^galaxia*/ {print $4,$5}' [Link]
Nos centraremos en la C shell y TC shell que son las más comunes. Los ficheros de
configuración básicos que se leen cuando entramos en la cuenta son el .cshrc (o .tcshrc para
la TC shell) y el .login . Cuando se inicia una nueva shell sólo se lee el primero. Estos
ficheros deben estar en el home y al empezar por . son ficheros ocultos.
Hay que distinguir entre dos tipos de variables: las variables locales y las de entorno. Las
primeras sólo tienen validez en la shell en las que están definidas. Las segundas son
heredadas por cualquier shell que se ejecute aunque estas variables hayan sido definidas en el
.login que no se lee al abrir una nueva shell.
Los comandos básicos para la definición de variables son, set, setenv, unset, unsetenv.
set
Este comando se utiliza para definir las variables locales, su sintaxis es:
En el primer caso asignamos un valor a una variable esté o no definida anteriormente, por
ejemplo:
set prompt="(%M)%~%% "
Para ver el valor de una variable ya vimos que se puede hacer con el comando echo. Por
ejemplo:
echo $PATH
Mostrará el contenido de la variable de entorno PATH (esta variable contiene las rutas de
accesos donde la shell buscara los ficheros ejecutables. Seguirá el orden en que los
directorios aparezcan en el PATH). Sin embargo, si queremos ver todas las variables que
tenemos definidas ejecutamos set sin argumentos.
setenv
Se emplea de forma análoga a set pero con variables de entorno. La sintaxis es ligeramente
diferente:
setenv varname value
(sin el signo =). Podemos asignar un valor a una variable, simplemente definirla, o ver las
variables de entorno que tenemos definidas ejecutando setenv sin argumentos.
setenv TAPE /dev/rmt/0bn
Define la variable TAPE como /dev/rmt/0bn .
unset y unsetenv
Sirven para borrar variables locales y de entorno respectivamente, que ya estaban definidas.
La sintaxis es:
unset varname
unsetenv varname
En el fichero .login suelen definirse las variables de entorno, aunque pueden definirse en el
fichero de inicialización de la shell correspondiente.
Una vez dentro de una shell (supongamos TC shell) podemos definir nuevas variables
ejecutando los comandos set o setenv, o bien incluyendo estos comandos en el fichero
54
COMPUTACIÓN III
.tcshrc y volviéndolo a ejecutar con el comando source.
source .tcshrc
9.2.- Alias
Otra de las utilidades que permiten tener un entorno de trabajo más agradable es la definición
de alias. Un alias nos permite asignar un nuevo nombre a un comando. Esto puede ser muy
útil en comandos que usemos frecuentemente y que tengan nombres largos, difíciles de
recordar o con complicadas opciones.
Nombre es el nuevo nombre del comando (procurar que sea corto y fácil de recordar).
Definición son los comandos que queremos que se ejecuten cuando tecleamos el alias (es
conveniente ponerlo entre ' ') por ejemplo:
alias lf 'ls -F'
alias . 'echo $cwd; ls'
En el segundo ejemplo al teclear . nos mostrará el valor de la variable cwd que contiene el
directorio en que estamos y hace luego un listado de este directorio.
Pueden ponerse varios comandos en un mismo alias separandolos por ; . También está
permitido la utilización de pipes.
Si queremos que los argumentos que damos al alias se sitúen en un punto distinto del final,
tenemos los siguientes cracteres:
!^
!*
que deben estar precedidos de \ para evitar que el caracter ! sea interpretado por la shell de
otra manera. El primero pasa el argumento que aparece en primer lugar de la línea de
comandos al punto donde aparece !^. El segundo pasa todos los argumentos. Por ejemplo:
55
COMPUTACIÓN III
alias gv 'ghostview -a4 -swap -bg white \!^ &'
Tecleando gv [Link] podremos ver el fichero postscript [Link] con el programa ghostview. El
argumento que damos (que es el nombre del postscript) será introducido antes del caracter &
que manda el proceso al background.
Para ver todos los alias que hay definidos se ejecuta el comando alias sin argumento. Para ver
la definición de un alias concreto tecleamos alias name.
Para evitar confusiones no se debe usar el nombre de un comando como alias para otro o el
mismo comando con diferentes opciones. Por ejemplo muchos usuarios suelen definir:
alias rm 'rm -i'
56