0% encontró este documento útil (0 votos)
6 vistas56 páginas

Introducción a UNIX y su Estructura

El documento proporciona una introducción al sistema operativo UNIX-LINUX, describiendo su historia, estructura y componentes clave como el kernel, la shell y el sistema de ficheros. Se detalla cómo los permisos de acceso a ficheros y directorios pueden ser modificados y se presentan varios comandos básicos para interactuar con el sistema. Además, se explica la importancia de UNIX en la portabilidad de aplicaciones y su uso en diferentes arquitecturas de computadoras.

Cargado por

e1kcmarczuk
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
6 vistas56 páginas

Introducción a UNIX y su Estructura

El documento proporciona una introducción al sistema operativo UNIX-LINUX, describiendo su historia, estructura y componentes clave como el kernel, la shell y el sistema de ficheros. Se detalla cómo los permisos de acceso a ficheros y directorios pueden ser modificados y se presentan varios comandos básicos para interactuar con el sistema. Además, se explica la importancia de UNIX en la portabilidad de aplicaciones y su uso en diferentes arquitecturas de computadoras.

Cargado por

e1kcmarczuk
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

COMPUTACIÓN III

1.- Introducción y conceptos básicos

1.1.-El sistema operativo UNIX - LINUX


Un sistema operativo es un programa que controla otras partes del ordenador tanto hardware
como software. Permite además al usuario acceder a las facilidades que ofrece el sistema.
Todo ordenador necesita de un sistema operativo.

UNIX comienza en 1969 como un proyecto de investigación de Bell Laboratories, estando


disponible la primera versión comercial en 1977 y ganando rápidamente en popularidad y
difusión.

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.2-Partes del sistema operativo


Las partes más importantes en que puede dividirse el sistema operativo UNIX son:
Kernel
Shell
UNIX file system

Además, normalmente con el sistema operativo se suministran otra serie de programas,


utilidades para comunicaciones, editores, lenguajes de programación, etc, que no forman
parte estrictamente del sistema operativo.

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:

? Controlar la memoria de la máquina y asignar una parte a cada proceso

? Distribuir el trabajo realizado por la CPU de forma que sea lo más eficiente posible

? Organizar la transferencia de datos entre las distintas partes del sistema

? Aceptar las instrucciones de la shell

? Hacer cumplir los permisos especificados en el sistema de ficheros

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.

En UNIX hay varios tipos de shell que ofrecen diferentes características:

? Bourne shell (sh)

? C shell (csh)

? TC shell (tcsh)

? Korn shell (ksh)

? Bourne Again SHell (bash)

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.

Bourne C TC Korn BASH


________________________________________________________

command history No Yes Yes Yes Yes

command alias No Yes Yes Yes Yes

shell scripts Yes Yes Yes Yes Yes

filename completion No Yes* Yes Yes* Yes

command line editing No No Yes Yes* Yes

job control No Yes Yes Yes Yes

________________________________________________________
* 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.

1.2.3.- Sistema de ficheros

La tercera parte que define el sistema operativo UNIX es la estructura de su sistema de


ficheros. Un sistema de ficheros es un método lógico de organizar y archivar un gran número
de información, de forma que sea sencillo hacer uso de ella. El fichero es la unidad más
pequeñna en la que se puede almacenar información. UNIX considera como ficheros no sólo
a los ficheros normales (en los que guardamos datos, programas, etc) sino también a los
directorios y los dispositivos conectados al sistema.

El sistema de ficheros en UNIX está organizado en una estructura jerárquica de directorios


que comienza en el directorio root representado por / .

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

? /etc contiene comandos y ficheros usados en la administración del sistema

? /home contiene los ficheros home de cada usuario del sistema

? /lib contiene librerías utilizadas por diferentes programas y lenguajes

? /tmp es el directorio donde se guardan los ficheros temporales

? /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.

Generalmente se utilizan dos puntos consecutivos (..) para representar el directorio


inmediatamente superior al que nos encontramos. Por ejemplo, si nos encontramos en el
directorio `bin', .. representa al directorio `local'. En la mayor parte de las shells los
directorios de los usuarios (home) se representa con el símbolo ~ .

Ejemplos:

[comun@volvo ~]$ pwd


[comun@volvo ~]$ cd /
[comun@volvo ~]$ pwd
[comun@volvo /]$ ls -> Muestra el contenido del directorio
bin datos export impresion lost+found opt sbin tmp
boot dev floppy lib misc proc scratch usr
cdrom etc home localsoft mnt root soft var

[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.

A la correspondencia entre el nombre de un fichero y el inode number se le denomina link.


Un mismo inode number puede tener asociados varios nombres y nos podemos referir al
fichero por cada uno de estos nombres.

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:

ls -l `nombre del fichero'


ls -l `nombre del directorio'

El resultado de este comando es una línea de la siguiente forma:


-rwxr-xr-x 1 user 2345 Oct 18 12:01 filename

La primera parte de esta línea -rwxr-xr-x representa los permisos de acceso que tiene el
fichero o directorio.

2.1.-Clases de permisos de acceso


Hay tres tipos de permisos:

r - lectura
w -escritura
x -ejecución

Cada uno de estos permisos se agrupan para dar acceso a tres tipos de usuarios:

u -el usuario que crea el fichero o directorio


g -miembros del grupo de trabajo del usuario
o -todos los usuarios

Los permisos de accesos para estos tres tipos de usuarios vienen dados por una serie de nueve
caracteres:

user grupo otros


rwx rwx rwx

6
COMPUTACIÓN III
Estos permisos tienen diferentes significados para ficheros y directorios:

Permiso Fichero Directorio

r lectura Leer un fichero Listar ficheros del directorio

w escritura Escribir un fichero Crear ficheros

Renombrar ficheros

Borrar f]icheros

x ejecutar Ejecutar fichero Leer un fichero

Escribir un fichero

Ejecutar ficheros

2.2.-Comandos relacionados con grupos


Antes de pasar a ver como se modifican los perimisos es conveniente entender como
funcionan los grupos y algunos comandos relacionados con estos. En un sistema UNIX
pueden haber
definidos varios grupos. Para ver cuales son estos grupos podemos usar el comando:
dispgid (no funciona)

Para ver a que grupo pertenecemos ejecutamos:


groups

y si queremos saber a que grupo pertenece otro usuario:


groups username

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

Si queremos saber en que grupo estamos trabajando en un determinado momento usamos el


comando:
id

7
COMPUTACIÓN III
2.3.-Cambio de los permisos de acceso

Para cambiar los permisos de acceso de un fichero o directorio se utiliza el comando:


chmod mode `nombre del fichero o directorio'

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 al grupo a leer el fichero `file2'


g+r file2

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

2.3.1.-Cambiar permisos de acceso numéricamente


El cambio de acceso a ficheros puede hacerse de forma numérica. El permiso de lectura está
dado por el número 4, el de escritura por el 2 y el de ejecución por el 1.

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:

chmod 640 file1

3.-COMANDOS UNIX - LINUX


3.1.-Comandos
Lo primero que necesitamos es tener una cuenta. Cuando el administrador del sistema nos
abre una cuenta nos dará un username y un password. Para entrar en la cuenta escribimos
nuestro username donde pone login. Luego nos pide el password. Tanto el username como el
password son sensibles a mayúsculas o minúsculas.

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:

cp [-iprR] filename ...directory

Esta sintaxis tiene unas reglas simples. Aplicadas a la descripción del comando, se puede
entender cómo utilizar dicho comando.

3.1.1-Reglas de la sintaxis de un comando


Lo mejor para entender la sintaxis de un comando, es seguir las siguientes reglas:

. Toda opción o argumento encerrado entre [ ] es opcional.

. Las opciones o argumentos no encerrados entre [ ] son obligatorias

. 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.

3.1.2- Opciones de un comando


Las diferentes opciones determinan la forma de actuar el comando. Las opciones
generalmente consisten en una rayita (-) seguida de una letra.
Por ejemplo, el comando wc cuenta el número de palabras y líneas en un fichero. Cambiando
la opción, puede contar diferentes cosas:
wc -w file1 cuenta las palabras
wc -c file1 cuenta los caracteres
wc -l file1 cuenta las líneas

Utilización de opciones múltiples


Algunos comandos pueden ser utilizados con múltiples opciones. Estas opciones pueden
agruparse después de la rayita:

comando -abc argumento

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:

1. Uso de un comando sin argumentos: date


2. Comandos con un argumento simple: cd newdir
3. Comandos con varios argumentos: cat file1 file2 file3

3.2- DOS to UNIX Translation


A quick reference for users of DOS who are moving to UNIX. Look for a task or DOS
command and then select the UNIX command for further details.

To ... DOS UNIX


display list of files dir/w dir ls

dir ls -l

display contents of file type cat

display file with pauses type filename | more more

copy file copy cp

find string in file find grep

fgrep

compare files comp diff

rename file rename OR ren mv

delete file erase OR del rm

delete directory rmdir OR rd rmdir

11
COMPUTACIÓN III
change file protection attrib chmod

create directory mkdir OR md mkdir

change working directory chdir OR cd cd

get help help man

display date and time date, time date

display free disk space chkdsk df

print file print lpr

display print queue print lpq

3.3- Comandos comunes


Hay una serie de comandos que se usan muy frecuentemente que se describen brevemente en
las siguientes secciones.

3.3.1- MAN, el comando de ayuda


Nos permite obtener ayuda sobre cualquier comando (man nos muestra la página del manual
correspondiente al comando).
Típicamente las secciones que trae la ayuda son:

? NAME

? SYNOPSIS

? DESCRIPTION

? OPTIONS

? ENVIRONMENT

? EXAMPLES

? FILES

? SEE ALSO

? WARNINGS

12
COMPUTACIÓN III
? DIAGNOSTICS

? BUGS

por ejemplo ejecutando:


man man

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.

3.3.2-Comandos básicos relacionados con directorios


pwd
Nos muestra el directorio en que estamos trabajando.

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.

? Un número que indica el número de links al fichero.

? El propietario.

? El grupo al que pertenece.

? El tamaño en bytes

? La fecha de la última modificación

? 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.

Estos caracteres son:

Representa cualquier cadena de caracteres

? Representa un sólo caracter

[...] 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 ~

nos moverá los tres primeros a nuestro home.

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.

3.3.3-Comandos básicos relacionados con el manejo de ficheros


cp
Es el comando para copiar ficheros, por ejemplo:
cp [Link] ~/curso/[Link]
copia el fichero [Link] a /home/fcabrera/curso/ cambiandole el nombre a [Link] . La
opción -i nos preguntará si queremos que sobreescriba en el caso de que el nombre del
fichero coincida con el de otro fichero que ya existe. La opción -r permite copiar directorios
incluyendo todos los ficheros y directorios que cuelgan de él.

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.

3.3.4-Comandos útiles para trabajar con ficheros de texto son:

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:

head [Link] -> muestra las 10 primeras lineas


head -5 [Link] -> muestra solo 5 lineas

tail [Link] -> muestra las 10 ultimas lineas


tail -5 [Link] -> muestra las 5 ultimas lineas

grep
Busca un patrón de caracteres en uno o varios ficheros.
ej: grep lo que buscamos donde lo buscamos

grep [Link] [Link] -> muestra la linea donde ha encontrado [Link]


grep -c [Link] [Link] -> Cuantas veces aparece
grep - i [Link] [Link] -> No distingue entre minusculas o mayusculas

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:

sort [Link] -> ordena por la primera columna (columna 0)


sort +1 [Link] |more -> ordena por la segunda columna
sort -b +3 [Link] -> para ignorar los espacios en blanco
cat
Encadena una lista de ficheros escribiendolos uno a continuación de otro en la salida
estandar.
ej:

cat [Link] [Link]

3.3.5-Comandos útiles para examinar el espacio en disco memoria,


procesos, usuarios, etc
df
Para ver la cantidad de espacio en disco. La opcion -k nos lo da en kilobytes.

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.

3.4- Redirección de comandos y pipes


3.4.1- Redirección de comandos
Cualquier dispositivo conectado al sistema (impresoras, terminal, dispositivo de audio,
mouse, etc), es considerado por UNIX como un fichero.

Los comandos pueden necesitar leer y escribir información. Normalmente lo hacen en la


standard input y standard output que es el terminal. Sin embargo ambas pueden
redireccionarse a otros ficheros, tanto ficheros normales como dispositivos físicos.

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.

ps -feao ruser,pid,pcpu,etime,comm | sort -r +2 | more

ps muestra los procesos en un determinado formato, el resultado es ordenado por el comando


sort y se muestra por pantalla empleando el comando more .

El ejemplo:

tar -cvf /dev/rmt/0lbn . || (tar -cvf /scfratch/fcabrera/backup .; compress backup; cp


/net/oso/fcabrera/backup) &
Primero produce un backup del directorio en que estamos en un dispositivo magnético. En
caso de que fallara se haría un backup al disco de scratch y lo comprime para ahorrar espacio
y por último lo copia a otro disco.

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.

3.5.1-Las dobles comillas "


Veamos los siguientes ejemplos:
echo *
echo "*"
En el primer caso la shell sustituye * por los nombres de todos los ficheros en ese directorio
separadeos por espacios. En el segundo caso el resultado nos muestra por pantalla el caracter
*. Esto se debe a que las comillas impiden la sustitución de * por nombres de ficheros
tratandolo como un caracter sin significado especial.

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.

3.5.2- Comillas simples '


El uso de las comillas simples puede producir resultados diferentes como por ejemplo:
echo $shell

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.

Las comillas simple invertias `


El significado de las comillas invertidas es completamente diferente. Se emplea encerrando
en estas comillas un comando y el resultado es ejecutar el comando insertando la salida en el
punto de la línea de comandos donde se encuentra el comando. Por ejemplo:
echo La fecha de hoy es `date`

20
COMPUTACIÓN III
man `ls`

En el primer caso se ejecuta el comando date insertando el resultado al final de la frase. El


segundo dará probablemente error, pues tratará de buscar una página del manual de ayuda
para comandos que se llamen como cada uno de los ficheros del directorio. A no ser que
algún fichero tenga nombre de comando, el resultado será que no encuentra la página del
manual para cada nombre de fichero. Las comillas invertidas mantienen su significado dentro
de las dobles comillas, pero no dentro de las comillas simples.

3.6- Lista alfabética de los comandos UNIX más usuales


A
addbib - create or extend a bibliographic database
apropos - locate commands by keyword lookup
ar - create library archives, and add or extract files
at, batch - execute a command or script at a specified time
awk - pattern scanning and processing language
B
banner - display a string in large letters
basename - display portions of pathnames and filenames
biff - give notice of incoming mail messages
bin-mail, binmail - an early program for processing mail messages
C
cal - display a calendar
calendar - a simple reminder service
cat - concatenate and display
cb - a simple C program beautifier
cc - C compiler
cd - change working directory
checknr - check nroff and troff input files; report possible errors
chgrp - change the group ownership of a file
chmod - change the permissions mode of a file
clear - clear the terminal screen
cmp - perform a byte-by-byte comparison of two files
colcrt - filter nroff output for a terminal lacking overstrike capability
comm - display lines in common, and lines not in common, between two
sorted lists
compress, uncompress, zcat - compress or expand files, display expanded
21
COMPUTACIÓN III
contents
cp - copy files
cpio - copy file archives in and out
cpp - the C language preprocessor
csh - a shell (command interpreter) with a C-like syntax and advanced
interactive
features
ctags - create a tags file for use with ex and vi
D
date - display or set the date
dbx - source-level debugger
deroff - remove nroff, troff, tbl and eqn constructs
df - report free disk space on file systems
diff - display line-by-line differences between pairs of text files
du - display the number of disk blocks used per directory or file
E
echo - echo arguments to the standard output
ed, red - basic line editor
eqn, neqn, checkeq - typeset mathematics
error - categorize compiler error messages, insert at responsible source file
lines
ex, edit, e - line editor
expand, unexpand - expand TAB characters to SPACE characters, and vice
versa
expr - evaluate arguments as a logical, arithmetic, or string expression
F
file - determine the type of a file by examining its contents
find - find files by name, or by other characteristics
finger - display information about users
fmt, fmt_mail - simple text and mail-message formatters
fold - fold long lines for display on an output device of a given width
ftp - file transfer program
G
gcore - get core images of running processes
gprof - display call-graph profile data
22
COMPUTACIÓN III
grep - search a file for a string or regular expression
groups - display a user's group memberships
H
history - re-use previous command lines
hostname - show name of current host system
I
imake - C preprocessor interface to the make utility
indent - indent and format a C program source file
install - install files
J
join - relational database operator
K
kill - send a signal to a process, or terminate a process
L
last - indicate last logins by user or terminal
ld, [Link] - link editor, dynamic link editor
leave - remind you when you have to leave
less - opposite of more
lex - lexical analysis program generator
lint - a C program verifier
ln - make hard or symbolic links to files
login - log in to the system
look - find words in the system dictionary or lines in a sorted list
lookbib - find references in a bibliographic database
lorder - find an ordering relation for an object library
lp, cancel - send/cancel requests to a printer
lpq - display the queue of printer jobs
lpr - send a job to the printer
lprm - remove jobs from the printer queue
ls - list the contents of a directory
M
mail, Mail - read or send mail messages

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.

A cada proceso le corresponde un número llamado PID. Cuando se inicializa el sistema se


crea un único proceso perteneciente a root, que a su vez va a crear otros subprocesos en una
estructura jerárquica. También al entrar en nuestra cuenta ocurre lo mismo, se crea un
proceso del que van a colgar una serie de subprocesos. Cada proceso puede tener muchos
subprocesos (child process) y un sólo proceso padre (parent process).

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.

Mientras se ejecutan los procesos en el background se puede seguir usando la shell. Si el


proceso produce alguna salida por la terminal, la podemos redireccionar para que no
interfiera en lo que estemos tecleando en la shell (también se puede redireccionar los errores).
Por ejemplo:
du -k > file &

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.

4.1- Control de procesos


Hay varios comandos que permiten obtener información de los procesos que se están
ejecutando. Los más útiles son ps y top que veremos ahora con algo más de detalle.
ps
Nos da información sobre el estado de los procesos y tiene una gran variedad de opciones. Si
lo ejecutamos sin opciones nos muestra información sobre nuestros procesos asociados al
terminal. La salida muestra el PID, el terminal, el tiempo de CPU utilizado y el nombre del
comando.

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):

UID (f,l) Nombre del usuario


PID (f,l) Número de identificación del proceso
PPID (f,l) Número de identificación del proceso padre
STIME (f) La hora de comienzo del proceso
TTY (f,l) El terminal
TIME (f,l) Tiempo de CPU
CMD (f,l) El nombre del comando
S (l) El estado del proceso
PRI (l) La prioridad del proceso
NI (l) El valor de nice para calcular la prioridad
ADDR (l) La dirección de memoria del proceso
SZ (l) La cantidad de memoria que esta ocupando

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).

Para ejecutar un proceso con menor prioridad se usa el comando:


nice -n comando
n es el incremento que le damos al valor de nice y por tanto no podra ser mayor que 20. Si no
damos valor a n, se asume un valor de 4.

Para bajar la prioridad de un proceso se ejecuta el comando:


renice n PID
n es el valor de nice que vamos a dar al proceso que tendrá que ser mayor que el valor que
tenga el proceso. PID es el número identificador del proceso.

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.

4.3- Matar procesos


Cuando queremos teminar un proceso tenemos varias formas de hacerlo. La más sencilla es
utilizar CTRL-C, si el proceso esta en el foreground.

Un proceso en el background podemos matarlo con el comando kill. Por ejemplo:


kill %2
mata el proceso que tiene como número de trabajo el 2 (no el PID).

Para matar un proceso cualquiera utilizamos:


kill PID
que tendría el mismo efecto que utilizar CTRL-C

Si esto no funciona podemos usar:


kill -1 PID
que tendría un efecto sobre el proceso igual a que si nos salimos de la cuenta, e intentará
además matar todos los subprocesos que cuelgan de él.

Si esto tampoco funciona se usa:


kill -9 PID
que matará el proceso (aunque es posible que queden subprocesos).

4.4-Lanzando procesos a determinadas horas


Es posible lanzar procesos de forma que se empiecen aejecutar a una determinada hora. Por
ejemplo si vamos a ejecutar procesos que van a utilizar mucho tiempo de CPU, es
aconsejable hacerlo de forma que se ejecuten por la noche, cuando normalmente habrá menos
usuarios y evitaremos colapsar las máquinas. Es posible hacerlo de forma que se ejecuten
periodicamente o simplemente hacer una cola de comandos que se van ejecutando
secuencialmente cuando el nivel de carga del sistema lo permite.

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.

El comando crontab tiene varias opciones:


crontab filename
Copia el fichero filename como la tabla crontab. Las modificaciones que hagamos en
filename no tendrán efecto hasta que no ejecutemos el comando.
crontab -e
Permite editar la crontab que tengamos definida.
crontab -l
Permite ver la crontab que tengamos definida.
crontab -r
Borra la crontab.

5.- DISPOSITIVOS EXTERNOS


En esta sección se explicarán algunos comandos para utilizar varios de los dispositivos
conectados al sistema que se usan más frecuentemente (impresoras, dispositivos magnéticos,
floppies).

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.

fsf Avanza n marcas de EOF y se posiciona en el


primer bloque del siguiente fichero.

bsf Retrocede n marcas de EOF y se posiciona al


principio de la marca de EOF.

nbsf Retrocede n ficheros. Es equivalente a bsf n+1


seguido de fsf 1.

asf Equivalente a rebobinar y luego fsf n.

eom Se sitúa al final de la parte grabada de la cinta.

rewind Rebobina la cinta hasta el principio.

offline Saca la cinta del dispositivo.

status Da información del estado del dispositivo.

erase Borra la cinta.


Las marcas de EOF, son marcas que se graban cada vez que escribimos un fichero en la cinta.

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.

r Escribe ficheros al final del tarfile.

t Permite ver que ficheros contiene el tarfile. Con la


opción -v ofrece más información similar a un ls -l.
u Actualiza los ficheros del tarfile que han sido
modificados o los que han sido creados después de la
última actualización del tarfile.
x Extrae ficheros del tarfile.
Además de estos cinco argumentos hay otras opciones importantes:
f Indica el nombre del dispositivo o del fichero
tar que se va a crear.
v Da información por la terminal de los ficheros
con que está trabajando.
m No extrae los tiempos en que fueron modificados
los ficheros, sino que el tiempo de la última
modificación será el de la extracción.
h Sigue los link simbólicos a otros directorios o
ficheros.
Veamos algunos ejemplos sencillos:

tar tvf /dev/rmt/3bn


Nos muestra los ficheros que hay en la cinta del dispositivo /dev/rmt/3bn. Sólo nos mostrará
el primer tarfile que haya en la cinta. Si hay más ficheros grabados tenemos que mover la
cinta al siguiente tarfile y volver a ejecutar el comando.

tar cvf /dev/rmt/4bn .


Crea un tarfile en la cinta del dispositivo /dev/rmt/4bn, donde se archivarán todos los
ficheros en el directorio en que estemos y todos los subdirectorios que cuelguen de él.

tar xvf [Link]


Extrae los ficheros del tarfile [Link] y los pone en el directorio en que estamos.

tar uvf /dev/rmt/1bn .


Graba al final del tarfile los nuevos ficheros del directorio y los que han sido modificados
depués de la última versión que contiene el tarfile de los ficheros. Si se trata de una cinta hay
que tener la precaución de que no haya nada grabado después, ya que se borraría al aumentar

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.2.1.-Nombres de los dispositivos


Para ver la lista de los dispositivos magnéticos disponibles en el IAC podemos mirar las
páginas Web del centro de cálculo. Los nombres de los dispositivos magnéticos conectados a
una máquina empiezan por /dev/rmt/. Depués viene un número que corresponde al
dispositivo que vamos a usar. Luego hay varias opciones, si el dispositivo admite que le
indiquemos la densidad, va una letra (l baja, m media, h alta, u ultra, c compresión). Depués
añadimos una b, de no hacerlo una sola marca EOF indicaría el final de la cinta. Luego
podemos añadir una n que evita que se rebobine la cinta después de cualquier operación. Así
pues, un dispositivo DAT tendrá típicamente por nombre algo similar a /dev/rmt/2bn.

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:

! cr macdef proxy send


$ delete mdelete sendport status
account debug dir put struct
append dir mget pwd sunique
ascii disconnect mkdir quit tenex
bell form mls quote trace
binary get mode recv type
bye glob mput remotehelp user
case hash nmap rename verbose
cd help ntrans reset ?
cdup lcd open rmdir
close ls prompt runique

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.

mkdir y rmdir ->Respectivamente crean y borran un 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.

delete y rename -> Respectivamente borran y renombran ficheros en la máquina remota.

! -> Ejecuta un comando UNIX en la shell local. Por ejemplo:


!ls
hace un listado del directorio en que estamos de 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 .

6.2- rlogin y telnet


Estos dos comandos nos permiten conectarnos a otra máquina y trabajar en ella, siempre que
tengamos cuenta en esa otra máquina. Normalmente se usará telnet para conectarnos a
máquinas externas mientras rlogin se usa para conectarnos a una máquina local. En ambos
casos la sintaxis es el comando seguido del nombre de la máquina.

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.

6.3.1-Enviar mensajes desde UNIX


La sintaxis del comando puede tener las siguientes formas:
mail usuario1 usuario2 usuario3 ....
mail usuario1 usuario2 .... < file

En la primera opción enviaremos un mensaje que escribimos en la terminal. Puede ser


enviado a uno o varios usuarios. La forma de indicar el usuario al que va dirigido es con el
username si es un usuario local y username@system_name si es a un usuario de otro sistema.
Por ejemplo si alguien quiere enviarme un mail desde fuera del cca, deberá poner toda la
dirección:

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.

Si queremos enviar un fichero en formato binario, tenemos que pasarlo previamente a


formato ASCII con el comando uuencode como se explicó anteriormente.

6.3.2-Leer mensajes desde UNIX


Para ejecutar el comando mail en modo de recibir, tecleamos mail sin argumentos. El prompt
nos cambiara a ? y ahi podremos teclear una serie de comandos propios de mail. Se indican a
continuación los más útiles:
? Muestra una ayuda sobre los comandos
# Nos muestra el número del mensaje que estamos viendo
- Muestra el mensaje anterior
+ Muestra el mensaje siguiente
! cmd Ejecuta un comando en la shell
a Nos sitúa en el último mensaje y nos dice si hay nuevos
mensajes
d [#] Borra un mensaje (por defecto en el que estamos)
h a Muestra todas las cabeceras
h d Muestra las cabeceras de los mensajes seleccionados para borrar
h [#] Muestra las cabeceras de los mensajes cercanos al actual
m user Envía uno de los mensajes a un usuario y lo borra
p Muestra un mensaje que tiene algun contenido binario
que normalmente no se muestra
P Muestra la cabecera completa
q, ^D Sale del programa
r [args] Responde un mail y lo puede enviar a otros usuarios[args]
s [files] Mueve un mensaje a un fichero (por defecto a mbox)
u [#] Recupera un mensaje borrado
w [files] Guarda un mensaje en un fichero sin la cabecera
x Sale del programa ignorando los cambios que hayamos hecho

(El caracter # representa el numero de un mensaje)


Los mails que recibimos se guardan en el directorio /var/mail/, donde cada usuario tiene un
fichero donde se almacenan. Cuando los leemos debemos ir pasandolos a directorios propios
para no ocupar demasiado espacio en este directorio común. Cuando los gravamos a los
ficheros nuestros, no se borrarán realmente de /var/mail hasta que salgamos del programa
mail con una opción que realize los cambios, como q. Si salimos con la opción x no se
40
COMPUTACIÓN III
realizarán los cambios que hayamos hecho, es decir los mails que hayamos borrado seguirán
estando. Otros lectores de mail tienen también opciones parecidas.

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.

7.1.- Combinación de teclas


EMACS incluye un amplio rango de combinación de teclas para hacer diferentes
operaciones. A continuación listamos las comunes.

41
COMPUTACIÓN III
7.1.1.- Combinaciones importantes

Ctrl+x + Sale de EMACS. Si no hemos salvado los cambios, preguntará si realmente


Ctrl+c queremos salir o salvar primero.

Esc+! Permite ejecutar comandos UNIX sin salir de EMACS

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

Ctrl+g Cancela la última conmbinación de teclas dada a EMACS

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]

8.2.- Interacción con el usuario


8.2.1.- Leer un valor desde teclado -> Para introducir una palabra desde teclado se utiliza
$<, y para un número es similar.
Ej: #!/bin/csh
clear
echo " "
echo " Cual es tu nombre ?:"
set nombre = $<
echo "Y tu edad?:"
@ edad = $<
8.2.2- Escribir en un fichero -> Para escribir algo en un fichero se utiliza el pipe >. Si el
fichero ya existe y se quiere añadir algo al final, se utiliza >>.
Ej: #!/bin/csh
clear
echo " "
echo " Cual es tu nombre ?:"
set nombre = $<
echo "Tu nombre es:" $nombre > [Link]
echo "Y tu edad?:"
@ edad = $<
echo "Tienes" $edad "años" >> [Link]
EJERCICIO:

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

- Resta dos números

* Multiplica

/ Divide

% Divide y saca el resto

Ej: @ a = 47
@ b = 32
@ suma = $a + $b
@ resta = $a - $b
@ producto = $a * $b
@ divide = $a / $b
@ resto = $a % $b

8.3.2.- Operadores lógicos

Operador Operación
! Operador NO

&& Operador Y

|| Operador O

8.3.3.- Operadores de comparación

44
COMPUTACIÓN III

Operador Operación

== Igual a

!= No igual a

> Mayor que

>= Mayor o igual a

< Menor que

<= Menor o igual que

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

Si queremos ejecutar diferentes instrucciones de pendiendo de si la condición es verdadera o


falsa, se utiliza el comando else

if (condición) then
instrucción1
else
instrucción 2
endif

También podemos hacer condionales con varias condiciones

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

Escribir un pequeño menú de opciones:

#!/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

8.6.- El WHILE loop


El While loop tiene la siguiente sintaxis:
while (condition)
Instruction
end

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:

Supongamos que tenemos un programa y queremos que si en un lugar determinado hay un


error nos lo diga, pero asegurándonos de que leeremos el mensage en pantalla.

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

8.7.- El FOREACH loop


Imagina que quieres escribir una misma carta a varias personas. El comando foreach se
utiliza para este tipo de situaciones.
La sintaxis es la siguiente:

foreach variable (lista)


Instruccion
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

8.8.- Salida de bucles


Los bucles seguirán ejecutándose hasta que la condición sea falsa. Para romper un bucle antes
de que la condición cambie, podemos utilizar el break
Ej:

#!/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

Buscar un Añadir un nuevo Modificar la Imprimir la


teléfono teléfono agenda agenda

Salir del programa


8.9.1.- Como hacer los subprogramas
Podemos mencionar algunas reglas para escribir subprogramas:

1. Las instrucciones deben aparecer en el subprograma en el orden en el que queramos que


nuestro programa las ejecute.
2. Cada subprograma debe ser grabado en un fichero diferente.

3. Cada subprograma debe ser convertido a un fichero ejecutable utilizando el comando


chmod.

4. El subprograma debe ser probado antes de incluirlo en el programa, y no incluirlo hasta


que hayamos solucionado todos los problemas que pueda tener.

5. Es conveninte asignar un nombre adecuado al subprograma, que nos de idea de lo que


hace.

Ejercicio: Hacer una pequeña agenda de telefonos utilizando subrutinas.

#!/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

8.10.- Busca de información con AWK


El comando o utilidad AWK es la más popular herramienta entre los programadores para
hacer búsquedas dentro de bases de datos. Este comando consta de dos partes:
(a) El patrón de búsqueda
(b) Los datos que queremos mostrar

La información que buscamos en una base de datos es lo que se denomina expresión de


búsqueda. La expresión de búsqueda le dice al ordenador como identificar las columnas en la
base de datos que queremos ver. La expresión de búsqueda debe aparecer al principio del
comando AWK y debe estar encerrada entre barras inclinadas a la derecha ( slash / ).
Ej:

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 especificar la columna en la que queremos realizar la búsqueda:

awk '$11 ~ /^galaxia*/ {print $4,$5}' [Link]

$11 representa la columna en la que estamos haciendo la búsqueda.


La tilde ( ~ ) le dice al ordenador que estamos haciendo una búsqueda. Es igual que el
operador == que utilizamos con if.
52
COMPUTACIÓN III
El caracter ( ^ ) le dice al ordenador que haga la búsqueda al principio de la columna.
El asterisco ( * ) le dice al ordenador que no importa que haya otros caracteres en esa
columna junto con los que buscamos.

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]

9.-CONFIGURACION DEL ENTORNO


El entorno de trabajo queda definido mediante los valores que la shell encuentra en los
ficheros de inicialización que se leen cada vez que entramos en la cuenta o empezamos una
nueva shell. En general en los ficheros de configuración suelen definirse variables locales (o
de shell) y variables de entorno, definir alias e incluir comandos que queramos que se
ejecuten al entrar en la cuenta o la nueva shell.

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:

set varname = value


set varname

En el primer caso asignamos un valor a una variable esté o no definida anteriormente, por
ejemplo:
set prompt="(%M)%~%% "

define lo que aparece al principio de la línea de comandos. %M es el hostname. %~ El


directorio en el que estamos pero representando nuestro home por ~ y %% añade el caracter
% al final. Cada shell usa símbolos distintos para definir el prompt,.

En el segundo caso simplemente se define una variable. Por ejemplo:


set noclobber
53
COMPUTACIÓN III
define la variable noclobber. Si esta variable esta definida no permitirá sobreescribir un
fichero si redireccionamos la salida de un comando a un fichero que ya existe.

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

9.1-Donde definir las variables


Cada vez que empezamos una nueva shell se ejecuta un fichero de configuración que depende
de la shell en cuestion:
Bourne Shell .profile
C Shell .cshrc
TC shell .tcshrc
Korn Shell .kshrc
BASH .bashrc
Es en estos ficheros donde debemos definir las variables locales que se lae llama también
variables de la shell. Por convención, para estas variables se usan letras minúsculas, mientras
para las variables de entorno se suelen usar mayúsculas. Hay que tener en cuenta que en cada
shell hay variables que tienen significados especiales solamente en esa shell, por esto la
definición de estas variables debe hacerse en estos ficheros y no en el .login.

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.

Hay algunas diferencias de sintaxis dependiendo de la shell que empleemos (supondremos


que usamos una TC shell). Para definir los alias se usa el comando:
alias nombre definicion

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'

Si lo ejecutamos en la línea de comandos sólo tendrá validez en esa shell. Si queremos


definirlo de forma que quede permanentemente asignado lo debemos incluir en el fichero
.tcshrc o cualquier otro fichero que el .tcshrc ejecute. En la definición de los alias podemos
no sólo hacer referencia a comandos sino también a otros alias.

En el primer ejemplo definimos el comando lf que será equivalente al comando ls con la


opción -F (esta opción añade una / después del nombre del fichero si es un directorio, un * si
es un ejecutable, un @ si es un link).

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.

También se pueden pasar argumentos al alias desde la línea de comandos. Cuando


ejecutamos un alias podemos poner una serie de argumentos que se interpretan como si
estuvieran inmediatamente depués de la definición del alias. Por ejemplo:
alias k9 'kill -9'
k9 17313
Al ejecutar esta última línea se matará el proceso 17313.

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 cancelar la definición de un alias se usa el comando unalias name. Si queremos


cancelar la definición definitivamente, tendremos que borrarlo del fichero .tcshrc.

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'

Al ejecutar rm * se ejecuta en realidad el comando rm -i * que nos va pidiendo confirmación


de si queremos borrar realmente los ficheros. El problema puede presentarse si nos abren una
cuenta en otro sistema donde no hayamos definido este alias y al ejecutar rm * nos borrara
todos los ficheros sin pedir confirmación. Para evitar esto es mejor definir el alias con otro
nombre como del o rmi.

56

También podría gustarte