Professional Documents
Culture Documents
PROLOGO
Este curso ha sido el resultado de algunas de las cosas que he ido aprendiendo
sobre UNIX a lo largo del tiempo. He considerado oportuno comenzar por un curso
básico con el fin de asentar algunas ideas, sobre todo en nuevos usuarios. Quien
sabe, quizás algún día escriba otro más avanzado, o continue ampliando este.
El curso no está pensado como un manual, como podreis observar apenas hablo
de las opciones de los comandos, pues considero que para ello existen manuales
(incluido el manual en línea man) muy buenos (Guias o Manuales de referencia,
de usuario, administración, programación, etc.). Más bien ha sido pensado como
un resumen de tareas habituales, intentando aclarar ideas para cualquier sistema
UNIX.
Finalmente quiero invitaros a que aporteis ideas, dudas, y por que no, información
para que sea compartida por todos. Quizás así consigamos hacer entre todos un
gran curso.
1. Prólogo al Curso
2. Introducción
3. DOS vs UNIX
4. Estructura de los comandos
5. Lista de Comandos
6. Acceso al sistema
7. Accesos Remotos
8. Variables de Entorno
9. Comillas y más comillas
10. Sistemas de Archivos
11. Procesos
12. Programación de Tareas
13. Tuberias y Redirecciones
14. Expresiones Regulares
15. Estamentos
16. Variables Especiales
17. Shell Scripts
18. Editor vi
19. Sed
20. Awk
21. CGI's
22. Versiones de UNIX. Algunos Enlaces
23. Algunas ideas y ejemplos
INTRODUCCION
Un sistema operativo es la parte software encargada de gestionar los recursos hardware del
sistema y proporciona la base sobre la que se pueden escribir programas de aplicación.
Entre las funciones típicas de un Sistema Operativo, se pueden destacar:
• Gestión de la memoria
• Control de las operaciones de Entrada y Salida
• Tratamiento de Interrupciones
• Control del Sistema
• Establecimiento de prioridades y ejecución de procesos
Como ejemplos de sistemas operativos tenemos DOS, OS2, UNIX, MVS, etc.
El hardware solo se puede controlar a través de ceros y unos. Esto resulta complicado de
manejar para cualquier usuario. Para simplificar estas tareas los ordenadores equipan en
memoria ROM (solo lectura) una serie de instrucciones, de 50 a 300, en ensamblador
(jump, move, add, etc.) que se traducen directamente a código binario.
Por encima del sistema operativo se encuentran aplicaciones y programas, que utilizan los
servicios proporcionados por el sistema operativo. Como ejemplos de aplicaciones nos
encontramos con Windows, PowerPoint, cualquier juego, etc.
Los ordenadores los podemos clasificar según su potencia de menor a mayor en:
DOS vs UNIX
DOS no se adapta a cada hardware, mientras que UNIX si, aunque será necesario
recompilar el núcleo o Kernel. Esto hace que UNIX sea transportable, que se pueda instalar
en máquinas con hardware muy diferente, con solo unas modificaciones mínimas.
El kernel de UNIX se debe recompilar cada vez que se añada un disco, se modifiquen
parámetros del sistema, se modifiquen los sistemas de archivos de swap o root, o los
dispositivos de consola entre otros. El tiempo necesario para la recompilación dependerá de
la potencia del sistema, de la cantidad de dispositivos que tenga incorporados, etc., pero no
suele ser un tiempo excesivo. En cualquiera de los casos, el sistema operativo se adapta al
hardware existente en la máquina en cada momento. La recompilación puede realizarse
manualmente o automáticamente, dependiendo del desarrollador y de la versión de UNIX
que se tenga.
En DOS en cambio, cada vez que se añade algún hardware nuevo, habrá que instalar los
drivers necesarios para el funcionamiento del dispositivo, como un parche o programa
residente en memoria.
Las máquinas DOS en general son menos potentes que las máquinas UNIX, si bien es
posible encontrar UNIX en máquinas DOS (Linux).
Las máquinas que funcionan con DOS han de ser reiniciadas mucho más frecuentemente
que las máquinas UNIX, si bien es cierto que el tiempo necesario para ello es muy inferior.
En UNIX una unidad lógica o partición puede ocupar varios discos duros o parte de ellos,
mientras que en DOS cada unidad lógica puede ocupar como mucho un disco, y hasta hace
poco tiempo no podía gestionar unidades superiores a 512 MB.
DOS exige, al usuario, unos conocimientos menores que UNIX, así como unas menores
tareas de administración, lo cual lo hace ideal para el público en general. Además dada la
gran aceptación que ha tenido, existe una gran cantidad de programas y utilidades que
hacen aun más sencillo el manejo del ordenador.
Un comando se puede considerar como un programa del sistema operativo que realiza una
acción determinada, es decir, que hace algo. Los comandos pueden llevar opciones,
argumentos o no, y en caso de llevarlas han de ir separadas por espacios o tabuladores.
UNIX es un sistema operativo, a diferencia de DOS, en donde se diferencia entre
mayúsculas y minúsculas, y en donde por tanto habrá que prestar especial cuidado a la hora
de introducir los comandos. Por lo general los comandos suelen escribirse en minúsculas.
Las opciones son modificadores del comando, que pueden hacer que solo presente una
información determinada o que la presente de una u otra forma. El prefijo utilizado en
UNIX para las opciones, generalmente, es el "-", aunque también se pueden encontrar casos
con "+". En DOS el prefijo usado para las opciones es "/". No debe existir espacio entre el
prefijo y la opción. Un prefijo puede ser válido para varias opciones simultáneamente.
Los argumentos indican al comando sobre qué se debe ejecutar la acción, por ejemplo el
nombre de archivo, usuario, etc. Los argumentos no llevan prefijo lo cual sirve para
diferenciarlos de las opciones.
Ejemplos:
Se pueden ejecutar varios comandos desde una misma línea de comandos, para ello habrá
que separarlos mediante el carácter punto y coma ";".
Para que la salida de un comando se pueda utilizar como entrada del siguiente habrá que
utilizar lo que se denomina redirecciones, y merecen un tratamiento diferente.
LISTA DE COMANDOS
A continuacón se muestra una lista con los comandos más habituales en UNIX, así como
una breve descripción de dicho comando. Para ampliar la información de cualquiera de
ellos se recomienda acudir a la ayuda de sistema (man comando) o en cualquier Reference
Manual de UNIX (Manual de Referencia).
ACCESO AL SISTEMA
Para acceder al sistema hay que introducir una identidad de usuario o login, y una clave
secreta o password. El login de usuario es único dentro de un sistema y tiene asociado un
número llamado identidad de usuario, es decir, no pueden existir 2 usuarios con el mismo
login. Por el contrario, dos usuarios diferentes pueden tener la misma clave secreta o
password (por lo general ellos lo ignorarán). Cuando se escribe el login, para acceder a un
sistema, este es visible en la pantalla, en cambio cuando se escribe el password no, o bien
se muestran asteriscos, con el fin de que no pueda ser visualizado por nadie (al mostrar
asteriscos, puede dar pistas sobre el número de caracteres de esta clave, por lo cual no es un
buen método). La clave de un usuario solo podrá ser cambiada por el propio usuario, y
dentro de unas restricciones existentes, y por root, que es el superusuario y carece de
restricciones.
Tanto el login como la password pueden contener letras como números algunos caracteres
de puntuación, etc., y en ocasiones tienen limitado su tamaño entre un mínimo y un
máximo (normalmente 6 como mínimo y 8 como máximo).
Cada usuario tiene asignado un directorio de trabajo. Varios usuarios pueden tener asignado
el mismo directorio de trabajo, aunque no es lo común.
Así mismo cada usuario tiene asignado un tipo de shell o interprete de comandos. Entre los
tipos de shell más conocidos tenemos ksh, csh, sh, bash, rsh, tcsh, etc.. La diferencia entre
ellas estriba en las utilidades que aportan al usuario, como recuperación de comandos,
variables de entorno, etc.. Si un usuario, en lugar de un interprete de comandos tuviera
asignado un programa, cada vez que accediera al sistema, solo podría ejecutar ese programa
o aplicación, y abandonaría el sistema cada vez que finalizara dicho programa.
Una vez comprobada la validez del acceso, el sistema ejecuta una serie de acciones,
detalladas en el profile general del sistema (/etc/profile por lo general), y que son generales
para todos los usuarios. Entre las acciones principales se pueden destacar:
Una vez ejecutado el profile general, podrá ejecutarse el profile ( .profile ) particular de
cada usuario, con el cual se completará la definición del entorno del usuario Entre las
acciones que se pueden encontrar en este archivo destacan:
ACCESOS REMOTOS
Es posible acceder de una máquina a otra siempre y cuando exista un camino físico por el
que hacerlo, un cable directo, una red, etc.
Para que un usuario de un sistema determinado pueda acceder a un sistema remoto será
necesario que tenga una cuenta de usuario en dicho sistema, y que los accesos remotos
estén permitidos.
ping [DIR-IP]
Para saber si un sistema es accesible por su nombre se puede consultar el archivo /etc/hosts
en el que se identifican los nombres de los sistemas con su dirección IP.
Existen diferentes comandos para acceder a sistemas remotos, entre los que destacan:
Así mismo existen comandos para transferencia de archivos de un sistema a otro sin
necesidad de establecer una sesión directamente en el sistema remoto, entre los que
destacan:
También se puede enviar y recibir correo de usuarios de otros sistemas, para ello, habrá que
indicar el nombre del usuario de destino y el nombre del sistema, con una nomenclatura
como la usada en Internet:
usuario@host
Por motivos de seguridad, cada vez que se intenta acceder a un sistema se pedirá login y
password. Existe la posibilidad de que no se pida, cuando se ejecute rlogin, rcp o remsh, y
consiste en generar un archivo, bajo el directorio de usuario de la máquina remota, llamado
.rhost, en el que se especifica los hosts o sistemas y usuarios que pueden acceder como el
usuario propietario de dicho directorio. Los nombres de sistemas definidos deben coincidir
con los definidos en el archivo /etc/hosts.equiv . Esto es útil sobre todo cuando el nombre
de usuario coincide en los dos sistemas. Si el nombre de usuario fuera diferente, habría que
especificar en el comando de conexión el nombre del usuario del sistema remoto para evitar
la petición de password.
Se pueden habilitar o inhabilitar usuario y/o sistemas con los signos "+" y "-".
VARIABLES DE ENTORNO
Las variables de entorno, como su nombre indica son variables, pueden ser diferentes para
cada usuario, y permiten personalizar el entorno UNIX a gusto del usuario.
Por lo general, parece que por convenio, en UNIX las variables de entorno se escriben en
mayúsculas (no hay nada que impida que vayan en minúsculas, salvo evitar confusiones
con comandos). Las llamadas a las variables de entorno se realizan anteponiendo el signo
"$" al nombre de la variable ($HOME, $PS1, etc.). Las variables de entorno no pueden
contener el carácter "$" ni espacios, salvo en el valor, siempre y cuando este se presente
entrecomillado.
En UNIX existen unas variables de entorno básicas, que son necesarias para que el usuario
pueda trabajar adecuadamente. Además, tanto el propio usuario como algunos programas
que este ejecute, pueden generar nuevas variables de entorno. Podemos así distinguir entre
variables de entorno generales y variables de entorno particulares.
Las variables de entorno generales difieren poco, en cuanto a nombre se refiere, entre los
distintos sistemas UNIX, y expresan lo mismo en cada sistema.
Y si se desea exportar esta variable, para que sea visible fuera del programa, habrá que
hacer:
export NOMBRE
o
export NOMBRE=valor
echo $NOMBRE
• EDITOR : Variable que almacena el editor que usará el usuario por defecto.
• ENV : Variable que almacena el archivo en donde el usuario ha definido sus aliases
y funciones.
• HOME : Variable que almacena el directorio del usuario, desde el que arrancará la
shell cuando entra en el sistema.
• HOSTNAME : Variable que almacena el nombre de la máquina.
• LOGNAME : Variable que almacena el nombre o login del usuario.
• MAIL : Variable que almacena el archivo que contiene el correo de usuario.
• MAILCHECK : Variable que indica cada cuantos segundos debe comprobarse si el
usuario tiene correo.
• PATH : Variable en la que se encuentran almacenados los paths de aquellos
directorios a los que el usuario tiene acceso directo, pudiendo ejecutar comandos o
programas ubicados en ellos sin necesidad de acceder a dicho directorio.
• PS1 : Variable que almacena el prompt que se empleará por defecto en la shell.
• PS2, PS3, etc. : Variable que almacena el prompt que se empleara en la 2ª, 3ª, etc.
Subshells, lo cual se hace invocando a la shell,es decir, ejecutando por ejemplo, ksh.
• PWD : Variable que almacena el directorio actual, puede ser útil para modificar el
prompt (PS1) dinámicamente.
• SHELL : Variable que almacena el interprete de comandos que usa el usuario.
• TERM : Variable que almacena el tipo de terminal desde el que se está trabajando.
• TMOUT : Variable que almacena el tiempo de inactividad que se permite al usuario
antes de que el sistema le cierre la sesión.
Por ejemplo:
A = 'cat prueba'
B = "cat prueba"
C = ´cat prueba´
Al teclear:
echo $A
aparecerá el mensaje:
cat prueba
echo $B
Pero al teclear:
echo $C
do
Lo que sea
done
do
Lo que sea
done
Este segundo caso presenta la ventaja de ser independiente de los archivos que existan en el
directorio, pues se recogerá cualquier modificación que se dé en dicho directorio, mientras
que en el primer caso, el bucle se ceñirá a los archivos especificados, si no existen dará
error, y si se genera alguno nuevo no se tendrá en cuenta.
SISTEMAS DE ARCHIVOS
UNIX es un sistema operativo, al igual que DOS, en el que la organización de los archivos
es jerárquica, organizada en directorios, presentando una estructura en forma de árbol, en
donde los directorios son ramas y los archivos hojas. El directorio raíz (/) es el directorio
principal, del que cuelgan subdirectorios, de los que a su vez cuelgan otros directorios o
subdirectorios, etc.. En principio se puede suponer que no existe limitación en cuanto a
amplitud como profundidad de la estructura, pero en realidad si existe dicha limitación,
dependiendo esta de la versión, del espacio en disco disponible, etc.
Mientras en DOS una unidad lógica no puede extenderse más allá de la unidad física, es
decir, no puede ser mayor que la unidad física, en UNIX si puede extenderse a varias
unidades físicas, si bien esto depende de la versión de UNIX que se tenga cargada.
En UNIX existe una estructura de directorios que difiere poco de un sistema a otro. Entre
los directorios más comunes tenemos:
Para acceder a un directorio se puede utilizar el path o camino relativo o absoluto. El path
absoluto se referencia al directorio raíz, por lo que siempre comenzará por el carácter "/"
indicativo del directorio raíz. El path relativo, en cambio, se referencia al directorio en que
se encuentra el usuario en ese momento (comenzará por ".." si se refiere al directorio
superior al actual, o por "." o el nombre de un subdirectorio si se refiere al un subdirectorio
del directorio actual).
Al ejecutar el comando "ls -l" nos aparecerá al principio de cada línea una información del
tipo:
El primer carácter hace referencia al tipo de archivo. El primer grupo rwx hace referencia al
usuario propietario del archivo. El segundo grupo corresponde a los usuarios que
pertenecen al mismo grupo que el propietario. El tercero pertenece al resto de usuarios.
Root tiene acceso ilimitado a todos los archivos, aunque no tengan activado ningún
permiso. Si aparece la letra indica que está permitido ese permiso, y si aparece un guión
indica que está prohibido.
• - : archivo normal.
• b : archivo controlador de dispositivo orientado a bloques.
• c : archivo controlador de dispositivo orientado a caracteres.
• d : directorio.
• l : enlace simbólico
Para cambiar los permisos de un archivo se utiliza el comando chmod (change mode):
chown fulanito[:grupo] hace que fulanito pase a ser el propietario de archivo. Se puede
archivo especificar también el grupo.
hace que el grupo users sea considerado como grupo del
chgrp users archivo
propietario
• s (Bit s): Hace que cualquier usuario que ejecute el programa adquiera la identidad
del propietario durante la ejecución. (4000). También se puede hacer que el usuario
que lo ejecute pase a ser del grupo del propietario durante la ejecución (2000).
• t (Sticky bit): Hace que el programa se lea la primera vez de disco, y quede
residente en memoria, con lo que la próxima vez que se ejecute se cargará más
rápidamente (1000).
• Los enlaces físicos son una copia del archivo, pero cada modificación que se haga
en un archivo se actualizará en el otro, el contenido del archivo no se perderá hasta
que no se borren todos los enlaces. Los enlaces que se generan con el comando ln,
por defecto son físicos.
• Los enlaces simbólicos, en realidad son accesos directos al archivo (denominación
usada en Windows 9X), y si se borra el archivo queda el enlace referido a un
archivo inexistente. Para ello la opción a utilizar con el comando ln es -s.
PROCESOS
• Código
• Datos
• Pila
• Registro
• Información general
Todo proceso, excepto el proceso raíz (el que tiene pid 0), tiene un proceso padre, que se
puede definir como el proceso desde el cual se lanza el proceso hijo. Cuando finaliza un
proceso padre y los hijos no finalizan adecuadamente, estos quedan activos, pero adoptando
como padre al proceso raíz (el de pid 0). Estos procesos se denominan zombies.
Cada vez que se ejecuta un proceso no se retorna a la shell hasta que este no finalice, salvo
que el proceso se ejecute en segundo plano o background, lo cual se realiza posponiendo el
carácter "&" después de la línea de comando. En caso de ejecutar procesos en background,
es conveniente redirigir las salidas hacia alguna variable de entorno o archivo con el fin de
que la salida del comando no interfiera con las acciones del usuario. El número de
programas que se pueden lanzar en background dependerá de los permisos del usuario, así
como de los parámetros configurados para cada UNIX. Cada vez que se lanza un comando
en background el sistema devuelve un número que indica el pid del proceso.
proceso &
Donde señal indica el mensaje a enviar al proceso (puede variar entre 1 y 15) y pid es el
identificador del proceso que devolvió el sistema cuando se lanzó el proceso.
En UNIX existen unos procesos bastante peculiares, cada uno de los cuales se encarga de
una misión y que son los que permiten el perfecto funcionamiento del sistema. Se trata de
los demonios (daemon). Estos procesos a su vez pueden arrancar otros procesos o
demonios con tareas más específicas.
Los demonios son procesos que arrancan cuando se inicializa el sistema y no finalizan
nunca, salvo que se les envíe una señal de finalización, la cual, en circunstancias normales
no se envía más que cuando se va a parar el sistema.
Son procesos, que solo root puede matar o inicializar. Generalmente solo los inicializará
manualmente en caso de que se realice alguna modificación en los archivos de
configuración que lo exija, para que se vuelvan a leer los parámetros de ejecución, o en
caso de algún problema.
• cron : Responsable de las tareas programadas por los usuarios vía crontab.
• getty : Responsable de la gestión de terminales para accesos al sistema, etc.
• inetd : Responsable de los servicios de internet (conexión a otros sistemas).
• init : Responsable de la ejecución de procesos.
• lp : Responsable del manejo de impresoras.
• mail : Responsable de la gestión del correo.
• xntpd : Responsable del intercambio de mensajes con otros sistemas para
sincronización horaria.
Para visualizar los procesos activos en un sistema se puede utilizar el comando ps:
ps [opciones]
Ejemplos:
PROGRAMACION DE TAREAS
Los sistemas UNIX están diseñados para estar bastante tiempo activos o en
funcionamiento, a diferencia de los PC que en cuanto se finaliza la jornada se apagan, los
sistemas UNIX siguen en funcionamiento. Esto es debido fundamentalmente a dos factores:
• Tiempo necesario para tirar y levantar el sistema, y las diferentes aplicaciones que
corren en él. No se puede apagar del mismo modo que un PC(los cuales, con el
nacimiento de Windows se van aproximando a los sistemas UNIX).
• Estabilidad del software, mientras que DOS exigía reiniciar el PC con asiduidad,
UNIX podía estar corriendo meses sin reiniciar el sistema. También aquí DOS y
Windows parecen que van mejorando poco a poco.
Si el sistema está funcionando cuando el usuario no está delante del sistema. ¿Por qué no
dejar alguna tarea programada, para que cuando llegue al día siguiente tenga menos trabajo
que hacer?. Aquí es donde surge el tema de la programación de tareas.
Para programar tareas es conveniente utilizar los periodos de menos carga del sistema,
sobre todo si se trata de tareas que consuman bastantes recursos. Es conveniente
programarlas a las horas en que menos usuarios haya conectados al sistema, con el fin de
que los que estén conectados noten lo menos posible la ejecución de dichas tareas. Para
ello, lo ideal es contactar con el administrador del sistema, quien debe conocer la carga del
sistema en cada momento, y quien puede permitir o denegar la programación de tareas a un
usuario.
Entre las tareas típicas que se ejecutan en modo programado habitualmente, se pueden
destacar:
• Backup incrementales
• Volcado de datos hacia históricos
• Limpieza de archivos
• Ejecución de informes diarios
• Gestión de los accounting (datos sobre cargas del sistema, conexiones de usuarios,
comandos ejecutados, etc.)
El cron en realidad es un demonio (programa que esta siempre en ejecución) que lee y
realiza las tareas programadas por los usuarios en un archivo. Cada usuario tendrá su
archivo cron, y existirá una copia del mismo en el directorio /var/spool/cron/crontabs (el
directorio puede variar según el sistema), que es de donde en realidad lo lee el demonio.
Como el usuario que programa las tareas, normalmente no está durante la ejecución de las
mismas, lo normal es que reciba los resultados (si ha salido bien o mal) por un correo. Se
pueden direccionar los resultados a archivos con el fin de analizar la ejecución de las tareas.
En general pueden existir los siguientes archivos, en los que el administrador autoriza o
desautoriza la programación de tareas a los usuarios introduciendo el login en ellos:
• at.deny
• at.allow
• cron.deny
• cron.allow
La estructura de estos archivos es muy sencilla, tan solo hay que incluir el nombre del
usuario en el archivo correspondiente para permitirle o denegarle la posibilidad de
ejecución de tareas programadas.
Un usuario podrá programar tareas si aparece el archivo .allow, si este archivo no existe
podrá programar tareas siempre y cuando no aparezca en el .deny. Si el archivo .deny está
vacio, todos los usuarios pueden ejecutar tareas programadas, y si no existe ninguno,
únicamente root podrá programar tareas. Es decir, el archivo .allow tiene preferencia ante el
.deny.
Para activar y/o desactivar la ejecución de comandos vía cron se utiliza el comando
crontab.
A continuación se muestra un ejemplo de cómo deben ser las líneas incluidas en el archivo
en que se programan las tareas a ejecutar vía cron:
mm hh dd MM ss Comandos
donde:
Cuando cualquiera de los campos se marca con un "*" se quiere indicar que esa línea se
debe ejecutar para cada valor del campo (cada minuto, cada hora, etc.). En caso de
especificar varios valores dentro de un campo se deben separar con comas ",", y se quieren
especificar rangos, se deben separar con guiones "-".
Las líneas que comienzan por "#" no se ejecutarán, se entenderá que se trata de un
comentario.
Se debe tener cuidado a la hora de programar tareas vía cron con las variables de entorno,
pues cron, por defecto toma unos valores estándar, por lo que cualquier modificación debe
especificarse en la línea de comandos o en un shell script que sea invocado en la línea de
comandos.
En caso de que dos usuarios tengan un cron en el que coincidan, a la misma hora, los
mismos programas, se pueden producir resultados inesperados si se actúa sobre los mismos
archivos.
TUBERIAS Y REDIRECCIONES
Por defecto, la salida estándar y el error estándar están direccionados hacia la pantalla del
terminal, y la entrada estándar corresponde al teclado. Pero en ocasiones puede ser que no
nos interese que la información salga en pantalla, si no que nos interesa filtrarla o
redireccionarla a un archivo para guardar la información o para un tratamiento posterior, o
que la entrada a un programa sea el resultado de la ejecución de otro. Con este fin los
sistemas operativos permiten la utilización de tuberías y redirecciones.
Ejemplos:
Ejemplo:
• mail pepe < mensaje Enviará el contenido del archivo mensaje, vía correo
electrónico al usuario pepe.
Para fusionar la salida estándar y la salida de errores se puede hacer usando 2>&1.
EXPRESIONES REGULARES
En algunos comandos como grep, sed, awk se aceptan lo que se conoce como Expresiones
Regulares, que son una forma de describir cadenas de caracteres, y que sirven para buscar o
tratar patrones con caracteres variables (búsquedas y sustituciones complejas).
Existen metacaracteres, que son caracteres que en una expresión regular son interpretados
por su significado especial, y no por los caracteres que normalmente representan. Para
utilizar el carácter que representan habrá que anteponerles el carácter Back Slash (\). Entre
estos caracteres tenemos:
\*?|+^$.()[]{}
Para buscar un rango de caracteres se pueden expresar entre corchetes ([ ]), usando comas
(,), para expresar listas de valores, o guiones (-) ,para expresar rangos de valores, como
separadores. En este caso algunos metacaracteres pierden su valor y pasan a representar el
propio carácter.
Por ejemplo:
ls -l [A-Z]*
Mostrará todos los archivos (y sus propiedades) cuya
primera letra sea mayúscula.
ls -l [!A-Z]*
Mostrará todos los archivos (y sus propiedades) cuya
primera letra sea no mayúscula.
ls -l [a-z]*
Mostrará todos los archivos (y sus propiedades) cuya
primera letra sea minúscula.
ls -l [a,e,i,o,u]* Mostrará todos los archivos que comiencenpor vocal.
ls -l [!a,e,i,o,u] Mostrará todos los archivos que no comiencenpor vocal.
ESTAMENTOS
En UNIX existen expresiones o estamentos que se pueden usar en la línea de comandos y
que pueden ejecutar una acción u otra dependiendo de ciertas condiciones, o ejecutar una
tarea un número de veces determinado. Las expresiones más habituales son:
variable = valor
• TEST: Prueba si es cierta una condición, devolviendo TRUE (0) o FALSE (1):
test [condición]
Para llamarlas solo habrá que utilizar su nombre seguido de los posibles argumentos
(como si se llamara a un programa más):
En UNIX existen unas variables especiales que pueden resultar útiles para conocer detalles
sobre programas ejecutados, argumentos, etc.. Estas variables dependen de la shell
utilizada, en el caso de ksh podemos destacar:
SHELL SCRIPTS
Los shell scripts son programas escritos con comandos UNIX y son equivalentes a los batch
de DOS, aunque bastante más potentes, pues admite ejecuciones en segundo plano y tiene
un conjunto de expresiones mucho más amplio.
Para realizar una shell script en condiciones, al igual que para realizar un programa en
cualquier lenguaje de programación, es necesario tener claro lo que se quiere obtener y de
que situación se parte. Es mejor perder un poco de tiempo en realizar un desarrollo mental
del programa que dedicarse a teclear y probar cosas, pues lo más seguro es que no se
consiga el objetivo, y si se consigue la estructura del programa no será la adecuada.
Una de las ventajas que presentan los shell scripts es que pueden ser portadas de una
máquina UNIX a otra sin problemas, sin necesidad de retocar nada, salvo que se utilicen
llamadas a programas muy concretos específicos de una versión de UNIX, mientras que los
programas compilados (desarrollados en C, Pascal, etc.) deben ser recompilados, pues el
código se generará en función del microprocesador de cada máquina. Otra ventaja es la
facilidad de lectura e interpretación.
Los scripts suelen encabezarse con comentarios que indican el nombre de archivo y lo que
hace el script. Se colocan comentarios de documentación en diferentes partes del script para
mejorar la comprensión y facilitar el mantenimiento. Un caso especial es el uso de "#" en la
primera línea, seguido del carácter admiración y el path de la subshell, para indicar el
intérprete con que se ejecutará el script:
#!/bin/ksh
Es interesante saber que muchos comandos devuelven un valor después de ejecutarse, y que
este valor indicará si la ejecución ha sido buena o si ha habido algún fallo y que tipo de
fallo se ha producido. Para conocer si un comando devuelve o no un valor y qué es lo que
devuelve en cada caso se deberá consultar la documentación, pero por lo general en caso de
una ejecución correcta devolverán el valor 0, y en caso de fallo otro numero, positivo o
negativo.
Para poder ejecutar un archivo de comandos es necesario que tenga activados, al menos, los
permisos de lectura y ejecución.
A continuación vamos a ver unos ejemplos, comenzando por cosas muy sencillas.
Ejemplo1:
SUBSHELL.
Directorio actual /home/jagar
Cambiando directorio en el subshell...
Ahora en directorio /etc
Ahora estoy en mi directorio, que es /home/jagar
Ejemplo 2:
# Programa que muestra la hora del sistema cada segundo durante 1 minuto
Cont=0
while [$Cont -le 60 ]
do
date
Cont=`expr $Cont + 1`
sleep 1
done
Ejemplo 3:
esac
Ejemplo 4:
#!/bin/ksh
# Programa que pide al usuario que introduzca una cadena de caracteres y
# la muestra, por pantalla del derecho y del revés.
#
echo "Introduce una cadena: \c"
read NOMBRE
LONGITUD=`echo $NOMBRE | wc -c`
while [ $LONGITUD -gt 0 ]
do
NOMBREALREVES="$NOMBREALREVES"`echo $NOMBRE | cut -c$LONGITUD`
LONGITUD=`expr $LONGITUD - 1`
done
echo "\n$NOMBRE\n$NOMBREALREVES"
Ejemplo 5:
#!/bin/ksh
# Programa que simula una papelera de reciclaje, mediante el cual en
lugar de
# borrar un archivo, lo que hace es guardarlo en un subdirectorio, con el
fin
# de evitar borrados accidentales.
#
if [ $# -gt 0 ]
then
for i in $*
do
echo "Moviendo $i al directorio $HOME/borrados"
if [ `mv $i $HOME/borrados 2> /dev/null` ¡= 0 ]
then
echo "Error, no se puede mover $i"
fi
done
else
echo "Error: hay que especificar argumentos"
echo "$0 archivo1 [archivo2] ..."
return 1
fi
return 0
Ejemplo 6:
function puntos ()
{
if [ $1 ] # Si se ha pasado algun argumento
then
INTERVALO=$1 # Considerar el intervalo como tal
else
INTERVALO=5 # Si no se ha pasado, considerar 5
fi
while true # Ejecutar siempre, sin fin.
do
echo ".\c" # Imprimir un punto si salto de linea
sleep $INTERVALO # Esperar el intervalo especificado
done
}
# Programa principal
# Lo que sea
puntos 2 & # Se llama a la funcion puntos, con intervalos de 2 sg
[ programa que tarda mucho ]
kill -9 $! # Se mata el ultimo proceso lanzado en background
# Lo que sea
# Fin del programa
Ejemplo 7:
#
# La funcion hora se encarga de pedir la hora al sistema especificado,
# filtrarla y mostrarla por pantalla.
#
hora()
{
hora=´telnet $1 daytime 2> /dev/null | grep ":" ´
echo "$hora -----> $1"
}
#
# Comprobar si el sistema esta accesible, y si lo esta, anadirlo a la
variable
# SISTEMAS, que sera la que contiene los sistemas accesibles.
#
#
#Esperar a que finalice la ejecucion de todas las tareas en background.
#
wait
#
#Fin de programa
#
EDITOR VI
En UNIX existen otros editores más potentes, con entornos de trabajo más amigables, otros
más sencillos de manejar, pero el único editor que está en todas las versiones y se maneja
igual es el vi.
vi [opciones] archivo
• -r : Recupera la copia del archivo que existe en los directorios temporales. Es útil en
caso de que se haya apagado el terminal sin haber salvado el texto.
• -c : Ejecuta el comando, de vi, que se indica a continuación. Es útil para
posicionarse en algún punto del archivo
En vi existen 3 modos de trabajo:
En las páginas siguientes se detallan los comandos más importantes de vi clasificados según
el modo en que se ejecutan y las tareas que realizan.
vi es independiente del tipo de terminal, pero la variable de ambiente TERM debe estar
fijada correctamente. Si no se conoce o no existe, en la base de datos de terminales del
sistema, el tipo exacto de terminal con el que se está trabajando, se puede usar el tipo vt100
o el ansi (dan buenos resultados en la mayoría de los terminales).
Con algunos comandos, especialmente more y a veces vi, el terminal o el emulador que se
está usando pueden no responder bien, que no aparezcan los cambios que se realizan
correctamente en la pantalla. En estos casos, puede usarse Ctrl-l para refrescar la pantalla.
Un usuario puede generar bajo su directorio $HOME un archivo llamado .exrc, en el que
podrá adaptar el entorno del editor vi a su gusto. En este archivo se pueden incluir:
• Opciones set
set [opcion[=valor]]
• Abreviaturas ab
ab [abr] [cadena]
• Macros map.
donde:
• Key : expresa una letra especial (no utilizada en vi). Por ejemplo v, V, q, K, Ctrl-A,
etc. Las teclas correspondientes a las flechas se pueden definir como macros si es
que no se encuentran definidas por defecto.
• n : expresa un número
• acción : es un comando de vi, teniendo en cuenta que antes de teclear un Escape o
Return, o cualquier carácter de control hay que teclear Ctrl-v.
Tanto las opciones, como las abreviaturas y macros se pueden definir en modo ex para la
edición en curso, pero solo tendrán valor durante la edición actual, no siendo válidas para
las siguientes llamadas al comando vi. Por ello, para que afecte a cualquier llamada del
comando vi, será necesario insertarlas en el archivo .exrc.
MODO TEXTO
Otros
MODO COMANDO
Búsqueda
Otros
U
Deshacer todos los cambios en una línea desde que se posicionó el cursor
en ella.
. Repetir el último comando.
Generales
Mover
:1 Mueve a línea 1.
:15 Mueve a línea 15.
:$ Mueve a última línea.
Otros
Ejemplos:
:.,5s/ayuda/&ndo/g
Cambia ayuda por ayudando desde línea actual
hasta la 5ª línea.
:.,$ d
Elimina todas las líneas desde la línea actual al final
del archivo.
SED
Sed es un editor de texto que acepta como entrada un archivo, lo lee y modifica línea a
línea mostrando el resultado en pantalla. Posee muchas características de ed y ex. La
sintaxis general del comando sed es:
Un script consiste en uno o varios comandos del editor (uno por línea) con la siguiente
estructura:
donde inicio y fin hacen referencia a las líneas (número de línea) afectadas (o intervalo de
líneas), función hace referencia al comando de editor a aplicar y argumentos hace
referencia a los argumentos necesarios para la ejecución de la función.
Para expresar los comandos en varias líneas, al final de cada línea se debe añadir el carácter
backslash (\) antes de pulsar el Return y aparecerá un prompt con el símbolo mayor que (>).
Ejemplos:
AWK
Introducción
El nombre awk proviene de las iniciales de sus desarrolladores : Alfred V. Aho, Brian W.
Kerningan y Peter J. Weinberger, de los Laboratorios Bell de AT&T. Inicialmente se
desarrolló para escribir programas muy cortos, pero las características de este atrajo a los
usuarios de tal modo, que lo impulsó más allá de la idea original de los autores. En 1985
apareció una nueva versión llamada nawk, en la que se implementan características nuevas
como son:
• Funciones de usuario.
• Expresiones regulares dinámicas con sustitución de texto.
• Mayor número de funciones intrínsecas y variables.
• Nuevos operadores y estamentos.
• Entrada de múltiples archivos.
• Acceso a argumentos en la línea de comandos.
• Mejora de los mensajes de error.
awk es un lenguaje de búsqueda y procesamiento de patrones. Esto quiere decir que awk es
capaz de buscar un patrón dentro de un archivo (al igual que grep) y tratarlo según unas
operaciones determinadas. Con awk se pueden desarrollar auténticos programas.
Según esto awk es capaz de procesar un archivo con datos organizados por columnas y
generar nuevas columnas con los valores resultantes de realizar ciertos cálculos u
operaciones.
A diferencia de comandos Unix como grep y sed, que filtran y procesan texto, awk
incorpora su propio lenguaje de programación, siendo capaz de ofrecer operaciones
aritméticas, relaciones lógicas y variables. Se pueden desarrollar programas con awk que
procesen la entrada estándar o un archivo, realizando tareas como tratar archivos de texto
como bases de datos. El lenguaje de programación awk incluye estamentos como for, while
e if-else, así como un conjunto de funciones y variables incorporadas.
Sintaxis
donde:
Campos y Variables
Una línea de entrada se divide en campos separados por espacios, y cada campo se
denomina como $1, $2, etc. $0 indica la línea entera. Estas variables se pueden manipular
(sumar, cambiar, etc.) como cualquier otra varible, por ejemplo:
awk '{ $1 = $2 + $3; print $0 }' archivo
Sumará los campos 2 y 3 en el campo 1, e imprimirá el nuevo registro (la línea completa).
Se pueden referir a los campos con expresiones numéricas como $i, $(n+1), $(NF*3/NR),
etc. Si la expresión resultante no es un entera, se truncará la parte decimal. El tratamiento
de un campo como texto o numérico dependerá del contexto, awk resuelve las posibles
ambigüedades tratando los campos como texto (por ejemplo cuando se compara un texto
con un número), por ejemplo:
En los programas de awk no es necesario declarar las variables (indicar el tipo de variable
de que se trata), se realizará automáticamente en función del contexto. Por defecto se
inicializan a la cadena nula o valor numérico 0, por lo que no es necesario inicializarlas.
Existen unas variables predefinidas, que pueden ser utilizadas dentro del programa:
Patrón { acción }
Interpretación:
• Para cada línea que verifique lo especificado en el patrón, se ejecutará la acción
indicada.
• La acción siempre va encerrada entre llaves.
• Se pueden especificar varias acciones, separándolas por ";" o por el carácter nueva
línea.
Los patrones deben ir rodeados por caracteres "/", y puede contener dos patrones separados
por una coma, en cuyo caso la acción se realizará para aquellas líneas comprendidas entre
la primera aparición del primer patrón y la siguiente aparición del segundo patrón. Si se
utiliza el símbolo "~", indicará que el patrón de la derecha está contenido en el campo de la
izquierda, y si se utiliza "!~", indicará que no está contenido.
Existen dos etiquetas opcionales, con un significado especial, que hacen que un programa
awk tenga una estructura como la siguiente:
BEGIN { acción }
Patrón { acción }
END { acción }
Operaciones
Un programa awk puede hacer operaciones en coma flotante, utilizando los siguientes
operadores:
Funciones Incorporadas
Función Descripción
length(x) Devuelve la longitud del argumento
sqrt(x) Devuelve la raíz cuadrada del argumento
log(x) Devuelve el logaritmo en neperiano del argumento (en base e)
exp(x) Devuelve el valor de e elevado al argumento
int(x) Devuelve la parte entera del argumento
cos(x) Devuelve el coseno del argumento
sin(x) Devuelve el seno del argumento
atan(x) Devuelve el arcotangente del argumento
rand() Devuelve un número aleatorio comprendido entre 0 y 1
Devuelve la posición de s en donde ocurre r, comenzando desde 1. Si no
match(s,r)
existe devuelve 0.
substr(s,m,n) Devuelve la subcadena de s que comienza en la posición m y finaliza en
la n.
Sustituye la primera ocurrencia de t por r en la cadena s. Si no se
sub(r,t,s)
especifica s se tomará todo el registro ($0).
gsub(r,t,s) Igual que sub, pero sustituyendo todas las ocurrencias.
Divide la cadena s en array[1],...,array[n]. Se devuelve el número de
split(s,array,sep) elementos. Si no se especifica el separador en sep se utilizará el valor de
FS. s puede ser una variable.
Devuelve la posición de la cadena s1 en donde se encuentra la cadena s2.
index(s1,s2)
En caso de no encontrarse se devuelve 0.
Devuelve la cadena resultante de imprimir los valores e1, e2, ... con el
sprintf(f,e1,e2,...)
formato especificado en f.
toupper(s) Devuelve la cadena s convertida a mayúsculas.
tolower(s) Devuelve la cadena s convertida a minúsculas.
Ejecuta el comando UNIX cmd especificado y retorna el estado de salida
system(cmd)
de este.
print e1, e2, ... Presenta en la salida los valores e1, e2, ...
Presenta en la salida los valores e1, e2, ... con el formato especificado
printf f, e1, e2, ...
por f (al estilo C: %s, %d, etc.).
close(f) Cierra el archivo o pipe abierto con print, printf o getline.
Lee el siguiente registro de la entrada y se lo asigna a X, si no se
getline X
especifica X se asignará a $0.
Funciones
Los parámetros se pasan por valor si son escalares y por referencia si se pasa el nombre del
array. Los parámetros son locales, mientras que el resto de las variables son globales. Las
funciones pueden llamarse de forma recursiva.
Ejemplos
Ejemplos de patrones
Ejemplos
CGI's
El nombre CGI proviene del inglés Common Gateway Interface, y vienen a ser programas
escritos en cualquier lenguaje que añaden una mayor funcionalidad a las paginas Web. Son
programas que se ejecutan en el servidor, no en la máquina cliente como sucede con los
javascript.
Antes de continuar debo decir que para entender lo que voy a comentar es necesario tener
algunas nociones, aunque sean mínimas de lenguaje HTML.
Un cgi permite construir por ejemplo una página web dinámicamente, tratar los datos de un
formulario, o realizar determinadas tareas en la máquina servidor.
Al construir un cgi con comandos UNIX tenemos toda la flexibilidad que dicho sistema
operativo nos proporciona. Además podemos utilizar programas realizados en otros
lenguajes dentro del propio shell script o cgi.
Lo mejor para entender un cgi creo que es mostrar un ejemplo como el siguiente, en el que
construiremos una pagina web titulada prueba en la que aparezca un mensaje.
#!/usr/bin/sh
echo "Content-type: text/html"
echo ""
echo "<html><head><title>Página Web
para probar el primer CGI</title></head>"
echo "<body bgcolor=yellow>"
echo "<H2>PRUEBA CGI</H2>"
echo "<font face=\'Arial, Helvetica\' size=2>"
echo "<p align=\'center\'>Esta página
se ha creado con mi primer CGI</p>"
echo "</font></body>"
echo "</html>"
Este ejemplo, salvo errores en las comillas deberia funcionar. Este mismo cgi en C seria:
#include <stdio.h>
main()
{
printf("Content-type: text/html\n");
printf("\n");
printf("<html><head><title>Página Web
para probar el primer CGI</title></head>");
printf"<body bgcolor=yellow>");
printf("<H2>PRUEBA CGI</H2>");
printf("<font face=\'Arial,
Helvetica\' size=2>");
printf("<p align=\'center\'>Esta
página se ha creado con mi primer
CGI</p>");
printf("</font></body>");
printf("</html>");
}
Como se puede ver un cgi se puede escribir en cualquier lenguaje. Antes de seguir adelante,
he de avisar de que para que funciones el CGI debe tener permisos de ejecución, por lo que
habrá que hacer un chmod:
Es conveniente ponerle la extensión cgi a los archivos de dicho tipo, para evitar por un lado
confusiones a la hora de manipularlos y por otro para evitar errores de funcionamiento.
Podemos observar que en todo cgi las dos primeras líneas de la página que se genere deben
ser:
Un ejemplo tipico de CGI es un contador de visitas de una pagina web. Aqui vamos a usar
el mismo ejemplo de antes, y mostrar el valor del contador, que se supone que guardaremos
en un archivo llamado contador.txt (el nuevo código insertado va en cursiva), le
incrementamos el valor en 1 (la visita que acabamos de realizar al visualizar la página) y
guardamos el nuevo valor en el mismo archivo, sobreescribiendolo. Ojo, hay que crear el
archivo contador.txt con un valor determinado. Si tras dos pruebas no se incrementa el
contador, dale permiso de escritura al archivo (suele ser algo que se olvida fácilmente):
#!/usr/bin/sh
echo "Content-type: text/html"
echo ""
echo "<html><head><title>Página Web
para probar el primer CGI</title></head>"
echo "<body bgcolor=yellow>"
echo "<H2>PRUEBA CGI</H2>"
echo "<font face=\'Arial, Helvetica\' size=2>"
echo "<p align=\'center\'>Esta página
se ha creado con mi primer CGI</p>"
echo "<p>Eres el visitante número: "
CONTADOR=`cat contador.txt`
CONTADOR=`expr $CONTADOR + 1`
echo $CONTADOR > contador.txt
echo "$CONTADOR</p>"
echo "</font></body>"
echo " </html>"
Con lo visto hasta aquí podemos decir que un cgi es un shell script en el que la salida por
pantalla se presenta en formato HTML. Las operaciones que se realizan dentro del cgi son
idénticas a las realizadas con un shell script normal, pudiendo hacer llamadas a programas
desarrollados en otros lenguajes, utilizando herramientas como awk, sed, etc. A modo de
ejemplo, implementaremos el caso anterior con awk.
#!/usr/bin/sh
echo "Content-type: text/html"
echo ""
echo "<html><head><title>Pagina Web para
probar el primer CGI</title></head>"
echo "<body bgcolor=yellow>"
echo "<H2>PRUEBA CGI</H2>"
echo "<font face=\'Arial, Helvetica\' size=2>"
echo "<p align=\'center\'>Esta página
se ha creado con mi primer CGI</p>"
echo "<p>Eres el visitante número: "
CONTADOR=`cat contador.txt`
awk '{ contador+=1;}
END { printf "%.5d", contador}'
contador=$CONTADOR
echo $CONTADOR > contador.txt
echo "$CONTADOR</p>"
echo "</font></body>"
echo "</html>"
Si la página fuera estática,como sucede en la realidad, habría que llamar al cgi desde la
propia pagina:
....
</p>Eres el visitante Número: <IMG SRC=\"archivo.cgi?
parametro1=valor1¶metro2=valor2&...\" alt=\'Contador\'></p>
.....
Hasta el momento hemos visto cgi's a los que se llamaría sin pasarle parámetros. Pero
normal es que cuando llamemos a un cgi sea para mostrar una página o realizar una tarea en
función de unos datos suministrados a través de un formulario por ejemplo. Sin quererlo
acabamos de ver como se realiza una llamada al cgi pasándole parámetros. Los parametros
se pasan en una cadena, que habrá que tratar para separar los diferentes parámetros que le
lleguen, lo cual podremos hacer con programas construidos especificamente para ello (en C
por ejemplo) o utilizando algo que hemos aprendido en este curso, el editor sed. Los
parametros dentro del cgi estarán dentro de unas variables de entorno, llamadas
QUERY_STRING y CONTENT_LENGTH. El uso de QUERY_STRING o
CONTENT_LENGTH dependerá del modo en que se envía la información. Existen dos
formas de enviar la información: GET y POST. Si se utiliza el método GET habrá que
emplear QUERY_STRING, y si se emplea el método POST habrá que emplear
CONTENT_LENGTH. Si se emplea el método GET la información no puede superar un
cierto tamaño (1 kb), mientras que si se emplea el método POST no existe dicha limitación,
pues se toma la información de la entrada estándar (stdin). El usar uno u otro método se
especificará a la hora de definir la acción a ejecutar con la información del formulario.
Para más información sobre el tema, es conveniente consultar cualquier manual o tutorial
sobre HTML.
En el siguiente ejemplo, vemos como se pueden obtener los parametros que se pasan al cgi,
para poder trabajar con ellos.
#!/usr/bin/sh
if [ $1 ]
then
cadena=$1
else
cadena=`head -c -n$CONTENT_LENGTH`
fi
variable1=`echo $cadena | awk -F "&" '{ print $1 }' | awk
-F "=" '{ print $2 }'`
variable2=`echo $cadena | awk -F "&" '{ print $2 }' | awk
-F "=" '{ print $2 }'`
variable3=`echo $cadena | awk -F "&" '{ print $3 }' | awk
-F "=" '{ print $2 }'`
Otro ejemplo:
#!/usr/bin/sh
if [ $1 ]
then
cadena=$1
else
cadena=`head -c -n$CONTENT_LENGTH | sed 's/
%2B/+/g
s/%2F/\//g
s/%3A/:/g'`
fi
# Tratamiento de los argumentos
recibidos para utilizarlos en el cgi
Variable1=`echo $cadena | awk '{
if (index($0,cadena1) > 0)
print valor1}'`
Variable2=`echo $cadena | awk '{
if (index($0,cadena2) > 0)
print valor2}'`
Variable3=`echo $cadena | awk '{
if (index($0,cadena3) > 0)
print valor3}'`
...
#!/usr/bin/sh
cadena=`echo $QUERY_STRING | cut -c7-200 | sed '1,$ s/
+/|/g'`
echo Content-type: text/html
echo ""
...
Una vez que hemos recibido los parámetros necesarios, tan solo hay que procesarlos, y en
función de los mismos construir la página adecuada.
Creo que con lo visto hasta aquí nos podemos hacer una idea de como construir un cgi, para
profundizar más es conveniente acudir a documentación de lenguaje HTML y cgi´s. Una
dirección que puede resultar útil es http://www.w3.org/. El lenguaje a emplear dependerá
por un lado de los lenguajes que soporte el servidor, de la facilidad para implementar lo que
deseamos construir, y como no, de nuestras preferencias.
VERSIONES DE UNIX
A continucación muestro una tabla, remitida por Luis Reyes, en la que se muestran algunas
versiones existentes de UNIX, así como algunas características y su dirección de Internet.
Fabricante /
Producto Descripción Web
Creador
LINUX Linus Torvalds Es un clon de Unix, http://www.Linux.org
que tomando como
base el Minix,
escribio desde cero
Linus Torvalds,
estudiante de la
Universidad de
Helsinki
(Finlandia), con
asistencia de otros
muchos hackers en
la red que soporta
el software de libre
distribución de
GNU. Tiene todas
las características
que se encuentran
en sus parientes
comerciales y otras
muchas, incluyendo
soporte para
ejecución nativa de
binarios Java. La
versión 0.02 data de
1991, la 1.00 de
1994 y la 2.4 de
2001.
FreeBSD Universidad FreeBSD (versión http://www.FreeBSD.org
Berkeley 2.0) es un sistema
operativo de tipo
Unix basado en la
versión 4.2BSD-
Lite de UCB para
plataforma i386.
También se
encuentra basado
aunque
indirectamente en
el sistema 386BSD
de William Jolitz.
Dada su similitud
con NetBSD
aplazaremos la
discusión de sus
características hasta
el próximo
apartado. No
obstante diremos
que es un sistema
extensivamente
utilizado tanto en
empresas como en
entornos
domésticos. Su
software de red es
excelente como
revela el hecho que
empresas dedicadas
a comunicaciones
entre ordenadores
lo utilicen como
plataforma básica.
NetBSD Universidad El proyecto http://www.NetBSD.org
Berkeley NetBSD ha surgido
como resultado del
esfuerzo de un gran
número de personas
que tienen como
meta producir un
sistema operativo
tipo Unix accesible
y libremente
distribuible.
NetBSD está
basado en una gran
variedad de
software de libre
distribución que
incluye entre otros,
a 4.4BSD Lite de la
Universidad de
California-
Berkeley, a Net/2
(Berkeley
Networking
Release 2) el
sistema de ventanas
X del MIT y
software de GNU.
AIX IBM Basado en el http://www.ibm.com/servers/aix/
sistema operativo
Unix System V.
Basado en SVR2
HP-UX HP Basado en el http://unix.hp.com/operating/index.html
sistema operativo
Unix System V
OpenBSD www.OpenBSD.org Sistema operativo http://www.OpenBSD.org
libre tipo Unix,
multiplataforma,
basado en 4.4BSD.
SPARC- Tatung Basado en el http://www.tsti.com/
OS sistema operativo
UNIX BSD
SunOS SUN Basado en el http://www.sun.com/SunOS/ ?
sistema operativo
UNIX BSD.A
partir de la versión
2 pasa a
denominarse
Solaris
Solaris SUN Basado en el http://www.sun.com/solaris/
sistema operativo
UNIX BSD
XENIX Microsoft Basado en el http://www.microsoft.com/
sistema operativo
Unix System V
IDRIX Basado en el
sistema operativo
Unix System V
System V AT&T System V es la http://www.att.com/
versión más
ampliamente usada
de UNIX. Es el
descendiente
directo del UNIX
desarrollado por
AT&T en 1969.
Está actualmente en
la revisión 4.1 y a
menudo es
referenciado como
SVR4, o System V
Release 4.
ULTRIX DEC ahora Basado en el http://www.compaq.com/
COMPAQ sistema operativo
Unix System V
SolOS Solobourne Basado en el http://www.sun.com
Computers sistema operativo
UNIX BSD
Solinux SUN Basado en el http://www.sun.com/
sistema operativo
Unix System V
UnixWare Novell http://www.novell.com/
OSF/1 DEC, HP, IBM
Minix Andrew S. Para PC y VAX. Se
Tanenbaum distribuye con los
fuentes.Compatible
con la versión 7
Algo de Unix
En esta sección voy añadiendo cosas que me van pareciendo interesantes, a nivel general,
basándome en las actividades habituales. Tened en cuenta que las escribo casí de memoria,
por lo que no sería extraño que hubiera algún error. En tal caso me gustaría que me lo
comentarais para subsanarlo. Si conoceis alguna utilidad y quereis exponerla decídmelo.
En el archivo $HOME/.profile deberá exitir, si no existe habrá que añadir en un punto por
el que siempre se pase -generalmente el principio- lo siguiente:
HISTFILE=$HOME/.history
HISTSIZE=64
EDITOR=/usr/bin/vi # el PATH correcto donde se encuentre ubicado el
comando vi
export HISTFILE HISTSIZE EDITOR
Antes de usar $HOME, por supuesto que debe estar definido. El tamaño 64 es
recomendado, puedes poner el que quieras. El nombre del archivo en principio puede ser
cualquiera, pero eligelo con lógica.
Si trabajas bajo una plataforma con entorno gráficos, es posible que no fucione, para ello
deberás localizar el .profile equivalente, o habilitar algún parámetro definido en dicho
profile, que permita correr el .profile. Bajo la plataforma HP-UX, en el archivo .dtprofile,
bajo tu directorio, hay que activar el parámetro DTSOURCEPROFILE=TRUE (quitale el
comentario (#)). Por supuesto debes reiniciar la sesión en cualquiera de los casos.
chmod 700 rm
En tu archivo .profile deberás cambiar PATH=..., de modo que aparezca antes el directorio
que contiene el nuevo rm que el directorio que contiene el rm real (/bin o /usr/bin, depende
del sistema), con el fin de que sea localizado antes el nuevo rm que el original.
Con esto lo que se consigue es mover los archivos que se quieren borrar a un subdirectorio,
por si interesara recuperarlos. Deberás limpiar este directorio de forma periódica, para lo
cual te puedes generar un archivo en el mismo directorio que el anterior que contenga una
instrucción como:
/bin/rm $HOME/trash/*
o en el .profile:
Backgrounds activos
Si ejecutas un shell script que tarda algún tiempo, lo suficiente como para mosquear al
usuario, y quieres que el usuario se crea que todo va bien, prueba a incluir lo siguiente en tu
shell script (puedes cambiar el punto que se imprime por cualquier carácter o símbolo, pero
cuidado con las secuencias de escape):
function puntos ()
{
if [ $1 ]
then
tiempo = $1 # Lo que le indiques
else
tiempo = 5 # 5 segundos por defecto
fi
while true
do
echo ".\c"
sleep $tiempo
done
}
Programa principal:
¿Aliases o Funciones?
Habitualmente los aliases se guardan en un archivo cuyo nombre suele ser .aliases, o .env,
se puede comprobar visualizando la variable de entorno $ENV. En otras ocasiones puede
estar almacenado en el propio .profile. Los aliases vienen a tener la siguiente estructura:
pero podemos comprobar que no admiten variables como argumentos. Para solucionar esta
carencia lo que podemos usar son funciones, teniendo en cuenta que $1, $2, etc. Son los
argumentos que se pasan a la función. Evidentemente, al tratarse de funciones, las podemos
construir tan complejas como deseemos, pudiendo llegar a ser auténticos programas.
Como ejemplo veamos la siguiente función que busca una cadena de caracteres en todos los
archivos que cuelgan de un subdirectorio determinado, y en los subdirectorios que a su vez
cuelgan de él, es decir, en el árbol descendente del subdirectorio que elijamos.
function Ffind ()
{
if [ $2 ] # Se comprueba si existe 1 o 2 argumentos
then
DIR_INICIAL=$1
CADENA=$2
else
if [ $1 ]
DIR_INICIAL=.
CADENA=$1
else
echo "Sintaxix: Ffind <directorio>
<cadena>"
return 0
fi
fi
# Ahora obtenemos el árbol de directorios sobre el que hay que
buscar
DIRECTORIOS=´find $DIR_INICIAL -depth -type d -print´
for i in $DIRECTORIOS
do
echo "Buscando $CADENA en $i"
grep $CADENA $i/* # Puedes usar las opciones
que quieras del comando grep
done
}
Esta función estaría en el archivo de aliases y sería de uso exclusivo del propietario,
invisible a los demás.
La puedes mejorar con más opciones, emplear recursividad, etc., el caso es que debe ser útil
y lo más rápida posible, para lo cual debe consumir el mínimo de recursos. La sintaxis que
se emplearía, en el caso expuesto, sería:
Un ejemplo de alias dinámico, que cambie el directorio de acceso en función del año en que
nos encontremos puede ser del tipo:
En ocasiones se generan archivos, por error o no, que continen caracteres extraños o
metacaracteres como ?, *,^C ,^H, etc. y que no pueden ser borrados habitualmente con el
comando rm. Para eliminar estos archivos se puede emplear el siguiente método:
1. Listar el directorio en el que se encuentre con el comando ls -li, con el fin de anotar
el i-nodo que le corresponde.
ls -li [directorio]
Para ello puedes realizar un rsh (remote shell, no restricted shell) o remsh indicando el
nombre de la máquina, pero si generas un archivo con el nombre de la máquina en tu
directorio de ejecutables, y lo linkas al rsh o remsh podras realizar la misma operación
tecleando simplemente el nombre de la máquina y el comando a ejecutar. Esto viene
documentado, solo tienes que hacer un man rsh (o remsh, dependiendo del UNIX que
tengas cargado) y leer por el medio.
Por supuesto debes tener tener cuenta en dicha máquina y el acceso habilitado mediante el
archivo .rhosts bajo tu directorio.