cur so unix

322

Upload: havann

Post on 22-Jun-2015

735 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: Cur So Unix
Page 2: Cur So Unix

Manual de Unix

2

Page 3: Cur So Unix

Manual de Unix

1.1 HISTORIA

Unix fue desarrollado en los Laboratorios Bell de AT&T, sin embargo, la historia de Unix es casi única, ya que sus avances son aportaciones de personas individuales con ideas creativas singulares.

MULTICS (antecesor directo de Unix), un sistema desarrollado por varias compañías entre las que destacan AT&T y General Electric, ha influido en gran medida el diseño de los sistemas modernos. Un sistema multiusuario, él incorporaba la mayoría de las ideas que aparecen en los sistemas operativos actuales. Desgraciadamente resultó mucho más complejo y pesado de lo que era necesario. Multics estuvo parado durante algunos años básicamente por dos problemas:

Necesitaba mucha memoria

Los programas no acababan de funcionar bien con él

Unix fue diseñado por un grupo de personas que eran representantes de AT&T en el desarrollo de Multics, en el MIT (Instituto Tecnológico de Massachussets). A finales de los sesenta, AT&T abandono el proyecto Multics. Sin embargo, Dennis Ritchie y Ken Thompson, dos investigadores de los laboratorios Bell, quienes habían participado en el proyecto, decidieron construir el sistema basado en un diseño que ellos mismos habían elaborado junto con Rudd Canaday.

Más tarde se les unieron otros informáticos capaces como J. F. Ossanna y R. Morris. Adquirieron una Digital Equipment Corp (DEC) PDP-7 de desecho, una computadora con solo 18 kilobytes de memoria, y se pusieron a desarrollar. Como muchos proyectos interesantes, éste empezó con la creación de un juego: Thompson y Ritchie desarrollaron un juego de "Viaje espacial" para la PDP-7.

Luego crearon una nueva estructura de sistemas de archivos y nuevo software. Le añadieron un entorno de procesos con planificación y completaron un sistema operativo rudimentario. Al resultado se le nombró UNIX pues era una simplificación de MULTICS. La primera versión de UNIX se codifico en lenguaje ensamblador. En 1970, un año después, Ritchie instaló el sistema en una DEC PDP-11, y el runoff, el predecesor del troff, se convirtió en el primer procesador de texto de UNIX.

Al contemplar el desarrollo de Unix, Ritchie y Thompson expusieron sus diseños en una conferencia internacional donde varios de los participantes les pidieron una copia de este sistema. En esta época, BTL había perdido un juicio, y como parte de los dictámenes del Juez estaba la prohibición de incorporarse a cualquier negocio que no fuera el de las telecomunicaciones. Debido a esto, a BTL le era imposible entrar en el negocio de los sistemas operativos.

3

Page 4: Cur So Unix

Manual de Unix

La presión de los investigadores en obtener una copia de Unix motivó a los ejecutivos de BTL a licenciar su uso como una herramienta de investigación. La licencia de Unix era muy barata para las universidades y bastante cara para la industria. En 1971, UNIX recibió reconocimiento oficial de AT&T cuando la firma lo usó para escribir manuales.

La segunda edición, realizada en 1971, dio forma al UNIX moderno con la introducción del lenguaje de programación C. A finales de 1973, después de que Ritchie añadió soporte para variables globales y estructuras, se usó el lenguaje C para continuar el desarrollo de UNIX, con lo que se rompió con la tradición de escribir sistemas operativos en lenguaje ensamblador. Solo algunas subrutinas de alto rendimiento dentro del núcleo del sistema están escritas en ensamblador.

Escrito en C, el entorno UNIX pudo ser relativamente fácil de trasladar a diferentes plataformas hardware. Lo que le dio gran portabilidad y popularidad. Las aplicaciones escritas en C pudieron ser fáciles de transportar entre diferentes variantes de UNIX. En esta situación nació el primer criterio de sistema abierto. La portabilidad de UNIX se convirtió en el modelo de transportar aplicaciones en C desde un sistema UNIX a otro.

Muchos integrantes del equipo de los Laboratorios Bell se interesaron en Unix y después de dos o tres años, estaba corriendo en varias máquinas diferentes. El sistema Unix se consolidó con el desarrollo de las PDP-11 superiores, como la PDP-11/45 y la PDP-11/70, a mediados de los setenta.

En 1974, la quinta edición de UNIX fue realizada para que estuviera disponible para las universidades. El precio de la versión 5 fue suficiente para recuperar los costos de las cintas y manuales. Se informó de los errores directamente a Thompson y Ritchie, quienes los reparaban a los pocos días de la notificación.

En 1975, la sexta edición de UNIX fue desarrollada e iniciada para ser ampliamente usada. Durante este tiempo, los usuarios se hicieron activos, los grupos de usuarios fueron formados, y en 1976, se estableció el grupo de usuarios USENIX. En 1977, Interactive System Corp. inició la venta de UNIX en el mercado comercial. Durante este tiempo, UNIX también adquirió más poder.

AT&T distribuyó copias de Unix a universidades de todo el mundo y con la creciente popularidad de los microprocesadores, otras compañías trasladaron el UNIX a nuevas máquinas, pero su simplicidad y claridad tentó a muchos a aumentarlo bajo sus puntos de vista, resultando muchas variantes del sistema básico. Las dos familias más importantes de versiones de UNIX son BSD y System V.

En el período entre 1977 y 1982, en los laboratorios Bell se trabajaba para fortalecer y optimizar a Unix con un enfoque comercial. En 1982 se lanza la primera versión comercial de Unix, UNIX System III. El lanzamiento hizo dudar a los usuarios, ya que no se sabía que partes pertenecían realmente a Unix y cuales a alguna de sus variantes.

4

Page 5: Cur So Unix

Manual de Unix

Sin embargo los Laboratorios Bell más tarde añadieron muchas características nuevas al UNIX System III, lo que unifico todo lo anterior, llamando al nuevo producto UNIX System V. La unificación prometía mantener compatibilidad con sus futuras versiones. En enero de 1983 AT&T anunció su apoyo oficial al System V.

El sistema IV se utilizó dentro de los laboratorios Bell, pero se consideró un producto de transición. AT&T normalizó el nombre de sistema V y sus versiones recientes se denominan sistema V revisión 3 y sistema V revisión 4, que con frecuencia se abrevian como SVR3 y SVR4, respectivamente.

Una de las universidades que adquirió la licencia Unix fue la Universidad de California en Berkeley. La motivación principal era poder experimentar con el primer sistema operativo que incluía código fuente. Al poco tiempo, la gente de Berkeley había escrito varios programas utilitarios para Unix que otros investigadores podrían encontrar útiles.

La universidad decidió desarrollar su propia implementación: BSD (Berkeley Software Distribution), para máquinas VAX, la cual es ampliamente utilizada. Este código fue distribuido entre la comunidad universitaria. La implementación BSD dominaba en los ambientes universitarios y técnicos.

A pesar que al principio las distribuciones de Berkeley consistían principalmente en herramientas para los usuarios, muy pronto comenzaron a cambiar la forma en que el propio sistema operativo funcionaba. Implementaron el manejo de memoria virtual y programaron el soporte para los protocolos del Arpanet que luego se convertiría en el conocido Internet. Todos estos cambios eran distribuidos como BSD a quienes tenían una licencia de Unix de la división de BTL encargada de administrar este sistema (AT&T).

Las versiones BSD fueron la plataforma dominante para experimentación en conceptos de red. El primer experimento importante en redes de área extensa, el ARPANET, fue orientado a UNIX.

Al incrementarse la velocidad y potencia de las microcomputadoras y con la disminución de su costo, estas pudieron soportar el sistema UNIX. Cuando los sistemas SVR3 y SVR4 estuvieron disponibles en máquinas de arquitectura PC-AT a finales de los ochenta, creció mucho la popularidad de UNIX.

A mediados de los años ochentas, Richard Stallman, entonces en el Instituto Tecnológico de Massachussets (MIT) decidió dedicarse a la construcción de lo que denominó software libre. El razonamiento de Stallman era que los mayores progresos en la industria del software surgen cuando se coopera entre programadores. Según Stallman, las industrias de la época estaban atentando contra la libertad de los usuarios y programadores de compartir el software, así que decidió programar un sistema parecido a Unix y regalarlo. A este sistema le llamó GNU, un acrónimo recursivo que significa Gnu's Not Unix (GNU no es Unix).

Para este entonces, varias compañías estaban ya en el negocio de Unix. Microsoft distribuía Xenix, una versión de Unix para el procesador 80386. Sun Microsystems utilizaba

5

Page 6: Cur So Unix

Manual de Unix

BSD como base para su SunOS. Digital Equipment Corporation incluía otro sistema operativo basado en BSD con sus workstations, Ultrix.

Otro paso importante fue la aparición del sistema de ventanas X. X fue un prototipo de un proyecto de investigación en el MIT a mediados de los ochenta, luego lo adaptaron algunas compañías, lo mejoraron y estabilizaron para poder hacerlo comercial. Actualmente, la mayoría de los paquetes de aplicaciones comerciales para UNIX corren bajo el entorno X.

En las últimas revisiones de SVR3 se inició una mezcla de las tres variantes principales del sistema UNIX. Como resultado de acuerdos entre AT&T, Sun Microsystems y Microsoft, los sistemas BSD y XENIX están fundidos dentro del sistema V.

Al tiempo de la fusión entre BSD y el sistema V, otros vendedores de sistemas UNIX se preocupaban de que un sistema mixto diera predominio a AT&T y Sun Microsystems en el mercado. Estos vendedores, principalmente Hewlett-Packard y DEC, formaron un consorcio para desarrollar una variante que no estuviera bajo el control de AT&T o Sun. Este grupo, llamado Open Software Foundation (OSF), ha desarrollado varios productos importantes para el sistema UNIX, el principal de ellos, la interfaz de usuario Motif.

A principios de los años noventa, la Universidad de California en Berkeley había cambiado tanto a Unix que decidieron distribuirlo incluso a personas que no tuvieran una licencia de AT&T. Esto motivó a algunas personas a iniciar una empresa para distribuir BSD (como ahora le llamaban a Unix de Berkeley) comercialmente. A esta empresa le llamaron Berkeley Software Design, Inc. (BSDI).

Cuando BSDI comenzó a vender BSD establecieron un número de acceso telefónico gratuito para sus clientes, este número era 1-800-ITS-UNIX. Para este entonces, BTL ya había sido desmembrado en varias compañías, una de ellas AT&T que de acuerdo a los nuevos arreglos legales ya podía comercializar Unix.

En efecto, AT&T había creado una división llamada Unix System Laboratories (USL) con el propósito de vender Unix a la industria. USL había incorporado el código de BSD en el Unix de AT&T además de haber desarrollado algunos otros subsistemas. Cuándo AT&T se enteró que BSDI estaba compitiendo en este mercado lanzó una demanda legal contra BSDI.

BSDI compareció ante el Juez e indicó que su producto no estaba basado en el Unix de AT&T sino en el Unix de Berkeley, que al final de cuentas la Universidad regalaba sin necesidad de una licencia. Al darse cuenta AT&T que no tenía oportunidad de ganar una demanda contra BSDI decidió demandar a la Universidad de California en Berkeley por distribuir código basado en el Unix de AT&T a personas que no poseían una licencia de AT&T. La Universidad de California a su vez, demandó a AT&T por incorporar código desarrollado en la Universidad sin dar el crédito debido a los autores.

Además de la iniciativa comercial de BSDI, habían surgido ya las primeras distribuciones gratuitas del Unix de Berkeley. Bill Jolitz había porteado BSD al procesador Intel 80386 y le había llamado a su port 386BSD. El grupo NetBSD había sido fundado para continuar porteando BSD a nuevas plataformas. FreeBSD había tomado el código de 386BSD que Bill Jolitz no tenía tiempo de mantener y estaba ahora distribuyéndolo gratis para el Intel 80386. Lamentablemente,

6

Page 7: Cur So Unix

Manual de Unix

a raíz de la demanda de AT&T a Berkeley, todas estas distribuciones fueron detenidas hasta que se arreglaran los aspectos legales de Berkeley, si BSD era en efecto un sistema operativo que no necesitaba licencia de AT&T.

Para las personas deseosas de correr Unix en las ahora populares PCs, quedaba únicamente una alternativa, Minix. Minix era un sistema operativo parecido a Unix desarrollado por el Profesor Andrew Tanenbaum para enseñarles a sus alumnos acerca del diseño de sistemas operativos. Sin embargo, debido al enfoque puramente educacional de Minix, Tanenbaum no permitía que este fuera modificado demasiado ya que esto complicaba el sistema y no permitía que sus estudiantes lo entendieran en un semestre.

Un estudiante de Finlandia, Linus Torvalds, al ver que no era posible extender Minix, decidió escribir su propio sistema operativo compatible con Unix. Miles de personas que querían correr Unix en sus PCs vieron aquí su única alternativa debido a que a Minix le faltaban demasiadas cosas y BSD, a pesar de tener toda la funcionalidad esperada, tenía problemas legales. El proyecto GNU que Stallman había iniciado hacía ya casi diez años había producido para este entonces un sistema casi completo a excepción del kernel, que es el programa que controla el hardware de la máquina. Torvalds decidió utilizar el casi completo sistema GNU y completarlo él mismo con su propio kernel, al resultado le llamó Linux. Richard Stallman insiste aún que el sistema debiera ser llamado GNU/Linux, ya que incluye más código del proyecto GNU que del proyecto Linux.

A mediados de los años noventa, AT&T vendió Unix a Novell, quién tomó como prioridad primaria resolver las demandas. El acuerdo fue que la Universidad de California eliminaría todo el código residual de AT&T y lanzaría una última distribución de BSD totalmente libre de problemas de licenciamiento. Esta distribución fue el 4.4-BSD Lite2. Quien quisiera distribuir BSD debería basar su distribución en 4.4-BSD Lite2 para no tener problemas legales. Inmediatamente los distribuidores de BSD reiniciaron sus labores de distribución migrando lentamente sus sistemas al 4.4-BSD Lite2.

Para este entonces, Linux se había convertido ya en el Unix más popular entre la gente que buscaba alternativas al Windows de Microsoft.

7

Page 8: Cur So Unix

Manual de Unix

8

Page 9: Cur So Unix

Manual de Unix

En la siguiente tabla se describen brevemente los hechos más importantes en la historia de Unix.

Año Evento Descripción

1965 OrigenBell Telephone Laboratories y General Electric Company intervienen en el proyecto MAC (del MIT) para desarrollar MULTICS.

1969-71 Infancia del UNIXEl primer UNIX llamado Versión 1 o Primera edición, nace de las cenizas de MULTICS.

1972-73 Nace el CEn la Versión 2 el soporte del lenguaje C y los pipes son añadidos. En la Versión 4 el ciclo se completa con la reescritura de UNIX en C.

1974-75 El momento

Las Versiones 5 y 6 de UNIX se distribuyen a las universidades. La Versión 6 circula en algunos ambientes comerciales y gubernamentales. AT&T impone ahora pagar una licencia, a pesar de que no puede promocionar UNIX por las duras regulaciones de EEUU del monopolio telefónico de AT&T.

1977 UNIX como productoInteractive Systems es la primera compañía comercial que ofrece UNIX.

1977 Nace BSD1BSD incluye un Shell Pascal, dispositivos y el editor ex.

1979 Versión 7La Versión 7 de UNIX incluye el compilador completo K&R con uniones y definiciones de tipos. Versión 7 también añade el Bourne Shell.

1979 Trabajo en RedBSD acrecentado por BBN incluye soporte para trabajar en red.

1979 Nace XENIXImplementación para microcomputadoras ampliamente distribuido en hardware de bajo coste.

1980 Memoria Virtual La capacidad de memoria virtual se añade en 4BSD.1980 Nace ULTRIX DEC realiza una versión de UNIX basado en BCD.1980 Licencias en AT&T La distribución de licencias abre el mercado.

1982Atracción de los

negociosSoporte importante para procesos de transacciones desde UNIX System Development Lab.

1983 Nace System V La versión más común de AT&T obtiene sus bases.

1984 Salida de SVR3AT&T desata la versión más popular de System V hasta ahora.

1988 Motif vs Open LookSistemas por ventanas rivales son anunciados por OSF y UI.

1988 Siguiente paso Un UNIX gráfico usa el Kernel Mach.

1990 OSF/1 vs SVR4Versiones rivales de UNIX son anunciadas por OSF y UI.

1992-95 Socialización OSF/1 abandona la escena; SVR4 se convierte en el estándar; Sun vende más estaciones de trabajo para usuarios de Motif que para usuarios de Open Windows;

9

Page 10: Cur So Unix

Manual de Unix

y crece Windows/NT de Microsoft.

1.2 VERSIONES

Las dos familias más importantes de versiones de UNIX son BSD y System V. BSD dio nacimiento a SunOS, quien se ha convertido ahora en el progenitor de muchas pequeñas variantes en el mercado de las SPARC. Tatung, por ejemplo, ofertó SPARC-OS, y Solbourne Computers ofertó SolOS. Con la adquisición de la división de sistemas operativos de Interactive Systems, Sun ha trasladado también SunOS a las arquitecturas Intel 386 y 486.

System V es la 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. Ejemplos de descendientes de System V son ZEUS, XENIX (desarrollado por Microsoft), Idrix, LINUX,...

El énfasis de los grupos que distribuyen BSD es:

FreeBSD : el énfasis de este sistema operativo está en la facilidad de uso del sistema. Entre otras metas están la eficiencia del uso de recursos y el rendimiento del sistema. Únicamente soportan las plataformas i386 y Alpha aunque ya han iniciado un port a la arquitectura SPARC. Recientemente se han anunciado planes de integrar el código fuente de FreeBSD con el de BSD/OS distribuido por BSDI. Esto proporcionaría una ventaja tecnológica aún más grande al grupo de FreeBSD. Gracias a su modo de emulación de Linux, puede correr una variedad de software escrito para este último.

NetBSD : el énfasis de este grupo es la portabilidad del sistema operativo. Actualmente existen ports para casi cualquier plataforma, desde las antiguas VAX hasta las modernas iMac.

OpenBSD : el énfasis de este grupo es en la seguridad, han hecho una auditoria de todo el código fuente buscando errores y fallas de seguridad. Incorporan sistemas criptográficos en su sistema operativo.

TrustedBSD : este es un muy reciente sistema operativo, basado en FreeBSD y con la meta de alcanzar la certificación B1 del libro naranja del Departamento de Defensa de Estados Unidos.

10

Page 11: Cur So Unix

Manual de Unix

11

Page 12: Cur So Unix

Manual de Unix

La figura 2.1 se describe la arquitectura de alto nivel de UNIX. El sistema operativo interactúa directamente con el hardware, suministrando servicios comunes a los programas y aislándolos de la particularización del hardware. Viendo el sistema como un conjunto de capas, el sistema operativo es comúnmente llamado como núcleo del sistema o kernel.

Como los programas son independientes del hardware que hay por debajo, es fácil moverlos desde sistemas UNIX que corren en diferentes máquinas si los programas no hacen referencia al hardware subyacente. Por ejemplo, programas que asumen el tamaño de una palabra de memoria será más difícil de mover a otras máquinas que los programas que no lo asumen.

Los programas como el shell y los editores (ed y vi) mostrados en la capa siguiente interactúa con el kernel invocando un conjunto bien definido de llamadas al sistema. Las llamadas al sistema ordenan al kernel realizar varias operaciones para el programa que llama e intercambiar datos entre el kernel y el programa. Varios programas mostrados en la figura 2.1 están en configuraciones del sistema estándares y son conocidos como comandos, pero los programas de usuario deben estar también en esta capa, indicándose con el nombre a.out, el nombre estándar para los archivos ejecutables producidos por el compilador de C. Otros programas de aplicaciones pueden construirse por encima del nivel bajo de programas, por eso la existencia de la capa más exterior en la figura 1. Por ejemplo, el compilador de C estándar, cc, está en el nivel más exterior de la figura: invoca al preprocesador de C, compilador, ensamblador y cargador, siendo todos ellos programas del nivel inferior. Aunque la figura muestra una jerarquía a dos niveles de programas de aplicación, los usuarios pueden extender la jerarquía a tantos niveles como sea apropiado. En realidad, el estilo de programación favorecida por UNIX estimula la combinación de programas existentes para realizar una tarea.

12

Page 13: Cur So Unix

Manual de Unix

Muchos programas y subsistemas de aplicación que proporcionan una visión de alto nivel del sistema tales como el shell, editores, SCCS (Source Code Control System) y los paquetes de documentación, están convirtiéndose gradualmente en sinónimos con el nombre de "Sistema UNIX". Sin embargo, todos ellos usan servicios de menor nivel suministrados finalmente por el kernel, y se aprovechan de estos servicios a través del conjunto de llamadas al sistema. Hay alrededor de 64 llamadas al sistema en System V, de las cuales unas 32 son usadas frecuentemente. Tienen opciones simples que las hacen fáciles de usar pero proveen al usuario de gran poder. El conjunto de llamadas al sistema y los algoritmos internos en los que se implementan forman el cuerpo del kernel. En resumen, el kernel suministra y define los servicios con los que cuentan todas las aplicaciones del UNIX.

13

Page 14: Cur So Unix

Manual de Unix

Figura 2.2 Bloques funcionales del sistema operativo UNIX.

El sistema operativo UNIX se compone de bloques funcionales que se encuentran representados en la figura 2.2 y serán comentados en los apartados que siguen.

14

Page 15: Cur So Unix

Manual de Unix

2.1 ORGANIZACIÓN DE LA INFORMACIÓN

El sistema operativo UNIX está diseñado para manejar información contenida normalmente en discos. Para que esta manipulación sea realmente efectiva, es necesario que la información esté organizada de alguna forma eficiente. La manera estándar de organizar la información es en archivos. Los archivos son localizados dentro del disco porque son apuntados desde un lugar determinado, a este lugar se le denomina directorio.

Figura 3. Estructura del sistema de archivos.

Sin embargo en UNIX no se utiliza un único directorio para apuntar a todos los archivos del sistema, sino que se crea una estructura jerárquica de directorios conocida como estructura en árbol. Se muestra un ejemplo de esta estructura jerárquica en la figura 2.3.

Aunque en un principio pueda parecer una estructura excesivamente complicada por la amplia ramificación de los directorios, esta organización permite agrupar los archivos de los diferentes usuarios e incluso de las diferentes aplicaciones en directorios separados, con lo que se evita el que se interfieran entre sí. Por otro lado, un mismo usuario puede organizar su propia información separando los archivos en diferentes directorios de acuerdo a su contenido.

15

Page 16: Cur So Unix

Manual de Unix

2.2 CONCEPTO DE ARCHIVO

La estructura fundamental que utiliza el UNIX para almacenar información es el archivo. El UNIX mantiene la pista de cada uno de los archivos asignándole a cada uno, un número de identificación (i-number) que apunta a la tabla de i-nodos. Sin embargo, el usuario se referirá a cada archivo con el nombre que le haya asignado el propio usuario. El UNIX mantiene toda la información propia del archivo, excepto su nombre, en su inodo correspondiente. El nombre se encuentra en la entrada correspondiente del directorio al que pertenece.

Todos los archivos UNIX son tratados como una simple secuencia de bytes (caracteres), comenzando en el primer byte del archivo y terminando con el último. Un byte en concreto dentro del archivo, es identificado por la posición relativa que ocupe en el archivo. La organización de los archivos en registros o bloques de una longitud fija, corresponde a la forma tradicional de organización de los datos en el disco. El UNIX protege específicamente al usuario del concepto de registros o bloques. En su lugar, el UNIX puede permitir que el usuario divida al archivo en registros, de acuerdo a un byte o conjunto de bytes especiales. Los programas son libres para organizar sus archivos, con independencia de la forma en que los datos estén almacenados en el disco.

16

Page 17: Cur So Unix

Manual de Unix

2.3 DIRECTORIOS

Prácticamente para todos los efectos, un directorio se comporta como un archivo, con la característica de que sus registros son de longitud fija. A pesar de lo comentado anteriormente, el contenido de los directorios no apunta directamente a los bloques de datos de los archivos o subdirectorios que dependen de él, sino a unas tablas (i-nodos) separadas de la estructura. Es desde estas tablas desde las que se apunta a los bloques físicos de los archivos dentro del disco.

Cada registro en el directorio tiene una longitud de 16 bytes de los que:

Los dos primeros contienen un apuntador (en binario) a la tabla de los i-nodos (i-number).

Los catorce restantes contienen el nombre del archivo o subdirectorio (el número bytes por registro depende de la versión del UNIX, ya que hay versiones en que la longitud del nombre de un archivo puede llegar a 255 bytes).

Cualquier directorio contiene un mínimo de dos entradas:

Una referencia a sí mismo (.).

Una referencia al directorio de que dependo o directorio padre (..), salvo en el directorio raíz que, al ser el comienzo de la estructura, esta referencia es también sobre sí mismo.

Figura 4. Estructura de un directorio.

17

Page 18: Cur So Unix

Manual de Unix

2.4 SISTEMA DE ARCHIVOS

El conjunto formado por la estructura de archivos y directorios y las tablas de i-nodos, se denomina Sistema de Archivos o File System. Cada sistema de archivos está residente en un soporte físico, normalmente disco magnético, pero si el disco es de gran capacidad puede dividirse en varios discos lógicos o "particiones", cada uno de los cuales sería un sistema de archivos independiente. En el caso de que el sistema disponga más de un disco físico, cada uno será forzosamente un file system. Por lo tanto se puede asociar el concepto de sistema de archivos al de disco lógico o partición de disco. Es importante no perder la idea de que, aparte de otros componentes que se verán más adelante, cada sistema de archivos dispondrá de su propia tabla de i-nodos que apuntarán a los bloques de datos de los archivos y directorios contenidos en él.

El sistema de archivos que contiene el directorio raíz (normalmente el primer disco o la primera partición del primer disco en su caso) es el principal. En principio, cuando se carga el sistema operativo, la única parte accesible de la estructura es la contenida en el file system principal. Para poder acceder a la información contenida en los restantes sistemas de operación es necesario realizar una operación denominada "montaje". Esta operación consiste en enlazar cada sistema de archivos con directorios vacíos de la estructura principal. A partir de ese momento, los archivos y directorios de los sistemas de archivos secundarios figurarán dentro de la estructura, colgando del directorio de montaje.

Una vez montado todos los sistemas de archivos, la estructura es única, por lo que el disco o la partición en que esté físicamente un determinado archivo, es transparente para el usuario. La función de montaje y desmontaje de los sistemas de archivo es, normalmente, realizada por el administrador del sistema.

El sistema de archivos, o file system, de UNIX está caracterizado por:

Una estructura jerárquica,

Tratamiento consistente de los datos,

La habilidad de crear y borrar archivos,

Crecimiento dinámico de archivos,

La protección de los datos,

E tratamiento de los dispositivos periféricos como archivos.

Cada sistema de archivos consta fundamentalmente de las siguientes partes:

Bloque de carga: Este bloque, que es el primero de cada sistema (bloque cero), está reservado para un programa de carga. El bloque cero no tiene ningún significado en el sistema de archivos. Toda la información del sistema comienza en el bloque uno del dispositivo. Sólo se utiliza en el sistema de archivos principal.

18

Page 19: Cur So Unix

Manual de Unix

Súper bloque: El súper bloque es el bloque uno del dispositivo. Este bloque contiene información sobre el sistema de archivos, tales como su tamaño en bloques, el nombre del sistema de archivos, número de bloques reservados para i-nodos, la lista de i-nodos libres y el comienzo de la cadena de bloques libres. También contiene el nombre del volumen, momento de la última actualización y tiempo del último backup. Siempre reside en un bloque de 512 bytes.

I-nodos: A continuación del súper bloque están situados los bloques que contienen los i-nodos. El número de bloques de i-nodos varía dependiendo del número de bloques del sistema de archivos. El número de i-nodos está especificado en el súper bloque. Es una tabla que contiene información sobre las características de los archivos. Esencialmente es el bloque de control de los archivos. Hay un i-nodo por cada directorio y archivo del sistema de archivos. El i-nodo contiene una descripción del directorio o archivo, así como el lugar físico que ocupan sus bloques de datos. Los i-nodos sólo apuntan a los archivos o directorios de su mismo sistema de archivos.

Bloques de datos: El resto del espacio del dispositivo lógico consta de bloques de datos. Bloques de datos que contienen los datos actualmente almacenados en los archivos. Algunos bloques de datos sirven como bloques indirectos, conteniendo números de bloques (direcciones) de grandes archivos.

Figura 5. Estructura de un Sistema de Archivos.

El sistema de archivos está organizado en una estructura jerárquica. Este sistema jerárquico permite agrupar la información de los usuarios de una forma lógica. Permite manipular eficientemente un grupo de archivos como una sola unidad. No tiene ninguna limitación en su desarrollo, permitiendo un crecimiento dinámico tanto en su número como en su tamaño. El UNIX trata a los archivos de entrada o de salida del mismo modo que cualquier otro archivo. Los usuarios deberán "caminar" a través del árbol hasta encontrar el archivo deseado. Dentro del UNIX el usuario puede acceder a siete clases de archivos:

19

Page 20: Cur So Unix

Manual de Unix

Directorios.

Ordinarios.

De dispositivos tipo bloque.

De dispositivos tipo caracter.

Fifo (Pipes).

Ligas

Los directorios y los archivos ordinarios han sido ya comentados. Los archivos especiales se verán más adelante.

20

Page 21: Cur So Unix

Manual de Unix

2.5 MANEJO DE LOS I-NODOS

Cuando se intenta acceder a la información contenida en un archivo, el sistema accede al directorio al que pertenece y busca su nombre secuencialmente. Una vez encontrado toma el i-number asociado a ese archivo y con él accede a la entrada correspondiente a la tabla de i-nodos, que contendrá toda la información correspondiente a ese archivo excepto su nombre. Con esta información ya puede acceder físicamente a los bloques de datos dentro del sistema de archivos.

Esta forma de acceder físicamente a los bloques de datos puede parecer más compleja que la utilizada en otros sistemas operativos en los que se accede directamente con la información existente en el directorio, sin necesidad de tablas de i-nodos ni nada por el estilo, sin embargo presenta algunas ventajas. Por ejemplo, si en un directorio se añade una entrada con un nombre de archivo cualquiera, pero con un i-number ya utilizado en otro directorio, se podrá acceder a los mismos bloques de datos desde los dos directorios e incluso con diferentes nombres de archivos. En este caso se dice que existe un enlace entre ellos.

El UNIX mantiene la siguiente información para cada archivo; en la tabla de i-nodos:

Localización.

Tamaño.

Cuántos enlaces tiene el archivo.

Propietario.

Permisos de acceso.

Identificación de si es o no archivo.

Fecha de creación.

Fecha de modificación.

Fecha de último acceso.

Figura 2.6. Contenido de un i-nodo.

21

Page 22: Cur So Unix

Manual de Unix

Además, cada i-nodo contiene diez punteros directos con la dirección de los diez primeros bloques de datos, un puntero indirecto simple con la dirección de un bloque que contiene punteros directos, que a su vez apuntan a bloques de datos; un puntero indirecto doble que apunta a un bloque con punteros indirectos simples, que apuntan a bloques con punteros directos y éstos a bloques de datos; y un puntero indirecto triple. En la figura 2.7 se ve un ejemplo gráfico de esta estructura.

Figura 2.7. Estructura de los punteros.

22

Page 23: Cur So Unix

Manual de Unix

2.6 ARCHIVOS ESPECIALES

Además de los archivos normales de datos, dentro de la estructura de un sistema UNIX existen unos archivos especiales. Los nombres de estos archivos identifican los dispositivos físicos hardware del equipo:

Discos magnéticos

Cintas magnéticas

Terminales

Líneas de comunicaciones

Etc.

Cada tipo de dispositivo tiene un controlador responsable de comunicarse con este dispositivo. Dentro del sistema hay una tabla que apunta a los diferentes controladores de los dispositivos. Todos los dispositivos son tratados como archivos. Existen archivos especiales para cada línea de comunicaciones, disco, unidad de cinta magnética, memoria principal, etc. Estos archivos en realidad están vacíos. Tienen por misión asociar entre sí los dispositivos y sus respectivos drivers. El sistema emplea dos números enteros, denominados número principal (14 bits) y número secundario (18 bits) y almacenados en el i-nodo del archivo, para acceder al dispositivo asociado.

El número principal identifica una clase de dispositivo (en realidad identifica al driver de dicha clase como pueden ser terminales, impresoras, discos, etc.) y el número secundario identifica a un elemento de dicha clase (un terminal específico, un disco concreto, ...).

Las ventajas de tratar las unidades de entrada/salida de esta forma son:

Los archivos y dispositivos son tratados lo más similarmente posible.

Los nombres de ambos son pasados a los programas de la misma forma.

Los archivos especiales están sujetos al mismo tipo de protección de acceso que los archivos y directorios ordinarios.

Figura 2.8. Relación de un archivo especial.

23

Page 24: Cur So Unix

Manual de Unix

2.7 PRINCIPALES DIRECTORIOS

En la siguiente tabla se describen brevemente los contenidos y/o las utilidades de los seis principales directorios de UNIX

Directorio Contenido y/o función

/bin Contiene muchos de los archivos ejecutables correspondientes a los comandos.

/usr/bin Contiene también ejecutables del mismo tipo.

/usr/include Contiene librerías de lenguaje C. Muy útil para los programadores./dev Contiene archivos especiales asociados con dispositivos de

entrada/salida./etc Contiene entre otros, archivos ejecutables usados por el

administrador./tmp Utilizado para crear archivos temporales y de pruebas. Es borrado

periódicamente por el sistema de forma automática.

24

Page 25: Cur So Unix

Manual de Unix

2.8 PERMISOS DE ARCHIVOS Y DIRECTORIOS

Cada archivo y directorio creado en UNIX tiene un propietario, normalmente la persona que lo ha creado. Ese propietario pertenece además a un grupo de usuarios. El propietario del archivo o directorio puede asignar varios tipos de permisos, para permitir o denegar el acceso al archivo o directorio. Los tipos de permisos de acceso son:

Archivos:

Lectura (r) Permitiría su acceso para lectura.Escritura (w) Permitiría su actualización.

Ejecución (x)Permite que el archivo pueda ser usado como comando shell.

Directorios:Lectura (r) Permite ver su contenido.Escritura (w) Permite crear o borrar archivos bajo él.Ejecución (x) Permite accederse a él.

Cada usuario puede especificar el permiso de acceso a sus archivos, seleccionando la adecuada combinación de tipos de permisos, con el fin de permitir o denegar el acceso a tres niveles de usuarios (propietario, usuarios de su grupo, y el resto de usuarios). Más adelante se explica en detalle como se otorgan estos permisos o se niegan.

25

Page 26: Cur So Unix

Manual de Unix

2.9 CONTROL DE PROCESOS

En UNIX pueden ejecutarse varios procesos simultáneamente (esta característica es denominada algunas veces como multiprogramación o multitarea) sin un límite lógico en el número de ellos, y varias instancias del mismo programa pueden existir simultáneamente en el sistema. Algunas llamadas al sistema permiten a los procesos crear nuevos procesos, acabar procesos, sincronizar niveles de ejecución de procesos y controlar la reacción de algunos sucesos. Sujeto a sus propias llamadas al sistema, los procesos son independientes de los demás.

Generalmente, las llamadas al sistema permiten al usuario escribir programas que realicen sofisticadas operaciones, y como resultado, el kernel del sistema UNIX no contiene muchas funciones que son parte del "kernel" en otros sistemas. Estos programas, incluyendo compiladores y editores, son programas a nivel de usuario en el sistema UNIX. El principal ejemplo de estos programas es el shell, el intérprete de comandos que los usuarios ejecutan normalmente de entrar en el sistema.

El núcleo del sistema operativo UNIX conoce la existencia de un proceso a través de su bloque de control del proceso, donde se describe el proceso y su entorno, constituyendo un contexto consistente en:

Espacio de direccionamiento y entorno de ejecución: Variables que utiliza el proceso.

Contenido de los registros hardware: Contador de programa, registro de estado del procesador, puntero de la pila y registros de propósito general.

Contenido de las estructuras del núcleo relacionadas con el proceso: Tabla de proceso, áreas, regiones, etc.

Si congelamos el estado del procesador y del proceso que está en ejecución en un determinado momento, obtendríamos lo que se conoce como imagen estática del programa. En caso de producirse una interrupción o cambio de proceso, se almacena la imagen del que está en ejecución en ese mismo instante.

Cada proceso se reconoce dentro del sistema por un número que lo identifica unívocamente y que se conoce como Identificador del Proceso o PID.

Todos los procesos, excepto el proceso 0, son creados por otro proceso; es decir, el sistema de creación y gestión de procesos en UNIX es jerárquico.

26

Page 27: Cur So Unix

Manual de Unix

El proceso que se genera con el PID 0 es un proceso especial creado en el momento de arrancar el sistema. A continuación se genera un proceso init que será el antecesor de todos los procesos que se generen en el sistema. A partir de aquí se generan tantos procesos como terminales existan (se dará una descripción más adelante).

Los procesos que atienden a los terminales crearan otros con el fin de identificar y controlar el acceso de los usuarios al sistema, los cuales, una vez que inicien la sesión, ejecutarán un proceso intérprete de comandos Shell que será el que genere el resto de programas solicitados por el usuario.

27

Page 28: Cur So Unix

Manual de Unix

28

Page 29: Cur So Unix

Manual de Unix

El sistema UNIX maneja a todo como si estuviese tratando con archivos, y de éstos reconoce tres tipos:

Directorios y archivos ordinarios

Procesos y archivos estándar

Manipulación de texto

Un archivo ordinario es un contenedor de datos. Éste cuenta con un nombre para referenciarlo. Las órdenes que se trabajan sobre su nombre en realidad se ejecutan en su contenido, y éstas pueden ser para borrarlo, verlo, copiarlo o moverlo.

Un directorio es un archivo que contiene información sobre otros archivos y directorios. Dentro de un directorio pueden hallarse más directorios y a éstos se les llama subdirectorios.

29

Page 30: Cur So Unix

Manual de Unix

3.1 MANEJO DE ARCHIVOS Y DIRECTORIOS.

En este capítulo se darán a conocer los comandos más comunes que se utilizan en el manejo de archivos y directorios. Empecemos con los referentes a los directorios:

3.1.1 Visualización del directorio actualComando: pwd (print working directory)

Descripción: Imprime la ruta completa del directorio actual.

Cuando a un usuario se le da de alta en el sistema, también se le crea un directorio propio, que es al que se accesa directamente al entrar en sesión. Para lograr ver la ruta de acceso a él se teclea el comando y ésta se imprime en pantalla:

$pwd/users/ptc/nancy$

3.1.2 Listado de archivos de un directorio.Comando: ls (list)

Descripción: Imprime en pantalla los nombres de los archivos contenidos en el directorio especificado.

Si al ejecutar esta orden no se da un nombre de directorio, por default se ven los nombres de los archivos del directorio actual. Si en el directorio no hay archivos creados aún por el usuario, entonces, sólo aparecerá el prompt del sistema:

$ls$

En caso de que existan archivos en el directorio probablemente se verá algo como esto:

$lscarri clase nuevo$

30

Page 31: Cur So Unix

Manual de Unix

3.1.2.1 Opciones de ls.Opción: -l (large)

Descripción: Da información completa acerca de los archivos del directorio:

Si se desea tener información detallada acerca de un archivo, esta opción es muy útil para lograrla. Al teclear el comando se ve lo siguiente:

$ls -ltotal 16-rwxr--r-- 1 nancy ptc 163 Mar 4 11:00 carri-rw-r--r-- 1 nancy ptc 379 Mar 4 10:24 clasedrwxr-xr-x 2 nancy ptc 64 Mar 4 10:56 nuevo$

Revisemos el significado de los campos que aparecen al listar con ls.

-rwxr--r-- 1 nancy ptc 163 Mar 4 11:00 carri

Permisos Nombre del Nombre del archivo del Tamaño archivo dueño del Número archivo de ligas Nombre Hora y fecha de del ltima modificación grupo

En la primer columna se da información acerca del tipo de archivo que se trata archivo regular (-), directorio (d), archivos de dispositivos tipo bloque (b), archivos de dispositivos tipo carácter (c), fifo (f), socket (s) o liga (l), y permisos de usuario, grupo y otros.

En la segunda se muestra el número de ligas que tiene el archivo. En la tercera se puede ver el nombre del propietario del archivo. En la cuarta se puede ver el nombre del grupo al que se pertenece.

31

Page 32: Cur So Unix

Manual de Unix

En la quinta muestra el tamaño del archivo en bytes, si se tratara de un archivo de texto, este número indica el número de caracteres que contiene. En la sexta se especifica la fecha y hora de la última modificación. En la última columna se muestra el nombre del archivo.

Opción: -a (all)

Descripción: Al utilizar esta opción de ls se le pide al sistema que muestre todo tipo de archivos, incluso los ocultos.

Si tecleamos al comando con esta opción combinada con la opción -l en el directorio anterior aparece esto:

$ ls -latotal 29drwxr-xr-x 7 nancy ptc 1024 Mar 6 14:29 .drwxr-xr-x 24 root ptc 1024 Feb 23 11:32 ..-rwxr--r-- 1 nancy ptc 163 Mar 4 11:00 carri-rw-r--r-- 1 nancy ptc 379 Mar 4 10:24 clasedrwxr-xr-x 2 nancy ptc 64 Mar 4 10:56 nuevo$

Ahora notamos que aparecen dos archivos nuevos "." y "..". Estos dos nombres se refieren al directorio actual y al directorio padre respectivamente. Sin importar en qué lugar se esté trabajando, "." hace referencia al directorio en el que se esté y ".." al inmediatamente superior en la jerarquía del sistema.

Opción: -x

Descripción: Lista los nombres de archivo por línea en orden alfabético.

Si el directorio contiene un número considerable de archivos, esta opción ayuda a ahorrar espacio, colocando un nombre tras de otro. Probemos esta opción en el directorio padre del actual:

$ls -x ..antonio argos david doom falcon firebird gork gusinvent jess morfeo nancy navajo pcs ptcweb raqrody seiya sergio skid steeler yumbe4$

Opción: -C

32

Page 33: Cur So Unix

Manual de Unix

Descripción: Coloca los nombres de archivos del directorio especificado por orden alfabético en forma de columnas.

Ejecutando la opción -C con el directorio anterior se obtiene el siguiente resultado:

33

Page 34: Cur So Unix

Manual de Unix

$ls -C /users/ptcantonio doom gork jess navajo raq sergio yumbe4argos falcon gus morfeo pcs rody skiddavid firebird invent nancy ptcweb seiya steeler$

Opción: -p

Descripción: Indica si un nombre de archivo es directorio o no.

Esta opción es muy útil si no se quiere el listado largo del directorio si no sólo saber los subdirectorios que existen en él. Al ejecutar la opción se indica que es un subdirectorio señalándolo con un "/" al final del nombre del archivo:

Ejecutando la opción -p se obtiene el siguiente resultado:

$ls -pcarri clase nuevo/$

Opción: -F

Descripción: Indica qué archivos son subdirectorios y también cuáles son ejecutables.

Al usar esta opción, los archivos ejecutables y los directorios se señalan con un * y con un /, respectivamente. Al igual que en la opción anterior, estos símbolos no forman parte del nombre del archivo.

$ls -pcarri* clase nuevo/$

Opción: -t

Descripción: Ordena a los nombres de archivos por su fecha de última modificación.

Al usar esta opción es conveniente combinarla con –l, para poder observar los resultados del comando. Al usarse en el directorio que se está trabajando muestra algo como esto:

34

Page 35: Cur So Unix

Manual de Unix

$ls -lt-rw-r--r-- 1 nancy ptc 163 Mar 4 11:00 carridrwxr-xr-x 2 nancy ptc 64 Mar 4 10:56 nuevo-rw-r--r-- 1 nancy ptc 379 Mar 4 10:24 clase$

Como se puede ver, ahora los archivos no han sido ordenados alfabéticamente, sino por el penúltimo campo que es el de fecha y hora.

Opción: -u

Descripción: Al usar esta opción los archivos se listan por la última fecha en la que se acceso a ellos.

Al combinar esta opción con -l se ve la siguiente pantalla:

$ls -lu-rw-r--r-- 1 nancy ptc 163 Mar 5 15:36 carri-rw-r--r-- 1 nancy ptc 379 Mar 4 10:24 clasedrwxr-xr-x 2 nancy ptc 64 Mar 7 13:06 nuevo$

La diferencia con la opción anterior radica en la operación efectuada sobre el archivo. La modificación implica forzosamente escritura, mientras que el acceso puede hacer referencia a una simple lectura o ejecución.

Opción: -r

Descripción: Entrega el listado de archivos en orden inverso al normal.

Cuando se utiliza una opción como -t o -u, el orden en que aparecen los nombres de archivos es por la última fecha de modificación o acceso. Si se quisiera ordenarlos por la primera fecha de modificación o acceso debe usarse esta opción. Al usarse esta opción se despliega algo como esto:

$ls -ltr-rw-r--r-- 1 nancy ptc 379 Mar 4 10:24 clasedrwxr-xr-x 2 nancy ptc 64 Mar 4 10:56 nuevo-rw-r--r-- 1 nancy ptc 163 Mar 4 11:00 carri$

35

Page 36: Cur So Unix

Manual de Unix

3.1.3 Cambio de directorios.Comando: cd (change directory)

Descripción: Sitúa al usuario en otro directorio de trabajo.

/

users bin etc dev

ptc local sh date who passwd tty00 tty01

nancy bin

archivo

El siguiente ejemplo muestra el uso del comando:

$cd /etc$pwd/etc$

Se puede utilizar el comando para ir a cualquier parte del árbol de jerárquico, el directorio que se encuentra encima de un archivo o un directorio es el directorio padre y se representa con .. (punto-punto). El directorio en el cual nos ubiquemos es representado por . (un punto).

Es conveniente que cada vez que se haga un cd se verifique el directorio en el que se está para evitar problemas que podrían ser graves, como el borrar archivos que no se querían borrar.

Cuando se encuentra en un directorio que no es el propio se puede regresar a él fácilmente tecleando sólo cd. Esta orden lo llevará ahí automáticamente:

$pwd/etc$cd$pwd/users/ptc/nancy$

36

Page 37: Cur So Unix

Manual de Unix

3.1.3.1 Rutas completas y rutas relativas.Existen dos formas de accesar a un archivo o a un directorio, la primera es escribiendo el

nombre de la ruta completa (absoluta) y la segunda es utilizando una ruta relativa. Ruta Absoluta. Al mencionar ruta completa se quiere decir que hay que especificar el

nombre de los directorios y subdirectorios por los que hay que pasar para llegar a archivo especificado comenzando desde la raíz del sistema.

Ruta Relativa. La ruta relativa se refiere a cómo llegar a ese archivo desde el directorio en que se está trabajando. Para el uso de este tipo de desplazamiento por el sistema de archivos, es de máxima importancia el conocimiento y compresión de los operadores ‘.’ y ‘..’.

/

users bin etc dev

ptc local sh date who passwd tty00 tty01

nancy bin

archivo

Utilizando el árbol jerárquico, se puede llegar a un sub directorio /users/local/bin haciendo uso de su ruta completa, esto es comenzando desde la raíz ( / )

$pwd/users/ptc/nancy$cd /users/local/bin$pwd/users/local/bin$

Ahora haciendo lo anterior pero con ruta relativas, primero subimos dos niveles y posteriormente se bajan dos:

37

Page 38: Cur So Unix

Manual de Unix

$cd$pwd$/users/ptc/nancy$cd ../../local/bin$pwd/users/local/bin$

En este segundo ejemplo se ve como se hace referencia al directorio padre del actual (ptc), con los dos punto ( .. ). Luego al padre del padre (users), que es donde esta el subdirectorio local, y, por último se da el nombre del directorio al que se quería llegar.

En este ejemplo tal vez parezca que es incómodo usar las rutas relativas, pero no sería así si al subdirectorio que se quisiera llegar estuviera en el directorio padre.

3.1.4 Examinar archivosComando: cat

Descripción: Muestra el contenido de un archivo en pantalla.

Para que el resultado de la ejecución de este comando tenga significado, debe de utilizarse sobre un archivo de texto. El siguiente ejemplo muestra el uso de cat sobre un archivo ya creado en el directorio /usr/pub:

$cat /usr/pub/ascii|000 nul|001 soh|002 stx|003 etx|004 eot|005 enq|006 ack|007 bel||010 bs |011 ht |012 nl |013 vt |014 np |015 cr |016 so |017 si ||020 dle|021 dc1|022 dc2|023 dc3|024 dc4|025 nak|026 syn|027 etb||030 can|031 em |032 sub|033 esc|034 fs |035 gs |036 rs |037 us ||040 sp |041 ! |042 " |043 # |044 $ |045 % |046 & |047 ' ||050 ( |051 ) |052 * |053 + |054 , |055 - |056 . |057 / ||060 0 |061 1 |062 2 |063 3 |064 4 |065 5 |066 6 |067 7 ||070 8 |071 9 |072 : |073 ; |074 < |075 = |076 > |077 ? ||100 @ |101 A |102 B |103 C |104 D |105 E |106 F |107 G ||110 H |111 I |112 J |113 K |114 L |115 M |116 N |117 O ||120 P |121 Q |122 R |123 S |124 T |125 U |126 V |127 W ||130 X |131 Y |132 Z |133 [ |134 \ |135 ] |136 ^ |137 _ ||140 ` |141 a |142 b |143 c |144 d |145 e |146 f |147 g ||150 h |151 i |152 j |153 k |154 l |155 m |156 n |157 o ||160 p |161 q |162 r |163 s |164 t |165 u |166 v |167 w ||170 x |171 y |172 z |173 { |174 | |175 } |176 ~ |177 del|$

Esta tabla muestra los valores ascii de todos los caracteres en notación octal.

38

Page 39: Cur So Unix

Manual de Unix

Cuando se teclea mal el nombre de un archivo o éste no existe, en la pantalla se ve un mensaje que dice:

$ cat cari cat: cannot open cari: No such file or directory$

Si al examinar un archivo resulta que su contenido es muy largo, se puede abortar el comando con la combinación CTRL-S o CTRL-Q.

3.1.4.1 Redireccionamiento.

Existen tres operadores que sirven para el direccionamiento del contenido de un archivo, los operadores son:

“ > “ Envía la salida hacia un archivo. Si el archivo no existe lo crea, si el archivo ya existe lo sobre escribe.

“>>” Envía la salida hacia un archivo. Si el archivo no existe lo crea, si el archivo ya existe va a concatena la salida al final del archivo.

“ < “ Toma como entrada el archivo.

Para redireccionar la salida de cat de un archivo a otro podemos hacer lo siguiente:

$ cat /usr/pub/ascii > ascii$lscarri clase nuevo ascii$

ls se usó sólo para verificar la ejecución del comando anterior. En el ejemplo se puede ver, cat creó el archivo ascii, que no existía. Si el archivo hubiera existido, su contenido anterior habría desaparecido y la salida de cat se le habría copiado.

Como UNIX maneja a los dispositivos como archivos, también se puede direccionar un resultado a una terminal:

39

Page 40: Cur So Unix

Manual de Unix

$ tty /dev/ttyp2$cat ascii > /dev/ttyp2|000 nul|001 soh|002 stx|003 etx|004 eot|005 enq|006 ack|007 bel||010 bs |011 ht |012 nl |013 vt |014 np |015 cr |016 so |017 si ||020 dle|021 dc1|022 dc2|023 dc3|024 dc4|025 nak|026 syn|027 etb||030 can|031 em |032 sub|033 esc|034 fs |035 gs |036 rs |037 us ||040 sp |041 ! |042 " |043 # |044 $ |045 % |046 & |047 ' ||050 ( |051 ) |052 * |053 + |054 , |055 - |056 . |057 / ||060 0 |061 1 |062 2 |063 3 |064 4 |065 5 |066 6 |067 7 ||070 8 |071 9 |072 : |073 ; |074 < |075 = |076 > |077 ? ||100 @ |101 A |102 B |103 C |104 D |105 E |106 F |107 G ||110 H |111 I |112 J |113 K |114 L |115 M |116 N |117 O ||120 P |121 Q |122 R |123 S |124 T |125 U |126 V |127 W ||130 X |131 Y |132 Z |133 [ |134 \ |135 ] |136 ^ |137 _ ||140 ` |141 a |142 b |143 c |144 d |145 e |146 f |147 g ||150 h |151 i |152 j |153 k |154 l |155 m |156 n |157 o ||160 p |161 q |162 r |163 s |164 t |165 u |166 v |167 w ||170 x |171 y |172 z |173 { |174 | |175 } |176 ~ |177 del|$

El comando tty despliega el nombre de las terminales en las que está en sesión el usuario, en este caso fue ttyp2. Al redireccionar la salida de cat a la terminal, apareció el archivo, como se esperaba.

Un ejemplo con “ >> “ es el siguiente:

$ cat arch1En este ejemplo se va a concatenar un archivo al final deotro, este es el primero$ cat arch2Este es el segundo archivo y este quedara al final del arch1, para esto se utiliza “>>”.$ cat arch2 >> arch1$ cat arch1En este ejemplo se va a concatenar un archivo al final deotro, este es el primeroEste es el segundo archivo y este quedara al final del arch1, para esto se utiliza “>>”.

En este ejemplo tenemos dos archivos, y el segundo fue concatenado al primero, si envés de utilizar “>>”, se hubiera utilizado “>” los dos archivos tendrían el mismo contenido.

Una forma de utilizar el “<” es la siguiente

$ mail jim < nota

40

Page 41: Cur So Unix

Manual de Unix

En este ejemplo, el contenido del archivo nota es utilizado como entrada para la orden mail jim (más adelante se explica el comando mail). Como consecuencia, Jim recibirá el fichero en su correo electrónico.

Se puede redirigir tanto la entrada como la salida estándar al mismo tiempo, como se muestra aquí:

$ cat < nota > n.copia

Este ejemplo hace que el shell ejecute la orden cat con el fichero nota como entrada y que envíe la salida al fichero n.copia. El shell exige que el nombre de la orden sea lo primero que aparezca en la línea, con los operadores de redirección a continuación. También podría escribirse de la siguiente forma:

$ cat > n.copia < nota

3.1.4.2 Combinación de archivos.

Otra utilidad del comando cat que tiene una forma muy fácil de concatenar archivos. Por ejemplo, si se quisiera que en un archivo se copiara el texto de otros dos, tendríamos que teclear algo semejante a esto:

$cat /usr/pub/ascii /usr/pub/eqnchar >> ascii$

Esta línea copiará los archivos ascii y eqnchar, en ese orden, del directorio /usr/pub al final del archivo ascii, situado en el directorio actual.

3.1.4.3 Creación de archivos.

Con el comando cat se pueden crear archivos de texto de una forma muy fácil, pero esta es la manera que ofrece menos control sobre el formato de lo escrito, pues se trata de un editor de texto. La forma de hacerlo es la siguiente:

41

Page 42: Cur So Unix

Manual de Unix

$cat > nuevoEste es un archivo nuevo.^D$

cat toma del teclado, que es la entrada por default en el redireccionamiento, lo que se escriba en él y lo manda al archivo nuevo. Para guardar el archivo sólo se oprimen las teclas Ctrl-D en la última línea y el archivo se crea. Para agregar texto al final del archivo nuevo se teclearía:

$cat >> nuevoAgrego más texto al archivo nuevo.^D$

Al teclear una línea en el archivo y pulsar enter, esa línea ya no se podrá modificar. Sólo se podrán borrar caracteres en la línea que se esté escribiendo.

3.1.5 Contenido de archivos.Comando: pg

Descripción: Lista el contenido de un archivo en pantalla.

Cuando se tiene un archivo demasiado largo, con el comando cat sólo se alcanza a ver el final de él en la pantalla. El comando pg también visualiza el contenido del archivo, pero con la diferencia de que si se tiene una pantalla de 24 líneas, esta orden desplegará sólo 23 líneas del contenido y en la última esperará una nueva orden con los dos puntos :.

En el siguiente ejemplo se muestra el uso del comando pg sobre el archivo passwd, ubicado en el directorio /etc. En el ejemplo se muestra lo descrito en el párrafo anterior y si se teclea una h después de los dos puntos aparecerá un menú de opciones como aquí:

$pg /etc/passwd...prebe03:x:203:101:Precandidato Becario:/users/precand/prebe03:/bin/ksh:h------------------------------------------------------- h help q or Q quit <blank> or \n next page l next line d or ^D display half a page more . or ^L redisplay current page f skip the next page forward

42

Page 43: Cur So Unix

Manual de Unix

n next file p previous file $ last page w or z set window size and display next page s savefile save current file in savefile /pattern/ search forward for pattern ?pattern? or ^pattern^ search backward for pattern !command execute command Most commands can be preceded by a number, as in:+1\n (next page); -1\n (previous page); 1\n (page 1).See the manual page for more detail.-------------------------------------------------------:q

$

3.1.5.1 Ver el final de un archivo.Comando: tail

Descripción: Permite ver las últimas líneas especificadas de un archivo.

El comando tail se utiliza para mirar al final, del archivo especificado como argumento. Esté escribe por omisión las diez últimas líneas del fichero sobre la salida estándar como se muestra

$tail /etc/profileif [ $LOGNAME != root]then news –nfi;;-su):;;esacexport PATH;trap 1 2 3$

También puede llevar un número a continuación del argumento opción -, para especificar un número de líneas distinto a diez que visualizar. Por ejemplo:

$tail –4 /etc/profile;;esacexport PATH;

43

Page 44: Cur So Unix

Manual de Unix

trap 1 2 3$

44

Page 45: Cur So Unix

Manual de Unix

Si el número se antecede por un “-”, entonces se mostrarán las últimas líneas especificadas. Si el número se antecede por un “+”, se ven las últimas líneas a partir del número de línea tecleado. Además, el número puede ir seguido de una letra para contar en unidades distintas a líneas.

Opción: -c

Descripción: Al utilizar esta opción se tomaran los últimos n caracteres del archivo.

Opción: -b

Descripción: Al utilizar esta opción se mostrarán los últimos n bloques del archivo.

Opción: -f

Descripción: Cuando un programa esta escribiendo un archivo, y se requiere vigilar el final, esta opción es muy eficiente. Con esta opción visualiza caa nueva línea que entra al fichero conforme se escribe.

Esta opción no finaliza por sí misma, se debe eliminar presionando la tecla DEL cuando haya terminado de ver el final del archivo.

3.1.5.2 Ver el inicio de un archivo.Comando: head

Descripción: Visualiza en pantalla las primeras líneas de un archivo.

Este comando actúa como tail, pero muestra el comienzo de un archivo en lugar del final. Este comando acepta una lista de nombre de ficheros como argumentos, o lee de su entrada estándar si no se especifican los archivos. Por omisión head muestra las diez primeras líneas de cada fichero de entrada, pero se puede cambiar esto añadiendo un número a la línea de orden de la siguiente forma:

$ head –4 /etc/profile#ident “@(#)/etc/profile.sl 1.1 4.0 12/26/89 60576 AT&T-SF”trap “” 1 2 3umask 022 # define mascara implícita de creación de ficheros. /etc/TIMEZONE$

45

Page 46: Cur So Unix

Manual de Unix

Este comando a diferencia con el tail, es que solamente puede mostrar las primeras líneas, cuando con tail depende del signo que antecede al número, en este solo se coloca “-”. Esté al igual que el anterior el número puede ir seguido de una letra para contar en unidades distintas a líneas. Estas letras (banderas) son las mismas que tiene el comando tail. Obviamente no se puede utilizar “-f” para hacer un seguimiento de la cabeza de un fichero.

3.1.6 Determinación del tipo de archivo.Comando: file

Descripción: Determina de qué tipo es un archivo.

Cuando se utilizan los comandos para ver el contenido de un archivo, si el escogido no es uno de texto, se verá algo inentendible en la pantalla. Para evitar esto se puede usar el comando file, que dice de qué tipo es un archivo. En el siguiente ejemplo se aclara su función:

$file nuevo clasenuevo: directoryclase: ascii text$

Si el archivo nombrado no existe o no se tienen permisos de lectura sobre él aparecerá un mensaje de error en la pantalla.

3.1.7 Metacaracteres.

Antes de continuar sería conveniente describir una de las características más potentes del Sistema V de UNIX, que es su capacidad de utilizar una notación abreviada para hacer referencia a conjuntos de caracteres. Esto se logra utilizando un conjunto de caracteres especiales llamados comodines o metacaracteres. Éstos se utilizan para hacer una correspondencia con nombres de archivos o con partes de nombres de ellos. Su equivalencia es la que sigue:

* : Representa a toda una cadena de caracteres o a la cadena nula.

?: Representa a cualquier caracter simple.

[abc]: La correspondencia es cualquier caracter encerrado entre los corchetes, es decir, una a, una b o una c, en este caso. Si las letras entre los corchetes se separan por un -, la correspondencia será cualquier caracter entre ese rango especificado. Por ejemplo, [0-9] corresponderá a cualquier caracter entre 0 y 9, inclusive.

46

Page 47: Cur So Unix

Manual de Unix

En los siguientes ejemplos se muestra el uso de la correspondencia de estos caracteres.

$ ls -l /etc/x* -rwxr--r-- 1 root sys 2729 Mar 07 1993 /etc/xdaemon.rc-rwx------ 1 bin bin 2481 Mar 15 1993 /etc/xinstall-rwx--x--x 2 bin bin 25716 Mar 10 1993 /etc/xnstatus-r-xr-xr-x 1 bin bin 110926 Mar 12 1993 /etc/xntpd-r-xr-xr-x 1 bin bin 98518 Mar 12 1993 /etc/xntpdc-r-xr-xr-x 1 bin bin 58618 Mar 12 1993 /etc/xntpres-rw-r--r-- 1 root other 823 Mar 18 11:53 /etc/xtab$

Este ejemplo muestra a todos los archivos de /etc cuyos nombres comienzan con la letra x. Si por ejemplo deseáramos conocer los archivos de /etc que tienen una d al principio y una s al final usaríamos la siguiente orden:

$ ls -l /etc/d*s -rw-rw---- 1 bin terminal 0 Mar 15 1993 /etc/dialups$

Si quisiéramos listar a todos los archivos del directorio /etc simplemente teclearíamos ls * y ya está.

Para el uso del caracter ? supongamos que necesitamos conocer los archivos del /etc que comienzan con a y les sigue cualquier caracter y después una t con cualquier otra cadena, entonces teclearíamos:

$ ls -l /etc/a?t* -rwx------ 2 bin bin 2966 Mar 15 1993 /etc/asktime-rwx------ 2 bin bin 2966 Mar 15 1993 /etc/asktimerc$

Usar los corchetes tiene mucha ventaja, ya que con ellos podemos manejar rangos o selecciones. Por ejemplo, si queremos conocer el nombre de archivos y directorios que comienzan con las letras t, u, v, w, x, y o z de ese mismo directorio, tendríamos que teclear:

$ls -dx /etc/[tuvwxyz]* /etc/talkd /etc/tcbck /etc/tcp /etc/telnetd/etc/termcap /etc/tftpd /etc/timed /etc/timedc/etc/traceroute /etc/trpt_data /etc/ttytype /etc/tz/etc/tz.form /etc/uadmin /etc/umount /etc/umountall/etc/unlink /etc/updateds /etc/utmp /etc/utmp_getty

47

Page 48: Cur So Unix

Manual de Unix

/etc/uucpd /etc/uuinstall /etc/vcabort /etc/volcopy/etc/wall /etc/wdnsetup /etc/whodo /etc/winenv.def

48

Page 49: Cur So Unix

Manual de Unix

/etc/wtmp /etc/xdaemon.rc /etc/xinstall /etc/xnstatus/etc/xntpd /etc/xntpdc /etc/xntpres /etc/xtab/etc/yp /etc/ypbind /etc/yppasswdd /etc/ypserv/etc/ypxfrd$

Esta misma tarea se hubiera podido hacer con estas otras órdenes:

$ ls -dx /etc/[t-z]* /etc/talkd /etc/tcbck /etc/tcp /etc/telnetd/etc/termcap /etc/tftpd /etc/timed /etc/timedc/etc/traceroute /etc/trpt_data /etc/ttytype /etc/tz/etc/tz.form /etc/uadmin /etc/umount /etc/umountall/etc/unlink /etc/updateds /etc/utmp /etc/utmp_getty/etc/uucpd /etc/uuinstall /etc/vcabort /etc/volcopy/etc/wall /etc/wdnsetup /etc/whodo /etc/winenv.def/etc/wtmp /etc/xdaemon.rc /etc/xinstall /etc/xnstatus/etc/xntpd /etc/xntpdc /etc/xntpres /etc/xtab/etc/yp /etc/ypbind /etc/yppasswdd /etc/ypserv/etc/ypxfrd$$ $ ls -dx /etc/[!a-s]* /etc/TIMEZONE /etc/X0.hosts /etc/X1.hosts /etc/X2.hosts/etc/X3.hosts /etc/X4.hosts /etc/X5.hosts /etc/X6.hosts/etc/X7.hosts /etc/_fst /etc/talkd /etc/tcbck/etc/tcp /etc/telnetd /etc/termcap /etc/tftpd/etc/timed /etc/timedc /etc/traceroute /etc/trpt_data/etc/ttytype /etc/tz /etc/tz.form /etc/uadmin/etc/umount /etc/umountall /etc/unlink /etc/updateds/etc/utmp /etc/utmp_getty /etc/uucpd /etc/uuinstall/etc/vcabort /etc/volcopy /etc/wall /etc/wdnsetup/etc/whodo /etc/winenv.def /etc/wtmp /etc/xdaemon.rc/etc/xinstall /etc/xnstatus /etc/xntpd /etc/xntpdc/etc/xntpres /etc/xtab /etc/yp /etc/ypbind/etc/yppasswdd /etc/ypserv /etc/ypxfrd$

Como se puede ver, la última orden selecciona no sólo a los archivos o directorios que empiezan con las minúsculas requeridas, sino también los que comienzan con esas letras, pero mayúsculas. El caracter ! dentro de los corchetes, como se puede ver, invierte la correspondencia de los caracteres.

En estos ejemplos se uso sólo el comando ls pero metacaracteres se pueden utilizar con cualquier comando, no sólo con éste.

49

Page 50: Cur So Unix

Manual de Unix

3.1.8 Borrado de archivos.Comando: rm (remover)

Descripción: Borra los archivos especificados.

La orden rm suprime silenciosamente el archivo y luego regresa al shell por una nueva orden. El uso de este comando es sencillo, sólo se da el nombre del archivo o archivos que se quieren borrar, delante de la orden y ya está, los archivos son suprimidos. Una cosa muy importante al usar este comando es saber con certeza el directorio actual de trabajo ya que si se da una orden de borrado de todos los archivos que se encuentren y no se está en el directorio en el que se pensaba, se pueden tener sorpresas desagradables. El siguiente ejemplo ilustra el uso de esta orden:

$pwd/users/ptc/kyo$cd textos$lsholahola2mensaje$rm *$ls$

el comando ha borrado todos los archivos de este subdirectorio, como se puede ver. En el sistema UNIX no hay modo de recuperar un archivo una vez que ha sido suprimido con rm. Puesto que el comando rm es tan potente, sería deseable recibir una petición de confirmación antes de suprimir un archivo. Por las limitaciones anteriores, se tienen las siguientes opciónes.

3.1.8.1 Opciones de rmOpción: -i (interactive)

Descripción: Antes de borrar, el sistema pregunta para confirmar la acción.

Para cada archivo en la lista de borrado se pregunta si en realidad se desea efectuar la operación. Si los archivos del directorio textos no se hubieran borrado y se utilizara ahora rm con la opción -i, se vería lo siguiente:

$cd$rm -i textos/hola textos/hola2 textos/mensaje textos/hola: ? ntextos/hola2: ? ytextos/mensaje: ? y$

50

Page 51: Cur So Unix

Manual de Unix

Lo que ser obtiene como resultado de las líneas anteriores es que el archivo hola no se borra, mientras que el archivo hola2 y mensaje son eliminados.

Opción: -f (forzado)

Definición: Forza la eliminación de archivos, sin verificar aun cuando estos no tengan permisos de escritura.

Opción: -r (recursivo)

Definición: Esta opción busca hacia abajo en el árbol del directorio y va borrando archivos y subdirectorios desde el directorio actual en adelante. Al utilizar esta opción se debe tener cuidado para no borrar algo que no se deseaba suprimir.

El comando es muy silencioso, esté puede ser una operación muy peligrosa. Para que no se vallan a eliminar archivos que no corresponden,es recomendable utilizar la opción “-i” para que pregunte siempre.

3.1.9 Creación de directorios.Comando: mkdir (construir un directorio [make dir])

Definición: Permite crear contenedores de archivos (directorios).

Ya vimos que cuando existe un usuario en un sistema UNIX a este se le da un directorio de trabajo. Cada usuario es responsable del contenido de su directorio y en él puede crear tantos archivos y subdirectorios como necesite. El comando indicado para crear directorios es el mkdir.

En el próximo ejemplo se ve el uso de este comando:

$mkdir programs textos$cd programs$mkdir c pascal$cd$ls –l

Este proceso pudo hacerse también de la siguiente forma:

$mkdir programas textos programs/c programs/pascal$ls -ltotal 5 drwxr-xr-x 4 kyo ptc 64 Mar 18 15:35 programs drwxr-xr-x 2 kyo ptc 32 Mar 18 15:35 textos$

51

Page 52: Cur So Unix

Manual de Unix

Si antes de crear el directorio programs se hubiera intentado crear los subdirectorios c y pascal, el sistema hubiera mandado un mensaje como este:

mkdir: cannot acces programs/$

Debe tenerse cuidado al crearse directorios de estar en el directorio casa para evitar problemas con los permisos y confusiones.

3.1.10 Borrado de directorios.Comando: rmdir (remove dir)

Descripción: Con este comando se logra el borrado de los directorios especificados.

Para que un directorio pueda ser borrado con este comando es indispensable que esté vacó, si no la operación no podrá ejecutarse. Por ejemplo, si se quisiera borrar el directorio programs/c sucedería lo siguiente:

$pwd/users/ptc/kyo$rmdir programs/crmdir: programs/c: Directory not empty$

Para lograr lo que se quería en las líneas anteriores se debe hacer lo siguiente:

$cd programs/c$rm *$cd ..$rmdir programs/c$lspascal$

Si se quiere borrar un archivo que no existe, se mandará un mensaje que dice:

$rmdir uno rmdir: uno: Directory does not exist$

52

Page 53: Cur So Unix

Manual de Unix

3.1.11 Copiado de archivos.Comando: cp (copy)

Descripción: Crea una copia del archivo indicado.

Utilice la orden cp para crear una copia exacta de un fichero de la siguiente forma:

$ lsLEEME dir1 nota$ cp nota nota.copia$ lsLEEME dir1 nota nota.copia$

En este ejemplo, el primer argumento es el archivo existente y el segundo argumento el nuevo fichero a crear. Para los argumentos, se puede dar la ruta relativa o absoluta, como en este ejemplo:

$ cp nota /home/steve/nota.copia

Si el fichero o camino destino ya existe, la orden cp suprimirá el fichero antiguo y creará luego la copis sin nunguna advertencia, por lo que debe tenerse cuidado de que el nombre de fichero destino sea correcto.

Si el camino destino es un directorio existente en lugar de un nombre de archivo, la copia se coloca en ese directorio, manteniendo el mismo nombre que el archivo fuente del modo siguiente:

$ pwd/home/steve$ ls dir1dir2 adios hola$ cp nota dir1ls dir1dir2 adios hola nota$

La orden cp también acepta una lista de nombres de ficheros como fuente y copiará todos esos archivos al destino. Cuando se especifican múltiples nombres como fuente, debe darse un directorio y no un nombre de archivo como destino, o si no se producirá un error; cp copiará todos los archivos designados como fuentes en el directorio destino, como en el siguiente ejemplo:

53

Page 54: Cur So Unix

Manual de Unix

$ pwd/home/steve/dir1$ ls dir2abajo arriba$ cp hola adios dir2ls dir2Abajo adios hola arriba$

No se puede utilizar un directorio como nombre fuente. Si se desea copiar el contenido de un directorio a un nuevo directorio, debe designar cada uno de los ficheros que se desea copiar, ya sea explícitamente o con el metacaracter “ * ”, como en el ejemplo:

$ pwd/home/steve$ cp dir1/* .$

Para poder copiar un archivo completo se utiliza la –R, por lo que el ejemplo anterior quedaría:

$ pwd/home/steve$ cp –R dir1 .$

Cuando se copia un archivo también se copian los permisos que tenía, el de origen. El nombre de la copia puede ser el mismo que el original, si la copia no estará en el mismo directorio, de lo contrario se producirá un error.

3.1.12 Cambiar un archivo de directorio y de nombre.Comando: mv (move)

Definición: Cambia de nombre o de directorio a un archivo.

Este comando puede cambiar de nombre a un archivo, igual que copy, con la diferencia de que el archivo fuente será borrado. También puede cambiar de directorio a un archivo con la opción de conservar el nombre o de cambiarlo.

En los siguientes ejemplos se muestra su uso:

54

Page 55: Cur So Unix

Manual de Unix

$lshola$mv hola mensaje$lsmensaje$

En las líneas anteriores se cambió el nombre del archivo hola por el de mensaje. Como se ve hola desapareció.

$lsmensaje textos$ mv mensaje ./textos/hola2$ls textos holahola2mensaje$lstextos$

En la acción anterior se cambió de directorio y de nombre al archivo mensaje.

Al igual que con el comando cp, la orden mv puede mover varios archivos a un mismo directorio en la misma línea de comando. El proceso es análogo a como se vió en cp.

Es necesario decir sobre mv que si el nombre del archivo destino existe y tiene permisos de escritura, entonces será borrado sin preguntar y su contenido anterior se perderá. Si no, el sistema preguntará si se quiere seguir con el proceso..

3.1.13 Permisos de un archivo o directorio.

El sistema UNIX da una forma de permitir o restringir accesos a una archivo o directorio por parte de un usuario. Estos permisos sólo pueden ser dados por el creador del archivo o por el administrador del sistema. Para ver los permisos que tiene un archivo se utiliza el comando ls -l, como ya se vió antes.

Los permisos de un archivo son de tres tipos y se les pueden otorgar a tres clases distintas de usuarios. Los tipos de permisos son de lectura, de escritura y de ejecución. Los permisos se pueden otorgar al usuario (quien creó el archivo), al grupo (usuarios con el mismo directorio padre del propio) y a otros (usuarios de otros grupos).

55

Page 56: Cur So Unix

Manual de Unix

El permiso de lectura se refiere a que un usuario tiene acceso al archivo para ver su contenido. El de escritura sirve para poder modificar un archivo. El de ejecución es para que se pueda usar el archivo como comando del sistema.

Para un directorio los significados son ligeramente diferentes: acceso de lectura significa que el sujeto tiene permitido examinar el contenido del directorio. El acceso de escritura significa que el usuario puede crear un archivo en el directorio y acceso de ejecución que el usuario puede atravesar el directorio en su búsqueda de subdirectorios.

permiso permiso permiso de de de lectura escritura ejecución

- r w x r w x r w x

permisos permisos para el para usuario otros Permisos para el grupo

Si un archivo carece de algún permiso, esto se nota al listarlo con la opción -l. Si en lugar de la letra que indica el permiso aparece un “-”, esto significa que ese permiso está restringido para el bloque en el que aparezca (para el usuario, para el grupo o para otros).

El sistema Unix proporciona varias órdenes para manipular la propiedad y los permisos de los ficheros y directorios. Los permisos de un archivo o un directorio sólo pueden ser modificados por su creador. Para cambiar permisos a un archivo o directorio, y la propiedad, se tienen los siguientes comandos:

3.1.13.1 Cambio de permisos.Comando: chmod (cambiar modo)

Descripción: Sirve para modificar los permisos de un archivo o directorio.

Se puede modificar los permisos de un fichero de su propiedad utilizando el comando chmod. Se sabe que un archivo tiene tres grupos de permisos de usuario, de grupo, y otros. Estos

56

Page 57: Cur So Unix

Manual de Unix

son conocidos como u, g y o, respectivamente. Cada una de estas tres categorías de usuario pueden tener acceso de lectura, escritura, o ejecución de un archivo, los cuales se representan por r, w y x, respectivamente. Puede utilizarse esta abreviatura para crear varias órdenes chmod, como los siguientes:

$ ls –l nota -rw-rw-rw- 1 steve other 227 Apr 5 19:33 nota$ chmod –w nota$ ls –l nota -r--r--r-- 1 steve other 227 Apr 5 19:33 nota$ chmod +w nota$ ls –l nota -rw-rw-rw- 1 steve other 227 Apr 5 19:33 nota$ chmod –w nota$

El primer ejemplo especifica chmod con el argumento opción –w, el cual le dice que suprima los permisos de escritura del archivo. El segundo ejemplo restaura los permisos de escritura del archivo. El uso de “+” como opción es una excepción al uso normal de “-”, pero el significado es: se utiliza “-” para suprimir un permiso, y “+” para añadirlo.

Se puede cambiar más de uno de los tres permisos en la misma orden del modo siguiente:

$ chmod –w+x nota$ ls –l nota -r-xr-xr-x 1 steve other 227 Apr 5 19:33 nota$ chmod –wx nota$ ls –l nota -r--r--r-- 1 steve other 227 Apr 5 19:33 nota$

En todos los ejemplos, chmod modifica los permisos de las tres clases de usuarios. También se pueden efectuar cambios para cualquier clase individual mente añadiendo una letra delante del “-” o “+”, como en el siguiente ejemplo:

$ ls –l nota -rw-rw-rw- 1 steve other 227 Apr 5 19:33 nota$ chmod u–w nota$ ls –l nota -r--rw-rw- 1 steve other 227 Apr 5 19:33 nota$ chmod go+wx nota$ ls –l nota -r--rwxrwx 1 steve other 227 Apr 5 19:33 nota$

57

Page 58: Cur So Unix

Manual de Unix

La sintaxis de chmod es clase de usuario (u, g, o), seguido de acción a tomar (- o +), seguido de permiso a modificar (r, w, x). La lista de nombres de ficheros o directorios afectados sigue al final de la línea de comandos.

Para hacer cambio de todos los permisos en los tres diferentes usuarios se asignar varias órdenes de cambio a un archivo o archivos, para esto se tienen que separar por una coma los permisos, como en los siguientes ejemplos:

$chmod a=r,u+w,u+x programs textos $ls -ld programs textosdrwxr--r-- 4 kyo ptc 64 Mar 18 15:35 programsdrwxr--r-- 2 kyo ptc 80 Mar 18 18:46 textos$

Otra forma de hacer lo anterior hubiese sido tecleando estas líneas:

$chmod go=r,u+rwx programs textos$ls -ld programs textosdrwxr--r-- 4 kyo ptc 64 Mar 18 15:35 programsdrwxr--r-- 2 kyo ptc 80 Mar 18 18:46 textos$

Además, chmod puede establecer permisos s y t, utilizados por algunos progrmas ejecutables para modificar sus entornos de ejecución, no son utilizados por los usuarios individuales.

Este comando también acepta el cambio de permisos empleando un número octal. Un modo fácil de manejar los permisos en forma octal es ayudándose con el siguiente esquema:

r w x r w x r w x

400 100 20 4 1

200 40 10 2

Así, si se desea dar permiso de sólo lectura, a los tres bloques se suman los valores de dichos permisos:

400+40+4=444

58

Page 59: Cur So Unix

Manual de Unix

Por lo que el comando para cambiar a esos permisos al archivo, será:

$ ls –l nota -rw-rw-rw- 1 steve other 227 Apr 5 19:33 nota$ chmod 444 *$ ls –l nota -r--r--r-- 1 steve other 227 Apr 5 19:33 nota$

Sólo se hace un ls –l al archivo nota, pero todos los archivos tienen los mismos permisos. Si se le quisiera cambiar los permisos a un archivo a lectura, escritura y ejecución a un usuario, lectura al grupo y lectura a otros se sumarían 744 y se teclearía:

$ ls –l nota -rw-rw-rw- 1 steve other 227 Apr 5 19:33 nota$ chmod 744 nota$ ls –l nota -rwxr--r-- 1 steve other 227 Apr 5 19:33 nota$

3.1.13.2 Permisos iniciales.

EL sistema UNIX proporciona automáticamente al creador de un archivo la propiedad del mismo, y asigna al archivo el grupo de su creador. Aunque esto no puede ser modificado, se puede declarar una variable del sistema asociado con el id de presentación que establecerá los permisos de un archivo sin acción explicita por parte del usuario. Esta variable del sistema se denomina umask (mascara de usuario).

Comando: umask (user mask)

Descripción: Sirve para cambiar los permiso iniciales de un archivo o directorio.

Si se deseara ver los permisos iniciales actuales sólo se teclearia umask, sin argumentos:

$umask000$

El resultado son tres dígitos octales que se refieren a los permisos del propietario, el grupo y los otros, de izquierda a derecha. A este número se le denomina máscara ya que cada dígito se resta de un permiso implícito global del sistema que todos los nuevos archivos obtienen. Como

59

Page 60: Cur So Unix

Manual de Unix

los tres dígitos con cero, esto significa que los archivos al crearse tienen permisos rw-rw-rw (666) y que los directorios tendrán rwxrwxrwx (777).

60

Page 61: Cur So Unix

Manual de Unix

Cada dígito octal de la umask contiene un bit binario que borra un permiso: un 1 borrará el permiso de ejecución, un 2 borrará el permiso de escritura y un 4 borrará el permiso de lectura. Si se quisiera cambiar los permisos iniciales a permisos de lectura y escritura para el usuario y sólo de lectura para los demás (644) tendría que hacer primero:

666 permisos actuales-644 permisos requeridos 022 modo final

y después teclear el comando:

$umask 022$

Con esto los nuevos archivos a crear adquirirán permisos rw-r--r-- (644) y los nuevos directorios rwxr-xr-x (755). Para declarar la umask se utiliza la orden umask con el código octal como argumento.

La nueva máscara creada en una sesión será substituida por la que el sistema maneja por defecto al apagar la máquina, así que si se quiere tener la máscara deseada cada vez que se entre al sistema, se deberá modificar el perfil de sesión.

3.1.14. Cambio de dueño de archivos y directorios.

Se puede ceder la propiedad de un fichero con la orden chown (por cambiar de propietario), suponiendo que el fichero fuese del usuario. He aquí un ejemplo:

$ ls –l nota-rw-rw-rw 1 steven other 227 Apr 5 19:33 nota$ chown nota jim$ ls –l nota-rw-rw-rw 1 jim other 227 Apr 5 19:33 nota

La orden chown acepta un nombre de archivo o una lista de nombres de archivos como argumentos, junto con el id de presentación del usuario al que se desea ceder el o los ficheros. El usuario destino es siempre el último argumento. El usuario a quien se cede el fichero debe ser un id de presentación legal para alguien en el sistema. ¡Recuerde que una vez que haya cedido el fichero no puede utilizar chown para recuperarlo!

61

Page 62: Cur So Unix

Manual de Unix

3.1.14. Cambio de grupo de archivos y directorios.

Analógicamente con chown, puede utilizar la orden chgrp para cambar el grupo al que pertenece un fichero, suponiendo que usted sea el propietario del fichero y miembro del grupo al que pertenece. Pro ejemplo:

$ ls –l nota-rw-rw-rw 1 steven other 227 Apr 5 19:33 nota$ chgrp nota bin$ ls –l nota-rw-rw-rw 1 steven bin 227 Apr 5 19:33 nota

Una vez más, cuando usted haya cedido el fichero a alguien, ya no le pertenecerá, por lo que no puede recuperarlo.

3.1.15 Encontrar archivos.Comando: find.

Descripción: Localiza archivos desde un directorio o directorios especificados y hacia abajo.

Esta poderosa herramienta del sistema permite escudriñar en cada directorio especificado excepto en los que no se tiene permiso de lectura.

3.1.15.1 Opciones de find.

El comando find es una de las más potentes entre todos los otros comandos, también tiene una de las estructuras de línea de comandos más difícilies. El comando find desciende a lo largo de una jerarquía de directorios localizando todos los ficheros que satisfacen criterios especiales sobre los ficheros que en cuentre. Su línea de comando es básicamente:

$ find lista-de-caminos expresiones

donde lista de caminos, es la lista de directorios a buscar. La lista puede incluir uno o más directorios, con rutas relativas o absolutas. Las expresiones son los operadores que describen los criterios de selección para los ficheros que se desea localizar y la acción que se desea que find efectúe cuando un fichero cumpla los criterios de selección.

62

Page 63: Cur So Unix

Manual de Unix

Este comando tiene las siguientes banderas:

63

Page 64: Cur So Unix

Manual de Unix

Opción: -name.

Descripción: Esta opción es la que permite dar el nombre del archivo que se desea encontrar. Con esta bandera sólo los archivos que posean el nombre del archivo buscado se encontrarán. Por ejemplo:

$ find / -name “*profile” –print/etc/profile$

Opción: -print.

Descripción: Se utiliza esta opción para indicarle al comando que imprima en pantalla la ruta completa del resultado de la búsqueda. Si no se usa esta opción, el sistema no dirá si se encontró el archivo.

Por ejemplo, si se está buscando un archivo que se llama eqnchar pero no se sabe en que subdirectorio está se podría escribir lo siguiente para conocer su ruta de acceso:

$find / -name eqnchar -print.../usr/pub/eqnchar...$

En este ejemplo la búsqueda comienza desde la raíz y de ahí a todos los subdirectorios.

Si se quisiera encontrar los archivos que tuvieran por ejemplo, la cadena tex al principio de su nombre, en el directorio de casa y en el directorio del grupo se teclearía:

$ find . .. -name “tex*” –print

Opción: -perm

Descripción: Le indica al comando que busque los archivos que tienen el patrón de permisos establecidos en notación octal.

El siguiente ejemplo muestra el uso de esta opción:

$ find . -perm 700 –print | pg ...

64

Page 65: Cur So Unix

Manual de Unix

Opción: -type.

Definición: Encuentra los archivos por tipo, ya sean directorios, archivos, etc.

Por ejemplo, para encontrar a los que son directorios se teclea:

$ find . -type d –print

Opción: -user.

Descripción: Esta opción le indica al comando que restrinja la búsqueda a sólo los archivos que pertenecen al usuario especificado:

$ find . -type f -user nancy –print

Opción: -group.

Descripción: Esta opción le indica al comando que restrinja la búsqueda a sólo los archivos que pertenecen al grupo especificado:

$ find . -type f –group ptc -print

Opción: -size.

Descripción: Encuentra a los archivos con la longitud especificada en bytes. Si se coloca –size n se seleccionan los archivos de exactamente n bloques de tamaño, con –n se seleccionan archivos menores de n bloques, con +n archivos mayores a n bloques.

Opción: -atime.

Descripción: Encuentra a los archivos que no han sido accesados desde el plazo indicado, en días.

Opción: -mtime.

Descripción: El comando –mtime n selecciona los ficheros modificados hace n días. La expresión –mtime –n selecciona los archovos modificado dentro de los últimos n días y –mtime +n selecciona los ficheros modificados hace más de n días.encuentra a los archivos que hayan sido modificados en el plazo elegido, también en días. Si se coloca

65

Page 66: Cur So Unix

Manual de Unix

Estas son sólo algunas opciones de las que el comando find tiene, sin embargo, aquí sólo se señalan las más comunes. También se pueden negar las banderas, si el nombre del comando viene precedido de un “!” y un espacio, el operador se convertirá en falso cuando normalmente seria cierto, y viceversa. Por ejemplo

$ find / ! –print

Se niega la impresión de la lista. El carácter “!” debe ir entre espacios en blanco en línea de orden y sólo niega la bandera que va inmediatamente a continuación.

66

Page 67: Cur So Unix

Manual de Unix

3.2 MANEJO DE TEXTO

Una muy buena parte del trabajo con una computadora tiene que ver con el manejo de archivos de texto. Hay muchas utilidades en UNIX para la manipulación de textos, en esta parte se trabajará en algunos comandos que sirven para ello.

3.2.1 Ordenamiento de archivos de texto.Comando: sort

Descripción: Es un comando que permite el ordenamiento de archivos de texto en forma alfabética o numérica. Por omisión utilizará la secuencia de cortejo ASCII para determinar el orden de clasificasión, empezando de la línea.

3.2.1.1 Ordenamiento por criterio alfabético.

Para ver el uso de este comando crearemos un archivo con nombres de personas y un número al final para identificarlas.

$cat > nombrescchJuan Vite 101Alicia Camacho 120Alfredo Arevalo 000Carolina Medina 110Lilia Meza 111Adolfo Franco 099Lourdes Munguia 200Carlos Gallardo 100Araceli Vazquez 088Joel Martinez 001^D$

Ahora veamos el uso de sort sobre ese archivo:

67

Page 68: Cur So Unix

Manual de Unix

$ sort nombrescch Adolfo Franco 099Alfredo Arevalo 000Alicia Camacho 120Araceli Vazquez 088Carlos Gallardo 100Carolina Medina 110Joel Martinez 001Juan Vite 101Lilia Meza 111Lourdes Munguia 200$

Por default, se listan los registros (líneas) de un archivo con sort en orden alfabético con respecto al primer campo. Un campo, en UNIX es un conjunto de caracteres separados por otro caracter especificado, así como un registro es un conjunto de campos separados por un return (de ahí que también se les llame líneas).

Por default, el separador de campos en sort es el caracter blanco (espacio). Como se vio en el ejemplo anterior, se listaron las líneas del archivo en orden alfabético respecto al nombre (primer campo). Sin embargo, lo más adecuado al listar nombres es ordenar alfabéticamente por apellidos, veamos como se puede hacer esto con sort:

$ sort +1 nombrescch Alfredo Arevalo 000Alicia Camacho 120Adolfo Franco 099Carlos Gallardo 100Joel Martinez 001Carolina Medina 110Lilia Meza 111Lourdes Munguia 200Araceli Vazquez 088Juan Vite 101$

Esto quiere decir que sort debe saltarse un campo para poder ordenar. Es decir, debe empezar en el segundo campo.

Con la opción –f permite ignorar la diferencia entre mayúsculas y minúsculas en la comparación de clasificación. Analógicamente, la opción –d suprime la clasificación sobre puntuación u otros caracteres especiales. La opción –M hace que sort considere los tres primeros caracteres de la línea como meses, de mos que enero irá antes de febrero.

68

Page 69: Cur So Unix

Manual de Unix

3.2.1.2. Ordenamiento por criterio numérico.Opción : -n (number)

Descripción: Esta opción le indica a sort que el criterio de ordenamiento será numérico.

Si quisiéramos ordenar numéricamente al archivo, debemos teclear:

$ sort +2n nombrescch Alfredo Arevalo 000Joel Martinez 001Araceli Vazquez 088Adolfo Franco 099Carlos Gallardo 100Juan Vite 101Carolina Medina 110Lilia Meza 111Alicia Camacho 120Lourdes Munguia 200$

3.2.1.3 Ordenamiento inverso.Opción: -r (reverse)

Descripción: Invierta el ordenamiento normal del comando sort.

El ordenamiento, tanto alfabética como numéricamente, es, por default, ascendente, si se quisiera invertir este proceso, se tendría que usar la opción -r:

$ sort +2n -r nombrescch Lourdes Munguia 200Alicia Camacho 120Lilia Meza 111Carolina Medina 110Juan Vite 101Carlos Gallardo 100Adolfo Franco 099Araceli Vazquez 088gJoel Martinez 001Alfredo Arevalo 000$

69

Page 70: Cur So Unix

Manual de Unix

3.2.1.4 Mezcla de archivos ordenados.

El uso del comando sort no se limita a un sólo archivo a la vez, puede actuar sobre varios al mismo tiempo. Por ejemplo, suponga que se tiene otro archivo llamado nombresfi, y que se desea combinar estos dos archivos pero ordenadamente de acuerdo a sus números de identificación (tercer campo) y guardar el resultado en otro archivo llamado todos, entonces se tendría que teclear:

$ sort +2nr +1 nombres*>todos$

El +1 le indica a sort que si en el tercer campo hay números iguales, entonces el segundo criterio de ordenamiento es el alfabético ascendente, por apellidos, en este caso.

Opción : -m

Descripción: Mezcla archivos ya ordenados.

Si se tienen archivos ya ordenados, entonces para mezclarlos y ordenarlos con sort se usa esta opción que lo único que hace es ahorrarle trabajo al comando.

$sort nombrescch>nombres1$sort nombresfi>nombres2$sort -m nombres1 nombres2>nombres$

3.2.1.5 Supresión de líneas duplicadas.

Opción: -u

Descripción: Elimina la repetición de líneas en una combinación de archivos.

Por ejemplo, si listamos el resultado del ejemplo anterior obtendremos:

$cat nombres... Carolina Medina 110Joel Martinez 001Joel Martinez 001Jose Mendieta 099...$

70

Page 71: Cur So Unix

Manual de Unix

Se puede ver como algunas líneas que eran iguales en los dos archivos, se repiten en el que se generó cuando se combinaron. Para poder evitar esto se puede usar la opción -u, obteniéndose el siguiente resultado:

$sort -u nombresfi nombrescch...Carlos Gallardo 100Carolina Medina 110Joel Martinez 001Jose Mendieta 099.$

3.2.1.6 Separador de campo.Opción: -t

Descripción: Indica el caracter separador de campo para ordenar un archivo.

Como ya se dijo, el separador de campo por default es el espacio, sin embargo, a sort se le puede indicar qué carácter debe tomar como separador, si así se desea, y para esto se usa la opción -t. El siguiente ejemplo muestra el uso de esta opción:

$sort +5t: /etc/passwd...pegaso:x:908:103:zamora gonzalez rogaciano:/users/alum/pegaso:/bin/kshvictor1:x:1308:103:zamora guerrero victor:/users/alum/victor1:/bin/cshitzany:x:673:103:zavala gomez sandra ines:/users/alum/itzany:/bin/kshclauza:x:1019:103:zavala rosado claudia:/users/alum/clauza:/bin/kshtonozs:x:404:104:zepeda sanchez antonio:/users/profes/tonozs:/bin/ksh$

Esta orden le pide al sistema que ordene alfabéticamente el archivo /etc/passwd tomando en cuenta el 5to. campo, que es el que contiene los nombres reales de los usuarios del sistema, como criterio de ordenación y teniendo como separador de campo el caracter “:”.

3.2.2 Contador wc.

Comando: wc (word counter).

Descripción: Sirve para el número de líneas, palabras y caracteres de un archivo de texto.

71

Page 72: Cur So Unix

Manual de Unix

En el siguiente ejemplo se muestra el uso del comando:

$wc nombres 11 30 211 nombres$

El primer número del resultado indica el número de líneas del archivo, el segundo número es la cantidad de palabras que contiene y el tercero son los caracteres contados en él. En la última columna se puede ver el nombre del archivo .

3.2.2.1 Opciones

Opción: -c (character)

Descripción: Cuenta solamente el número de caracteres de un archivo.

Opción: -w (word)

Descripción: Cuenta nada más el número de palabras de un archivo.

Opción: -l (lines)

Descripción: Cuenta sólo el número de líneas que hay en un archivo.

Usar cualquier combinación de las opciones hace que los números aparezcan en el orden en que fueron escritas, por ejemplo si se teclea:

$ wc -cwl nombres 211 30 11 nombres$

Se consiguen los mismos números que si se tecleara sólo el comando, pero la diferencia es que el orden en que aparecen es el orden en que se escribieron las opciones.

Si se quisiera conocer las estadísticas de varios archivos a la vez se podría obtener de una forma similar a la siguiente:

72

Page 73: Cur So Unix

Manual de Unix

$ wc nom* todos 11 30 211 nombres 11 30 211 nombrescch 11 33 275 nombresfi 22 63 486 todos 55 156 1183 total$

La última línea del resultado indica la suma de las estadísticas de los cuatro archivos.

3.2.3 Localización de patrones de texto en un archivo.

Comando: grep

Descripción: Encuentra la cadena especificada e imprime las líneas en donde se encontró la ocurrencia.

Esté es un filto que permite buscar cadenas en archivos, utilizando expresiones regulares para especificar la cadena coincidente. Esté comando lee de la entrada estándar o de una lista de archivos especificados como argumentos y escribe en la salida estándar aquellas líneas que contegan la cadena coincidente.

El primer argumento para el comando grep es el padón a buscar. La forma de emplear este comando es:

Algunas veces el proceso de búsqueda puede tardar demasiado, así que algo que se puede hacer es aprovechar la característica de UNIX de ser un sistema multitarea y ejecutar dicho proceso en background, es decir realizarlo como un trabajo asíncrono.

Una línea de comandos se puede ejecutar en background si al final de ella se le agrega un símbolo “&” (ampersand), por ejemplo:

$ grep un-patron archivos

La cadena de búsqueda un-patron puede ser cualquier expresión regular. En su forma más sencilla, la expresión regular puede ser una simple secuencia de caracteres, como por ejemplo:

Algunas veces el proceso de búsqueda puede tardar demasiado, así que algo que se puede hacer es aprovechar la característica de UNIX de ser un sistema multitarea y ejecutar dicho proceso en background, es decir realizarlo como un trabajo asíncrono.

Una línea de comandos se puede ejecutar en background si al final de ella se le agrega un símbolo “&” (ampersand), por ejemplo:$ grep mundo fich.Viejo

73

Page 74: Cur So Unix

Manual de Unix

hola mundo$

Cada línea que contenga el patrón va a ser la salida de grep. En la búsqueda de estas ocurrencias se distinguen dos tipos, la búsqueda de cadenas fijas y la de expresiones regulares.

3.2.3.1 Búsqueda de cadenas de caracteres fijas.

Comando: grep (global regular expression printer).

Descripción: Encuentra en un archivo de texto las cadenas que se le especifiquen e imprime en pantalla la línea donde se encuentra tal expresión.

El patrón más simple para grep es una cadena fija. Por ejemplo, si se deseara saber el nombre real del usuario que tiene como login kyo, simplemente se buscaría en el archivo /etc/passwd

$ grep kyo /etc/passwd kyo:x:1271:100:martinez alvarado joel:/users/ptc/kyo:/bin/ksh$

Como se puede ver, el resultado del comando, es la línea completa donde se encuentra el patron kyo, y el nombre real es el que está en el 5to. campo.

Si quisiéramos verificar la existencia de una cadena en varios archivos lo haríamos de la siguiente manera:

$ grep Joel nom* todos nombres:Joel Martinez 001nombrescch:Joel Martinez 001nombresfi:Joel Martinez 001todos:Joel Martinez 001$

Al inicio de la línea donde se encuentra la cadena pedida se da el nombre del archivo donde se encontró.

74

Page 75: Cur So Unix

Manual de Unix

Si se deseará buscar una cadena compuesta por más de una palabra, entonces se debe encerrar entre comillas, ya que si no se hace esto, el comando buscará la primera palabra que se teclee después de grep en los nombres de archivos que son las siguientes palabras tecleadas después de la primera:

$grep "Lilia Meza" nom* todos nombres:Lilia Meza 111nombrescch:Lilia Meza 111todos:Lilia Meza 111$

3.2.3.1.1 Opciones

Opción: -v

Descripción: Imprime en pantalla todas las líneas donde no se encuentra la cadena:

$grep -v Veronica nombresfi Norma Ochoa 119Manuel Camacho 110Jose Mendieta 099Victor Izquierdo 088Susana Amaro 120Nancy Pacheco 111Minerva Jimenez 110Ana Solorzano 000Josue Mendoza 101Joel Martinez 001$

Opción: -c

Descripción: Da como salida el número de líneas donde se encontró la cadena especificada.

$ grep -c Joel todos 2$

Opción: -n

Descripción: Antepone al resultado de la búsqueda el número que ocupa la línea en el texto.

75

Page 76: Cur So Unix

Manual de Unix

$ grep -n Joel todos 18:Joel Martinez 00119:Joel Martinez 001$

Opción: -i

Descripción: No distingue entre mayúsculas ni minúsculas en la búsqueda de una cadena.

$grep -i lilia nom* todos nombres:Lilia Meza 111nombrescch:Lilia Meza 111todos:Lilia Meza 111$

3.2.3.2 Búsqueda de expresiones regulares.

Una expresión regular es una especie de plantilla que contiene las características de un conjunto de ocurrencias que son similares. Así pues podemos buscar todas las palabras de cuatro letras que comiencen con d, todas las palabras con una misma terminación, etc.

Algunos elementos que sirven para la construcción de estas plantillas son los llamados metacaracteres, los cuales funcionan como comodines en una expresión.

3.2.3.2.1 Expresiones al principio y al final de una línea.

Los metacaracteres que sirven para buscar la línea donde se encuentra una ocurrencia al principio o al final de ésta son el “^” y el “$”, respectivamente. Por ejemplo:

$grep -i ^a todos Alicia Camacho 120Adolfo Franco 099Araceli Vazquez 088Alfredo Arevalo 000Ana Solorzano 000$

encuentra a todas las líneas del archivo todos que empiecen con la letra a o A. Y si se teclea:

76

Page 77: Cur So Unix

Manual de Unix

$grep 099$ todos Adolfo Franco 099Jose Mendieta 099$

grep encuentra todas las líneas que terminen con la cadena “099”.

3.2.3.2.2 Correspondencia de cualquier carácter con “.”

El punto es el metacarácter que corresponde a cualquier carácter. Por ejemplo:

$grep -i ^j... todos Josue Mendoza 101Juan Vite 101Jose Mendieta 099Joel Martinez 001$

Encuentra todas las líneas que comienzan con una cadena de cuatro caracteres que empiezan con j o J .Si se quisiera encontrar a todas las líneas que terminan con un punto entonces se debe usar el carácter de escape “\” para quitarle el significado especial al punto.

3.2.3.2.3 Buscar entre un rango de caracteres.

Cuando se encierran varios caracteres entre corchetes grep busca una cadena que contenga uno de ellos o un rango de esos caracteres. Para especificar, por ejemplo, que se desea encontrar una línea que comience con cualquier caracter a,b,c,x,y,z se teclearía, por ejemplo:

$grep ^[abcxyz] /etc/passwdo$grep ^[a-cx-z] /etc/passwd

En este ejemplo el caracter “^” va fuera de los corchetes con lo que se le indica al comando que se encuentren todos las líneas que comiencen con ese patrón. Si se hubiera puesto dentro de los corchetes:

$grep [^a-cx-z] /etc/passwd

77

Page 78: Cur So Unix

Manual de Unix

El proceso de búsqueda hubiera encontrado todas las líneas que no comenzaran con ese patrón.

3.2.3.2.4 Correspondencia de cualquier cadena.

El metacarácter “ * ” indica a grep que busque cualquier cadena en la que se repita el carácter que le anteceda una o más veces, inclusive los espacios. Por ejemplo:

$grep ^k.*die /etc/passwd karo:x:397:105::/users/die/karo:/bin/ksh$

Le indica al comando que encuentre las líneas que comiencen con k y que les siga cualquier cantidad de caracteres hasta encontrar die.

3.2.4 Búsqueda rápida de cadenas fijas.

Comando: fgrep (fast grep)

Descripción: Localiza sólo cadenas fijas dentro de un archivo.

Este comando sólo maneja cadenas fijas como patrones de texto, no puede aceptar comodines, por esta razón, si se desea buscar una cadena fija se debe usar esta orden para hacer más rápido el proceso.

$fgrep Ana todos Ana Solorzano 000$

En fgrep también se pueden usar algunas opciones de las mencionadas para grep, estas son las que sirven para encontrar cadenas fijas, por ejemplo –v, o –c.

78

Page 79: Cur So Unix

Manual de Unix

3.2.5 Búsqueda de expresiones regulares completas.

Comando: egrep (extended grep).

Descripción: Encuentra expresiones regulares más completas en un archivo.

Este comando es una extensión más completa del comando grep básico. Esté permite un conjunto más rico de operadores en expresiones regulares que grep. Aunque más lenteo que grep, está optimizado para búsquedas más complejas. En la mayoría de las situaciones, el grep original resulta der un buen compromiso entre estas posibilidades.

Esté comando dispone de algunos operadores adicionales de expresiones regulares que se diferencian ligeramente de los operadores grep. Además el operador “*”, utilizado para designar cero o más osurrencias de un patrón de un solo carácter, egrep preporciona el operador “+”, que denota una o más ocurrencias del carácter. Por ejemplo, en grep se escribiría:

[0-9][0-9]*

para cualquier secuencia de dígitos de cualquier longitud. Esto funciona con egrep, pero también se podría escribir:

[0-9]*

para indicar lo mismo. Analógicamente, el operador “?” denota cero o una ocurrencia del patrón. Por ejemplo:

^[0-9]?a|b

se corresponderá con una línea que comience por un digito opcional y luego contenga una a o una b.

En egrep el operador | denota cualquiera de un par de expresiones regulares. Por ejemplo:

^a|b

se corresponderá con una línea que comience con el carácter a o con el carácter b. La orden egrep tambié permite un operador paréntesis para agrupar expresiones regulares multicarácter. El comando:

$ egrep “([0-9]+ab)*1234” .fichero

79

Page 80: Cur So Unix

Manual de Unix

encontrará las cadenas que comiencen con una secuencia de uno o más dígitos, seguidos de ab, seguidos de una secuencia de uno o más dígitos, seguido de ab, y así sucesivamente para cualquier número de estos patrones, hasta que aparezca la cadena 1234.

En egrep se puede utilizar la opción de línea de comando –f nombre.fichero, que acepta la expresión regular desde el fichero especificado tras la opción –f en lugar de desde la línea de comandos.

3.2.6 Corte de campos en un archivo.

Comando: cut (cortar).

Descripción: Toma los campos o columnas indicados y los separa del resto del archivo, mostrándolos en pantalla.

Esté comando es utilizado con frecuencia como filtro. Esté sólo copia ciertas partes de cada línea de la entrada estándar a la salida. Esté comando tiene dos maneras de cortar, una es indicando por ejemplo, que se quiere un rango de ellos, y la otra es especificando cuáles, aunque no sean contiguos. Para trabajar con los archivos se recurre a las siguientes banderas:

3.2.6.1 Opciones de cutOpción: -c (column).

Descripción: Le indica al comando que lo que se va a cortar serán columnas.

Por ejemplo, la siguiente línea:

$ cut -c 18-20 nombrescch 101120000110111...$

Le pide al comando que corte las columnas 18,19 y 20 del archivo nombrescch que son las que contienen el número de identificación de los nombres. Esta tarea se hubiera realizado también con la instrucción:

80

Page 81: Cur So Unix

Manual de Unix

$cut -c 18,19,20 nombrescch

Opción: -f (field).

Descripción: Le indica a cut que lo que se va a cotar será un campo.

Opción: -d

Descripción: Esta opción indica cuál es el carácter a tomar como delimitador de campo.

El sistema UNIX utiliza varios caracteres delimitadores de campo en diferentes situaciones. Tres caracteres que se utilizan comúnmente como delimitadores son el tabulador, el espacio y los dos puntos. Por default, el delimitador de campo en cut es el tabulador. Si quisiéramos tomar sólo los apellidos, los identificadores o nombres del archivo nombrescch y guardarlos en otros diferentes, podríamos hacerlo tecleando:

$cut -f2 -d “ “ nombrescch > apellcch$cut -f1 -d “ “ nombrescch > npilacch$cut -c 18-20 nombrescch > cch_id

De esta forma los diferentes campos del archivo nombrescch quedan guardados en otros archivos. Veamos que fue lo que se obtuvo al teclear la primera línea:

$cat apellcchViteCamachoArevaloMedinaMezaFrancoMunguiaGallardoVazquezMartinez$

Podemos ver que en la última línea de comando no se indicó cortar por campo, ya que del apellido al número de identificación hay variables números de espacios.

81

Page 82: Cur So Unix

Manual de Unix

3.2.7 Empalme de líneas.

Comando: paste

Descripción: Toma la entrada de varios ficheros y combina sus entradas para formar una línea de salida.

3.2.7.1 Opciones.

Opción: -d

Descripción: Indica cuál será el caracter para separar los campos de entrada en la salida.

Por ejemplo si quisieramos, reconstruir el archivo de nombrescch a partir de npilacch, apellcch y cch_id podríamos hacerlo tecleando:

$ paste npilacch apellcch cch_id Juan Vite 101Alicia Camacho 120Alfredo Arevalo 000Carolina Medina 110Lilia Meza 111Adolfo Franco 099Lourdes Munguia 200Carlos Gallardo 100Araceli Vazquez 088Joel Martinez 001$

Como se puede ver, la reconstrucción no fue del todo bien hecha, ordenó los campos como se deseaba pero no con la misma separación. Veamos como podemos ayudarnos para mejorar esta presentación:

$ paste -d",\t" apellcch npilacch cch_id Vite,Juan 101Camacho,Alicia 120Arevalo,Alfredo 000Medina,Carolina 110Meza,Lilia 111Franco,Adolfo 099Munguia,Lourdes 200Gallardo,Carlos 100Vazquez,Araceli 088Martinez,Joel 001$

Al indicar el separador de los campos (en este caso fueron dos), se le indica a paste que entre el primer y el segundo campos habrá una coma, y que entre el segundo y el tercero se colocará un tabulador. En este comando el default de separador de campo es el tabulador.

82

Page 83: Cur So Unix

Manual de Unix

3.3 COMANDO SOBRE LA GESTION DE PROCESOS

El archivo de control utilizado por cron es coincido como crontab (por tabla cron). Originalmente era un único archivo con el nombre de camino /etc/crontab. Sólo el súper usuario tenia permitido la modificación de este archivo, y por tanto el cambio de la planificación del sistema. Algunas versiones más antiguas utilizan todavía esta ubicación de archivo. Las versiones más recientes del sistema UNIX proporcionan una facilidad, crontab ampliada dentro del directorio /var/spool/cron/crontabs, como se muestra aquí

$ ls –f /var/spool/cron/crontabsadm root sys$

Cada usuario que haya especificado algunos trabajos para planificar por la facilidad cron tendrá un fichero en este directorio con el nombre del id de presentación del usuario que creó el fichero.

Se utiliza para manipular las instrucciones del demonio tab (tareas programadas). Sirve para programar una tarea a una hora determinada.

$ crontab –l ( muestra lista de las tareas programadas).$ crontab –u ( muestra las tareas programadas de otros usuarios).$ crontab –e ( edita el crontab del usuario).

El formato de crontab es:

0-59 0-23 1-12 1-31 0-6 comandomin hora mes día día/semana

Los usuarios individuales pueden crear trabajos planificados con la orden crontab. La orden crontab está diseñada para ayudar a la creación y modificación de archivos crontab individuales.

Para crear una nueva planificación crontab, se crea un fichero crontab con un editor, se copia un fichero crontab existente a un nuevo fichero para editarlo. Cuando el fichero está correcto, puede ser añadido al directorio crontab con la orden

$crontab nombrearchivo$

83

Page 84: Cur So Unix

Manual de Unix

donde nombrearchivo es el nuevo archivo que se ha creado. La planificación se crea bajo el id del usuario que ejecuta la orden, por lo que diferentes usuarios pueden tener sus propias planificaciones sin que interfieran unas con otras. Solamente se permite un archivo crontab por cada usuario.

La orden crontab también puede leer la entrada estándar para la planificación, por lo cual se permite redirección. Sin embargo, si se introduce la orden crontab sin nombre de fichero y sin fichero redirigido para entrada, hay que tener cuidado de terminar con la tecla DEL en vez de con CTRL-D, ya que la marca fin-de-fichero hará que crontab carge un fichero vacio en la panificación, lo cual probablemente no es lo que se pretende.

La orden crontab suprimirá una planificación si se le da la orden –r (por retirar) del modo siguiente:

$ crontab –r$

84

Page 85: Cur So Unix

Manual de Unix

3.4 FILTROS.

Los comandos más potentes del sistema son los llamados filtros. Se les llama filtros porque según va pasando la información de entrada en uno de estos comandos ésta sufre una serie de selecciones y manejos hasta que se da como salida sólo aquella que supera a todas las transformaciones de los comandos. Todo este proceso se lleva a cabo sin modificar la entrada original de información.

archivo original filtro contenido del archivo con ciertas características

3.4.1 Interconexión de comandos.

Otra característica de mucha utilidad del sistema UNIX es el uso de salidas de comandos como entradas para otros, esto no sólo se puede hacer con el direccionamiento ya visto antes, sino también con el entubamiento. Se conoce en UNIX como entubamiento a la interconexión entre comandos para pasar la salida de uno de ellos como la entrada de otro. Con esta característica se pueden hacer filtros mucho más poderosos que los ya vistos.

entrada salida entrada salida

filtro filtro salida

Demos un ejemplo de lo fácil que puede ser el manejo de datos usando el entubamiento. Por ejemplo, si se deseara tener una lista ordenada de los usuarios que pertenecen al grupo ptc (100, en el /etc/passwd) en un archivo llamado nptc, se haría normalmente lo siguiente:

$ grep :100: /etc/passwd > nptc cut -f5 -d":" nptc >nptc.tmpsort nptc.tmp>nptcrm nptc.tmp$

Como se ve, es fácil lograrlo, sin embargo, puede serlo aún más si se usa la interconexión de comandos:

85

Page 86: Cur So Unix

Manual de Unix

$grep :100: /etc/passwd|cut -f5 -d”:”|sort > nptc$

Al comparar los archivos en los que se guardo la salida se ve que no hay diferencia entre ambos. Lo que hace el filtro es lo siguiente: primero busca la cadena :100: que corresponde al grupo ptc en el archivo /etc/passwd, después, toma de la primer salida sólo el quinto campo, que es el nombre del usuario, usando los dos puntos como separador de campo y, por último, ordena esta salida por orden alfabético y el resultado se guarda en el archivo nptc.

Más ejemplos:

Por ejemplo, si se deseara saber qué usuarios están en sesión y tener sólo el login de ellos, ordenados alfabéticamente se usaría el siguiente filtro:

$who|cut -f1 -d” “|sort -ufalcongaloedgushoracejaimerjumagakyomikeaipanchoyumbe

86

Page 87: Cur So Unix

Manual de Unix

87

Page 88: Cur So Unix

Manual de Unix

4.1 INTRODUCCIÓN

Existen otros muchos editores para UNIX, pero el único que es seguro encontrar en cualquier sistema UNIX es vi. El editor vi es un editor de texto a pantalla completa que maneja toda la pantalla, proporcionando una ventana al fichero entero que se retiene internamente dentro del buffer de vi. EL cursos de pantalla está siempre en la línea actual y la mayor parte de las operaciones de edición tienen lugar en ese punto.

Sin embargo, vi no es un procesador de textos ni un sistema de autoedición; no formatea texto ni soporta gráficos integrados. Por otro lado, vi es independiente de la terminal, por lo que puede ser utilizado igualmente bien sobre la consola del sistema o desde una terminal remota.

El editor vi es un subconjunto de un editor mayor denominado ex y parte de la documentación se refiere a las óedenes de ex. El editor vi no es el editor más fácil de usar. vi es un editor pequeño (ocupa pocos recursos) y potente, pero muy difícil de usar. Sin embargo, una vez que uno se acostumbra a él, la edición es muy rápida.

Usted invoca a vi desde el shell con una lista opcional de ficheros como argumento, como se muestra aquí:

$ vi fich.viejo$ vi fich.nuevo$ vi fich.nuevo fich.viejo$ vi

Todas éstas son óedenes aceptables. Si el fichero designado no existe ya, vi lo creará. Este es el método normal para crear nuevos ficheros en el sistema UNIX.

Si usted incluye más de un nombre de fichero en la lista de argumentos, vi editará los ficheros uno a uno, cargando el primero en el buffer de texto cuando usted inicie el programa. Hay órdenes previstas para conmutar ficheros, pero vi no puede editar múltiples ficheros simultáneamente. El nombre del fichero actual es accesible con una orden vi. Si usted ejecuta vi sin ningún nombre de fichero como argumento, vi funcionará correctamente, pero usted tendrá que designar un fichero antes de escribir el buffer de texto de vuelta en el sistema de ficheros.

Dadas las órdenes anterior, vi comenzaría por la primera línea del fichero como línea actual.

Además de los nombres de ficheros, vi permite otros varios argumentos en la línea de orden. Se puede utilizar la opción “+” seguido de un número de línea para especificar la línea actual. Por ejemplo:

88

Page 89: Cur So Unix

Manual de Unix

$ vi +45 fich.viejo

89

Page 90: Cur So Unix

Manual de Unix

hará que la línea 45 del fichero fich.viejo sea la línea actual inicial. La orden:

$ vi +$ fich.viejo

se utiliza para iniciar vi al final del fichero. También puede utilizarse la forma:

$ vi +/cadena fich.viejo

para hacer que vi busque cadena y haga de la primera ocurrencia de cadena la línea actual. De hecho se puede usar cualquier orden de vi después de + y ésta será interpretada antes de que vi dibuje la pantalla por primera vez.

La ~ marca una línea no utilizada en la pantalla de texto vi. Cuando usted cargue vi con un fichero nuevo o sin nombre de fichero, toda la pantalla tendrá tildes a la izquierda, ya que no hay texto en el buffer.

El cursor de pantalla aparece sobre un carácter visualizado en la pantalla. La línea que éste ocupa es la línea actual, y el carácter en el que se encuentra es la posición actual sobre la línea. La mayoría de las operaciones de edición utilizan la línea actual o la posición del cursor; vi dispone de órdenes para mover el cursor y cambiar la línea actual.

Durante su operación, vi tiene tres modos. Los modos son estados diferentes en los que el editor puede estar en diferentes momentos. Los modos en los que puede estar vi son:

En el modo comando, vi espera comandos propios para trabajar con los archivos o cambiar a los otros modos. Prácticamente la mayoría de las órdenes que se pueden dar en este editor tienen sólo uno o dos caracteres, aunque existe alguno de más y muchos de ellos aceptan parámetros.

En el modo inserción se insertará, se eliminará y en general se editará el texto, que en realidad el modo más normal de trabajo. Para pasar del modo órdenes al modo inserción basta con dar una coma de edición como «a» de añadir o «i» de insertar. Del modo de inserción podemos salir en cualquier momento pulsando la tecla <Esc>.

El modo ultima línea es un modo especial que se utiliza para dar a vi una serie de órdenes específicas, y aparecen en la última línea de la ventana de edición. Estos comandos suelen ser de carácter general y de gran utilidad. Para entrar en este modo sólo tenemos que pulsar la tecla « : », tras lo que damos la orden y pulsamos <Enter> para ejecutarla. Entre estos comandos podemos encontrar órdenes como «q» que nos permite abandonar el vi o «q!» para salir del vi sin guardar los cambios.

90

Page 91: Cur So Unix

Manual de Unix

El modo ultima línea se utiliza para introducir una sola línea de comando en la línea inferior de la pantalla. Cuando ese comando se completa, vi regresa al modo de comandos, por lo que el modo de última línea tiene una vida breve; sin embargo, los otros dos modos permanecen activos hasta que explícitamente se cambia a otro.

Cuando se está en modo entrada, se puede pasar a modo comandos presionando la tecla “esc”. Al modo de entrada se pasa desde el modo de comandos utilizando uno de los comandos de texto que se muestran más adelante.

Cada modo actúa de forma diferente y tiene su propio conjunto de comandos. Los comandos del modo de última línea se visualizan en la última línea cuando se teclean, pero la entrada al modo comandos no produce eco.

El editor vi trabaja con un buffer en memoria, por lo que la información no se lleva a disco hasta que el usuario así lo indique. Por este motivo se recomienda guardar el archivo cada cierto tiempo para evitar perder todo el trabajo realizado durante una gran cantidad de tiempo.

91

Page 92: Cur So Unix

Manual de Unix

4.2 COMANDOS BÁSICOS

Comandos de inserciónAñadir texto después de la posición del cursor. a

Se pone en modo entrada y añade texto al final de la línea actual. A

Insertar texto delante de la posición del cursor. i

Se pone en modo entrada e inserta texto al principio de la línea actual. I

Inserta una línea por debajo de la línea actual para añadir texto. o

Inserta una línea encima de la línea actual para añadir texto. O

Movimiento de cursoresUna línea abajo j

Una línea arriba k

Un carácter a la derecha h

Un carácter a la izquierda l

Salto de línea Retorno de carro

Avanza una palabra w

Va al principio de la palabra actual b

Va al final de la palabra actual e

Mover el cursor al principio de la línea 0 (cero)

Mover el cursor al final de la línea $

Ir a la primera línea de la pantalla Mayús-h

Ir a la línea situada en mitad de la pantalla Mayús-m

Ir a la última línea de la pantalla Mayús-l

Ir a enésima línea nG

Avanza una pantalla ctrl.-f

Retrocede una pantalla ctrl.-b

92

Page 93: Cur So Unix

Manual de Unix

Comandos para borrar textoBorrar un carácter en la posición del cursor x

Borrar n caracteres en la posición del cursor nx

Suprime una palabra. dw

Suprime n palabras desde la posición del cursos hacia el final. ndw

Suprime texto desde la posición del cursor hasta el final de la línea. d$

Suprime texto desde el principio de la palabra hasta la posición del cursor d0

Al igual que d$, suprime el resto de la línea actual. Mayús-d

Suprime la línea actual entera, independiente de la posición del cursor en la línea. dd

Elimina n ndd

Comandos de sustituciónSustituir un carácter r

Reemplaza una secuencia de caracteres. Mayús-r

Cambia una palabra cw

Cambia una palabra ce

Igual que cw, pero hacia atrás. cb

Copia el número n de palabras. cnb

Corta hasta el final de una línea. c$

Corta hasta el inicio de una línea. c0

Pega debajo del cursor. p

Pega arriba del cursor. Mayús-p

Copia la línea. yy

Copia n líneas hacia abajo. nyy

Acción modo texto Deshacer último cambio u

Deshacer todos los cambios de la línea U

93

Page 94: Cur So Unix

Manual de Unix

Comandos para salir y guardar cambios Salir del vi :q

Guardar cambios :w

Guardar cambios en el archivo :w nombre_de_archivo

Guardar cambios y sobrescribir el archivo :w! nombre_de_archivo

Guardar cambios y salir :wq

Guardar cambios y salir ZZ

Guardar cambios y salir :x

Salir sin guardar cambios :q!

Comandos de búsquedaBusca la cadena hacia delante. /cadena

Busca la cadena hacia atrás. ?cadena

Vuelve a busca en la dirección actual. n

Vuelve a buscar en a dirección opuesta Mayús-n

Busca el patrón x. /x

Va al siguiente. /n

Va a el anterior. /b

Muestra el número de línea. set number

Para quitar set number. set nonumber

Muestra los caracteres ocultos. set list

Para quitar set list. set no list

Para reemplazar, pregunta si se quiere cambiar o no. s/lo que busco/lo que reemplazo/c

Reemplaza en una línea. s/lo que busco/lo que reemplazo/g

Reemplaza en todo el documento. s/lo que busco/lo que reemplazo/band

94

Page 95: Cur So Unix

Manual de Unix

4.3 ECRITURA DE ARCHIVOS

El modo última línea proporciona órdenes para leer y escribir ficheros entre el buffer de texto interno de vi y los ficheros permanentes del sistema de ficheros. El editor vi no realiza escrituras o copias de seguridad automáticas mientras edita.

Es posible cambiar el nombre del fichero durante la operación de escritura especificando un nombre de camino tras el comando :w, como se muestra continuación:

:w fich.nuevo

Esto crea un nuevo fichero de nombre fich.nuevo en el directorio actual y escribe en él el buffer editado. Luego vi informa sobre el tamaño del fichero que ha sido escrito. Por ejemplo:

:w fich.nuevo“fich.nuevo” 4 líneas, 96 characters

Este mensaje aparece en la última línea en lugar de la orden :w. Si el fichero ya existe, vi dará un aviso, donde dice que el archivo ya existe, que se use :w! para forzar la escritura.

Puede escribirse una parte del buffer especificando un rango de líneas con la operación w. Introduzca la primera línea que desee escribir después del :, seguido de una coma, y luego la última línea que desee escribir, como en el siguiente ejemplo:

:3,6w fich.nuevo

95

Page 96: Cur So Unix

Manual de Unix

4.4 CAMBIO DE ARCHIVOS

Si al entrar a vi se da el nombre de dos o más archovos, se crea un bufer por cada nombre de archivo. Para poder moverse en estos archivos, pasar de uno a otro y regresar, existen tres comandos:

Para ir al siguiente archivo n

Para ir al archivo anterior N

Para ir a un archivo determinado se utiliza e

Sin embargo, vi no permite editar más de un archivo a la vez; siempre que se quiera cambiar de archivo se tienen que guardar los cambios, de lo contrario vi no permitirá ir al otro, amenos que que se utilice el “ ! “ para hacer forzado el cambio, pero vi no guardara los cambios que se hayan realizado en el bufer.

Si se necesita ver qué fichero es el actual, puede utilizar el comando de última línea :f, o el operador de modo comandos CTRL.-G para visualizar el nombre y tamaño del fichero actual.

96

Page 97: Cur So Unix

Manual de Unix

4.5 ARCHIVO . exrc

Con vi se puede crear el archivo .exrc, esté da la presentación de todos los archivos que se abrirán con el editor vi. Por ejemplo, si abrimos el archivo y colocamos el comando set number, todos los archivos que se abran estarán numeradas la líneas.

El archivo .exrc es activado cuando se inicia la sesión, así que no se necesita cargarlo, el sistema se encarga de eso. Pero si no se quiere en un archivo especifico la misma configuración, entonces es recomendable que en el mismo archivo se cancele o se activen los comandos necesarios. En caso de que todos los archivos deban tener otra configuración es más eficiente cambiar el archivo .exrc .

En este archivo se puede guardar la configuración que queramos darle a los archivos, aun que hay que aclarar que únicamente la configuración es para el editor vi; si se llega ha abrir el mismo archivo en otro editor no conservará la configuración.

97

Page 98: Cur So Unix

Manual de Unix

4.6 AYUDA

VI no facilita una ayuda interactiva, pero siempre se puede consular la ayuda suministrada por el manual (man).

VI es un programa sobre EX. Es EX quien maneja muchos de los comandos de última línea en VI. Por lo tanto, además de leer la página de manual para VI, es conveniente ver la de EX también.

98

Page 99: Cur So Unix

Manual de Unix

99

Page 100: Cur So Unix

Manual de Unix

Otra de las tantas herramientas que ofrece el sistema UNIX es la interacción que permite entre sus usuarios permitiéndoles la comunicación entre sí. Esta comunicación puede darse de varias maneras, comunicándose interactivamente o dejando mensajes guardados en el sistema, y dentro de estos también existen varias formas de hacerlo. Veamos el uso de algunas herramientas para la comunicación en el sistema.

10

Page 101: Cur So Unix

Manual de Unix

5.1 COMUNICACIÓN INTERACTIVA

El sistema UNIX tiene varios comandos que permiten que los usuarios establezcan comunicación entre sí en un momento determinado e interactivamente. Entre estas órdenes están write, talk y ytalk. A continuación describiremos su funcionamiento.

5.1.1 Envío de mensajes con write.

Este comando permite enviar un mensaje al usuario indicado, justo en el momento de su escritura, siempre y cuando el destinatario esté habilitado para recibirlos y esté conectado al sistema.

En seguida viene un ejemplo sencillo de cómo usar esta orden:

$write nancycomo te llamas?^D$

Después de haber tecleado el comando write, el sistema sólo está esperando que se le teclee algo para enviarlo. En este momento se puede escribir todo lo que se desee hasta oprimir simultáneamente las teclas CTRL-D.

Lo que se recibe en la pantalla del usuario a quien se escribió es lo que sigue:

$Message from kyo (ttyr7) [ Thu Apr 25 14:37:27 ] quien eres?<EOF>$

El EOF al en el último renglón le indica al receptor que el usuario que le escribió ha terminado su mensaje.

Si se hubiera querido establecer una comunicación entre ambos, entonces el primero que escribió debió haber esperado a que el segundo contestara:

10

Page 102: Cur So Unix

Manual de Unix

$write nancy

10

Page 103: Cur So Unix

Manual de Unix

y en el lado de nancy debió haberse escrito:

$Message from kyo (ttyr7) [ Thu Apr 25 14:37:27 ] write kyo

y entonces la conversación por medio de write hubiera comenzado y sólo se habría terminado hasta que uno de los dos hubiese tecleado CTRL-D. Sin embargo, el uso de este comando para comunicarse mutuamente puede ser muy difícil si no se establece quien escribe y quien espera, ya que se podrían traslapar letras escritas de un lado con las del otro ocasionando que no se entiendan los mensajes.

Si se hubiera tratado de comunicar con un usuario que no está conectado al sistema se hubiera recibido un mensaje como este:

$write mine mine is not logged on.$

y la orden write termina. Si se hubiera equivocado de usuario o el nombre tecleado no existiese en el sistema entonces se habría obtenido el mismo mensaje. Sería conveniente que antes de tratar de establecer contacto con alguien primero se verificara si está conectado al sistema, esto se puede hacer utilizando la orden who, descrita anteriormente.

Cuando se le escribe a un usuario, en realidad se le está mandando el mensaje a la terminal que esté usando en ese momento. Si el usuario con el que desea comunicarse está trabajando en más de una terminal, entonces write escogerá la terminal con el número más bajo de las que el receptor esté ocupando. Si se le mandara un mensaje a un usuario que esté en más de una terminal con write, se podría ver un mensaje parecido al este:

$write mteran mteran is logged on more than one place.You are connected to "pty/ttysb".Other locations are:ttyr0ttyrb

10

Page 104: Cur So Unix

Manual de Unix

Para enviar un mensaje a una terminal determinada entonces debe de especificarse ésta después del nombre de usuario:

$write mteran ttyr0

y entonces el mensaje se recibirá en esa terminal. Para ver en que terminales está un usuario conectado, se puede usar el comando who que da el número de terminal en el segundo campo de su salida.

En el caso de que se tuviera que enviar un mensaje más largo, podría prepararse primero en un editor de texto y luego enviarse direccionando la Entrada Estándar:

$ write nancy < mensaje

Al usar write de esta manera el receptor recibirá el contenido del archivo mensaje de un sóla vez. Sin embargo, sería mejor que para mensajes largos se usara alguna de las órdenes para envío de correo, así el receptor lo leería cuando lo considere conveniente.

Otra característica de write es que las líneas que comienzan con el símbolo “!” son interpretadas como comandos, y se ejecutan. La salida de estas órdenes no se ven en la pantalla de quien recibe el mensaje. Se puede, inclusive, direccionar la salida estándar para no ver el resultado en pantalla.

Veamos el uso de esta herramienta dentro de write:

$write nancyMessage from nancy (pty/ttysa) [Thu Apr 25 15:59:35] ...Hola! Ya terminaste el programa en C? Si, y tu? Aun no. Pasamelo Tienes permisos en tu home? Si Ya lo tienes? !lsMail mail prog1.c nsmail textosimages mbox mensaje programs!Ya, gracias. Nos vemos adios^D$

10

Page 105: Cur So Unix

Manual de Unix

Lo que aparece en la ventana de nancy es lo siguiente:

$Message from kyo on (ttyp0) [Thu Apr 25 16:54:10] ...write kyoHola! Ya terminaste el programa de C? Ya, y tu? No. PasameloTienes permisos de escritura en tu home? Si. !cp prog.c /users/ptc/kyo! Ya lo tienes?<EOF>$

Al terminar su cometido un comando el sistema responde con otro “!”, indicando que la tarea ha terminado.

5.1.2 Cómo negar la aceptación de mensajes.

Cuando se está trabajando es a veces muy molesto el ser interrumpido al recibir un mensaje que alguien se quiere comunicar con nosotros, ocasionando que aparezca texto indeseado en pantalla.

La forma para evitar estas situaciones es haciendo cambiando el estado de la variable mesg. Esta variable habilita al sistema para recibir o no mensajes de cualquier tipo.

Por default, el estado de dicha variable es ‘y’, lo que indica que se está en condición de aceptar los mensajes que se manden al usuario. Para modificar esta variable se escribe:

$mesg n$

Una vez hecho lo anterior, al usuario que intente comunicarse de cualquier manera con nosotros se le desplegará en pantalla un mensaje que dice:

Permission denied.

10

Page 106: Cur So Unix

Manual de Unix

Si se deseara ver el valor de esta variable se debería teclear mesg, sin parámetros y entonces se devolvería :

$mesgis n$

la salida nos indica si el comando esta o no habilitado.

5.1.3 Comunicación con talk.

Ya vimos lo inadecuado que puede llegar a ser el establecer contacto con otro usuario ayudándose de write. En el caso de que se desee hacer una conversación más larga es mejor hacer uso del comando talk.

Veamos un ejemplo para ver cómo usarlo:

$talk nancy[Waiting for your party to respond]

ésto es lo que se vería en la pantalla de quien está pidiendo la comunicación, mientras que en la pantalla del otro usuario se vería lo siguiente:

$Message from [email protected] at15:50...talk: connection requested by [email protected]: respond with: talk [email protected]$

Si el usuario al que le aparece la petición de comunicación, desea contestar sólo basta con teclear talk [email protected], como lo indica el sistema.

La primer palabra hasta antes de la “@” es el nombre de usuario de quien solicita la comunicación, la segunda hasta antes del primer punto es el nombre del servidor al que se encuentra conectado, las últimas tres son la especificación de dónde se encuentra el servidor, siendo la última la abreviación del país de su origen.

10

Page 107: Cur So Unix

Manual de Unix

En el caso de encontrarse en el mismo servidor, bastará con contestar con la orden talk, seguida del nombre de usuario.

Después de que se establece contacto se limpian las pantallas de los dos usuarios y se dividen en dos partes siendo la mitad de arriba la que corresponde al usuario de la terminal y la otra, de quien se recibe mensaje.

El comando talk, a diferencia de write, les permite a los usuarios escribir simultáneamente sus mensajes y los textos aparecen en la ventana correspondiente a cada uno:

(Terminal de nancy)que pasa?oestoy capturando un documento que me pidio EdwinoEn Word y le estoy anexando unas tablas que hiceen ExceloHasta luego^D------------------------------------------------nada, solo queria saber que haciasoah, en que los estas haciendo?oBueno, entonces te dejo seguir trabajandoHasta luego.oo^D$

(Terminal de kyo)nada, solo queria saber lo que haciasoah, en que los estas haciendo?oBueno, entonces te dejo seguir trabajandoHasta luego.oo^D------------------------------------------------que pasa?oestoy capturando un documento que me pidio EdwinoEn Word y le estoy anexando unas tablas que hiceen ExceloHasta luego^D

10

Page 108: Cur So Unix

Manual de Unix

$

10

Page 109: Cur So Unix

Manual de Unix

Como se puede ver, es mucho mejor usar este comando cuando se quiere tener un contacto interactivo.

5.1.4 Comunicación entre mas de dos usuarios con ytalk.

La comunicación interactiva con talk se ve limitada a sólo dos usuarios, pero UNIX permite el establecimiento de contacto de un número mayor de ellos. Esto se logra haciendo uso del comando ytalk. Una vez que es

La forma de establecer comunicación con esta herramienta es exactamente igual que con talk, la única diferencia es que la ventana de cada usuario se dividirá en tantas partes como usuarios estén comunicándose.

Cuando se usa este comando, si un usuario está en contacto con otro y un tercero intenta comunicarse con uno de ellos con ytalk, el mensaje de petición de establecer comunicación aparece en las terminales de quienes ya estaban en contacto, así que si uno de los dos acepta la inserción de éste, la comunicación se establece entre los tres.

10

Page 110: Cur So Unix

Manual de Unix

5.2 EL SISTEMA DE CORREO ELECTRÓNICO

UNIX cuenta con varias herramientas por medio de la cual los usuarios pueden enviarse mensajes entre sí. Estos mensajes se pueden almacenar en un buzón que está en alguna parte del sistema. Entre estas herramientas están mail, mailx y pine. Ahora describimos el uso de estas órdenes.

5.2.1 Envío de correo con el comando mail.

El uso de este comando es sencillo, se usa de igual manera que write, primero el comando, después el nombre del usuario, y a continuación el sistema espera el mensaje del teclado. Éste se envía cuando se teclea en la última línea CTRL-D:

$mail mineRecuerda que el próximo viernes tendremos una Reunión en el cubículo del PTC, nos vemos alli a las 3:00 pm. No se te olvide llevar lo que te tocó.^D$

Si el usuario al que se le envía el mensaje está conectado en ese momento al sistema, se le notifica de que tiene correo cuando se termina la ejecución del comando que estuviera realizando una tarea, si ese fuera el caso. Si no, el mensaje se guardaría en el fichero buzón y se le notificaría de que tiene mensajes. En cualquiera de los dos casos, el aviso es con un letrero que dice:

You have mail.

Si el mensaje fuese demasiado largo, se podría primero pasar por algún editor de texto y después direccionar la Entrada Estándar, para mandarlo. También se puede mandar un mensaje a varios usuarios a la vez. Una combinación de lo anterior sería ésta:

$mail mine sampras nancy < recordatorio$

11

Page 111: Cur So Unix

Manual de Unix

Donde recordatorio es un archivo que contiene el mensaje que se desea mandar.

11

Page 112: Cur So Unix

Manual de Unix

Mensajes de error

Si se intenta mandar un mensaje a un usuario que no existe en el sistema o se teclea mal el nombre, mail responde con algo así:

$mail namcy...^Dmail: can´t send to namcyMail saved in dead.letter$

Si el correo se envió a más de un usuario, y uno de estos es inexistente en el sistema, el mensaje se guardará en el dead.letter en su directorio.

5.2.1.1 Revisar el correo.

Para leer los mensajes recibidos en el buzón sólo se teclea la orden mail, sin parámetros. Si se tiene un solo mensaje en él este se imprime en la pantalla, si hay más de uno, sólo se ve el primero. Los otros mensajes no se pierden, se imprimirán después. El comando mail muestra los mensajes de último en llegar, primero en abrir. Si se lee un mensaje aparecerá en la pantalla algo como esto:

$ mail mail Revision:70.7 92/04/16 15:39:44 Type ? for help."/usr/mail/kyo": 2 messages 2 unread>U 1 [email protected] Mon Apr 29 15:46 14/413 U 3 [email protected] Mon Apr 29 15:49 16/571 ?

Al mostrar el mensaje, mail espera una orden, para ejecutarla. Al final de la pantalla se muestra el carácter “?” indicando la espera, si se teclea otro “?” o un “*”, se imprimirá un menú con las opciones que tiene este comando:

Por ejemplo, para guardar un mensaje se haría lo siguiente:

11

Page 113: Cur So Unix

Manual de Unix

$mail mail Revision:70.7 92/04/16 15:39:44 Type ? for help."/usr/mail/kyo": 2 messages 2 unread>U 1 [email protected] Mon Apr 29 15:46 14/413 U 3 [email protected] Mon Apr 29 15:49 16/571 ?3From [email protected] Mon Apr 29 15:49 CST1996Received: by cronos.fi-b.unam.mxReturn-Path: <[email protected]>From: peña ruiz manuel <[email protected]>To: martinez alvarado joel <[email protected]>Status: RO Este es un mail de prueba para el manual de unix?

Esta orden puede hacer varias cosas: si el nombre de archivo para guardar el mensaje no existe, éste se crea y el mensaje con todo y cabecera se guarda en él; si ya existe, el mensaje se añade al archivo y se borra del buzón, visualizándose el siguiente mensaje; si ya no hay más mensajes, mail termina y sale al promp del sistema.

Otra forma de guardar mensajes es usando la orden w, la única diferencia de usar ésta es que no guarda la cabecera del mensaje como lo hace el comando mail. Si no se da el nombre de algún archivo las dos órdenes guardan los mensajes en uno llamado mbox. Si no se tiene permiso de escritura en el directorio desde donde se esté leyendo el correo, mail manda un mensaje de error:

Permission denied!

Por eso es mejor leer el correo cuando se encuentre en el directorio propio.

Otra de las características de mail es que si se antepone a una orden el carácter “!”, se interpreta como un comando para el shell y se ejecuta, igual que con write.

Así puede uno asegurarse de guardar el correo en el lugar indicado. Se pueden hacer más cosas desde mail, por ejemplo, suponga que está leyendo el siguiente mensaje :

From nancy Fri Apr 26 12:58:43 1086El próximo lunes es el último día para entregar tu curriculum, no se te olvide llenarlo y entregarlo a Carlos, a José o a mí. $

11

Page 114: Cur So Unix

Manual de Unix

Al terminar de leerlo se podría mandar una respuesta con otro mensaje:

? !mail nancyGracias por recordármelo, pero ya pasé a dejarlo en el cubículo.^D!?

Para borrar mensajes inmediatamente después de leerlos se usa la operación d, dentro de mail. Si no se hace esto, el mensaje aparecerá la próxima vez que entre a mail. Para ver el siguiente mensaje sin borrar o guardar el actual, se puede usar el carácter “+” o simplemente presionar la tecla RETURN. Si no hay más mensajes se termina la ejecución de mail.

Si un mensaje es demasiado largo para leerlo en una sola página, se puede teclear p y aparecerá sólo el contenido que quepa para verlo en una sola. Para continuar viéndolo se puede oprimir la tecla BREAK.

Para ver mensajes anteriores sólo basta con pulsar “-” y se retrocederá de mensaje en mensaje, ya que no se puede ver uno en específico.

5.2.1.2 Reexpedición de correo.

Para mandar el mensaje que se está viendo actualmente a otro o a otros usuarios sólo basta usar el operador m seguido por los usuarios a quienes se les desea mandar el mensaje. Si no se escribe el argumento para m, el mensaje no se toca. Inmediatamente después de reexpedir el mensaje, este se borra del archivo buzón.

En el caso de quien lo recibe, pueden ver que es reexpedido con el letrero (forwarded) y indicando el nombre de quien lo mandó.

5.2.1.2 Salir de mail.

Se sale de mail de varias maneras:

La primera es si se está leyendo el último o el único mensaje y al “?” se le contesta presionando ENTER.

La segunda es para salir en cualquier momento presionando las teclas CTRL-D.

También se sale inmediatamente después de contestar con q.

Otra forma para abandona el correo, es pulsando x.

11

Page 115: Cur So Unix

Manual de Unix

Al teclear q o CTRL-D se sale de mail y los mensajes borrados se eliminan mientras que los no borrados y no leídos se almacenan.

Si se usa x, el mail no hace los cambios que se hicieron mientras se estuvo dentro de él, es decir, si se borraron mensajes, éstos no se eliminarán.

Con –f se puede especificar el archivo de donde se quiere hacer la lectura de mensajes.

Por ejemplo, suponga que se tienen varios mensajes guardados en el archivo correo, para leerlos se teclearía:

$mail -f correo...

5.2.2 Envío de correo con mailx

El envío de correo con este comando es mucho mejor que con mail, ya que cuenta con características más potentes para poder enviar mensajes. El siguiente es un ejemplo de cómo mandar un mensaje a un usuario con mailx:

$mailx mine Subject: recordatorio Este mensaje es solo para recordarte que al terminar el semestre vamos a celebrar junto con los demas chavos del grupo. Que no se te olvide.^DCc: nancy utlem tenorio$

En la línea de comando se escribe el comando, seguido por el nombre del usuario al que se le desea mandar el mensaje. Después se pedirá el título del mensaje (con subject). Después de darle esto, se comienza a escribir el cuerpo del documento y se termina con CTRL-D. Lo último que pide el comando es a qué usuarios se les debe mandar una copia del mensaje (Cc), estos nombres deben estar separados por espacios o por comas.

Al igual que con mail, sólo se puede editar la línea de escritura actual. Así que si se desea enviar un mensaje demasiado grande es mejor escribirlo en un editor de texto. Después de guardar el mensaje en un archivo, este se envía de la siguiente forma:

$mailx nancy < mensaje$

11

Page 116: Cur So Unix

Manual de Unix

11

Page 117: Cur So Unix

Manual de Unix

5.2.2.1 Escapes.

Una de las características que hacen la gran diferencia entre mandar mensajes con mailx y no con mail es que se puede hacer uso de los llamados escapes. Un escape es una herramienta de mailx que permite la interacción entre mailx y el usuario. Algunos de los escapes más útiles son los siguientes:

Escape: ~v

Descripción: Permite el uso del editor vi dentro de mailx para la escritura del mensaje que se va a enviar.

Este escape es muy útil cuando se quiere mandar un mensaje muy largo, ya que permite la edición de un texto usando vi. En el siguiente ejemplo se muestra como se utiliza:

$ mailx samprasSubject: peticion~v"/tmp/Re3326" 0 lines, 0 characters He sabido que la próxima semana darás un curso de redes UNIX a los prebes, por lo que quiero pedirte que me aceptes en tu grupo como alumno. Contesta el mensaje mandándome hora,lugar y fecha de la impartición de tu clase.

Por favor, no dejes de contestar...

...kyo~~"/tmp/Re3326" 7 lines, 274 characters(continue)^DCc:$

Escape: ~r

Definición: Permite el envío de un archivo como parte del mensaje que se desea mandar.

Cuando se carga un archivo dentro del mensaje para enviarlo a otro usuario, al igual que con el escape ~v, lo que se teclee después de ejecutar la operación será añadido al escrito hasta que se oprima CTRL-D:

11

Page 118: Cur So Unix

Manual de Unix

$mailx nancySubject: despierta~r men"men" 24/684despierta!^DCc:$

Escape: ~c.

Definición: Con este se puede añadir un usuario al que se le desea mandar una copia del correo que se está escribiendo actualmente:

Escape: ~p.

Decripción: Imprime en la pantalla el contenido del encabezado junto con lo que se haya escrito del mensaje hasta el momento.

Escape: ~s.

Descripción: Con este escape se permite añadir la cadena que se especifique como encabezado de mensaje.

Escape: ~?.

Descripción: Otorga una ayuda acerca de los escapes de tilde.

5.2.2.2 Lectura de correo.

Para leer el correo sólo se tiene que teclear la orden mailx, sin parámetros y entonces aparecerá algo como esto:

$ mailxmailx Revision: 70.7 Date: 92/04/16 15:39:44 Type ?for help."/usr/mail/kyo": 7 messages 4 new 1 [email protected] Mon Apr 29 15:46 15/425 2 [email protected] Mon Apr 29 15:46 15/425

11

Page 119: Cur So Unix

Manual de Unix

3 [email protected] Tue Apr 30 17:19 58/2867>N 4 [email protected] Tue Apr 30 20:21 15/579 N 5 [email protected] Tue May 7 14:08 56/1020 Returned mail: User unknown U 6 [email protected] Tue May 7 14:37 33/991 N 7 [email protected] Tue May 7 16:31 13/340 que onda??

Los símbolos N, U, > tienen los siguientes significados:

N indica que el archivo es nuevo, y que no ha sido visto anteriormente.

U quiere decir que el mensaje no se ha leído. Sólo se ha visto el encabezado de él.

> Este carácter señala el primer mensaje nuevo de la lista.

Los demás campos de una línea que corresponde a un mensaje son el número de mensaje, el nombre de quien lo mandó, fecha y hora de cuándo fué enviado, el número de caracteres y líneas que contiene el mensaje y por último, una copia del encabezado del mensaje.

Al igual que con mail, mailx espera una orden, indicándolo con el carácter “?”. Si se le responde con otro símbolo “?” o con help, se muestra una pantalla de ayuda con los comandos de línea para mailx:

? help

mailx commands

type [msglist] print messages next goto and type next message edit [msglist] edit messages from [msglist] give header lines of messages delete [msglist] delete messages undelete [msglist] restore deleted messages save [msglist] file append messages to file reply [message] reply to message, including all

recipients

Reply [msglist] reply to the authors of the messages preserve [msglist] preserve messages in mailbox

11

Page 120: Cur So Unix

Manual de Unix

mail user mail to specific user quit quit, preserving unread messages exit quit, preserving all messages header print page of active message headers ! shell escape cd [directory] chdir to directory or home if none given list list all commands (no explanations) top [msglist] print top 5 lines of messages z [-] display next [previous] page of 10

headers [msglist] is optional and specifies messages by number, author, subject or type. The default is the current message.?

Estas acciones se manejan de igual manera que las que ya se explicaron con mail en la sección pasada

5.2.2.3 Creación de fólders.

El uso de esta herramienta está destinado a la organización de mensajes para hacer un acceso más fácil a ellos. Se pueden crear tantos fólders como el usuario necesite y estos están contenidos en un sólo directorio. El directorio en el que se guardarán será especificado en el archivo .mailrc. Esta especificación se hace agregándole la siguiente instrucción:

set folder=correo

donde correo es el nombre del directorio donde se guardarán los folders.De esta forma, si se desea guardar un mensaje en un fólder sólo se tecleará:

?s +ptc?

Esto le indica a mailx que grabe el mensaje actual en el fólder ptc. Si el fólder no fue creado con anterioridad, éste será creado al momento de intentar guardar el mensaje.

Para hacer una copia de un fólder en el archivo mbox del directorio de casa sólo se hace lo siguiente:

12

Page 121: Cur So Unix

Manual de Unix

...?co +ptc?

Si se deseara hacer la lectura de los mensajes de otro fólder, entonces se debería escribir:

...?fold +ptc?

Para saber cual es el fólder que se está leyendo, se teclea fold, sin parámetros. Para tener una lista de los fólders que se tienen en el directorio se teclea:

...?&folders...?

5.2.2.4 Opciones de mailx.

Opción: -s (subject).

Descripción: Permite agregar un encabezado cando se direcciona un archivo para enviarlo como mensaje:

$mailx -s petición sampras <mensaje$

Después de la opción -s se teclea el título para subject seguido del nombre del usuario al que se le mandará el mensaje y por último se direcciona el archivo donde se tiene el mensaje.

Opción -f (folder)

Descripción: Especifica el nombre del folder del que se leerán los archivos del correo.

Cuando se tienen mensajes en archivos que sean fólders del directorio de correo, se usa esta opción. La orden completa sería así:

$mailx -f +ptc...

12

Page 122: Cur So Unix

Manual de Unix

12

Page 123: Cur So Unix

Manual de Unix

Un proceso es uno o más comandos tecleados al shell. Procesos más complicados consisten en más de un comando escritos en un tubo. Por ejemplo:

$ps -ef|grep kyo > kyo.proc $

El shell asocia cada proceso con un número de proceso. Una vez que este es creado, este se puede controlar o manipular.

12

Page 124: Cur So Unix

Manual de Unix

6.1 Monitoreo de ProcesosEl shell guarda una tabla de todos los procesos actuales y de sus números. Para ver un

listado de esa tabla se teclea :

$jobs[1] + Running find / *txt*|sort> find.txt &[2] - Done ps -ef|grep kyo > kyo.proc$

El número del proceso es desplegado entre corchetes. + señala a un proceso como el que se está ejecutando actualmente y - indica a un proceso como el anterior. Done, Running o Stopped indican el estado actual del proceso.

12

Page 125: Cur So Unix

Manual de Unix

6.2 Suspensión de procesos.Suspender un proceso permite detener a la mitad un proceso y regresar el control de la

terminal para otros trabajos. Más tarde se puede reanudar el proceso o ejecutarlo en background. Para suspender un proceso se necesita teclear CTRL-Z (si el caracter susp está definido como ^Z).

Existen varias causas por las que se requiere suspender un proceso, y en ocaciones no se puede utilizar CTRL-Z, en estos casos existe un comando dentro del shell, kill, el cual se revisará más adelante.

12

Page 126: Cur So Unix

Manual de Unix

6.3 Poniendo un proceso en Background/Foreground.Existe una forma de liberar una terminal y al mismo tiempo seguir ejecutando procesos

demasiado largos. Un proceso así puede ponerse en background. Un proceso en background es uno que corre invisiblemente al usuario. Un proceso que está corriendo visiblemente al usuario está corriendo en foreground. El shell pone un proceso en background cuando al final de una línea de comandos se le termina con un símbolo (el metacarácter &).

Si la opción set -o monitor está activada, un proceso envía un mensaje a la terminal de la forma:

[2] - Done ps -ef|grep kyo > kyo.proc

Esto identifica al proceso por su número y muestra que el proceso ha sido terminado.

Existen dos comandos que permiten manipular a los procesos para ponerlos en background o en foreground: el comando bg que los pone en background y el comando fg que los pone en foreground.

Para poner un proceso visible en la pantalla se teclea:

$fg %num_proceso

O escribir %% o %+ si se trata del proceso actual. Si el proceso fuera el anterior, se teclearía %-. Para poner a un proceso en background se teclea :

$bg %num_proceso

12

Page 127: Cur So Unix

Manual de Unix

6.4 Matando procesos.Algunas veces cuando se ha empezado un proceso y se ve que es incorrecto lo que se está

haciendo se desea que ya no se siga ejecutando. En este tipo de situaciones se puede destruir o matar un proceso. Supóngase que se ha empezado el siguiente proceso:

$ lsf /* |sort archs &[1] 9305

y que después de empezarlo no se quisiera listar el sistema de archivos completo, sino sólo el directorio raíz, y se decide terminar el proceso. Esto se logra usando el número del proceso ( [1]):

$kill %1$

El comando kill mata el proceso y el metacarácter “%” especifica su número.

Pero si el proceso que desea matarse no está en background entonces se debe buscar su número asociado. Esto se logra usando el comando ps. Para listar los procesos de un usuario en específico que se están corriendo en una terminal se usa algo parecido a esto:

$ps –ef | grep kyo kyo 9326 8830 3 19:04:38 ttys3 0:00 grep kyokyo 8830 8829 1 17:56:40 ttys3 0:00 -kshkyo 9325 8830 18 19:04:38 ttys3 0:00 ps -ef$

La primer columna da el nombre de usuario de quien está ejecutando el proceso, la segunda da el número del proceso, la tercer el número del proceso que mandó ejecutar a ese proceso.

Para matar, por ejemplo el proceso -ksh entonces se puede ejecutar el comando:

$kill -9 8830

Con lo que se terminará con la sesión de trabajo actual.

Si solamente se tecleará el comando kill entonces aparecerían todas las banderas que puede utilizar el comando.

12

Page 128: Cur So Unix

Manual de Unix

6.5 Comando .-psDescripción: Este comando se utiliza para ver en un instante dado, cuál es el estado de los

procesos que se están ejecutando en el sistema.

Si no se especifica ninguna opción da información sobre los procesos del intérprete de comandos en el que se ejecuta. Este comando es muy útil para averiguar el pid (identificador del proceso) de los procesos que se quieren matar con el comando kill. La información que facilita el comando ps sobre los procesos, se presenta en formato de columnas y dependiendo de las opciones nos muestra la siguiente información, en sus correspondientes columnas:

ADDR Dirección de memoria del proceso.

F Flags del proceso

1: Proceso trazado.

2: El proceso está asignado al procesador.

3: El proceso no está asignado.

PID identificador del proceso.

PPID identificador del proceso padre que lo creó.

PRI Prioridad del proceso.

SIZE Espacio en número de páginas que ocupa el proceso en memoria.

RSS Tamaño del proceso en kilobytes que está realmente en memoria en este instante.

WCHAN: Evento sobre el que el proceso está esperando.

S: Estado del proceso

- El proceso no existe.

S Durmiendo.

W En espera de algún evento.

R En ejecución.

I: Recién creado.

Z Zombi.

T Trazado.

TTY Terminal del proceso

PAGEIN Cantidad de faltas de página que ha causado.

12

Page 129: Cur So Unix

Manual de Unix

TIME Tiempo de CPU consumido por el proceso.

UID Identificador del usuario que lanzó el proceso.

SWAP Cantidad de kilobytes del proceso en la memoria SWAP

Para este comando existen las siguientes opciónes:

-e Muestra todos los procesos.

-f Muestra el UID, PID y PPID, C (nivel de utilización), STIME (hora a la que se inició el proceso), y TTY (la terminal asociada al proceso).

-l Muestra una lista larga de los procesos.

Ejemplos:

$ ps –ef UID PID PPID STIME TTY TIME CMDroot 1 0 May22 ? 00:00:08 init [3]root 2 1 May22 ? 00:01:05 [kupdate]root 3 1 May22 ? 00:00:00 [kpiod]root 4 1 May22 ? 00:00:05 [kswapd]root 5 1 May22 ? 00:00:00 [mdrecoveryd]bin 441 1 May22 ? 00:00:00 [portmap]root 468 1 May22 ? 00:00:00 /usr/sbin/automount --timeout 60root 520 1 May22 ? 00:00:31 syslogd -m 0root 529 1 May22 ? 00:00:00 [klogd]root 543 1 May22 ? 00:00:00 crondroot 557 1 May22 ? 00:00:04 inetdroot 601 1 May22 ? 00:00:05 sendmail: accepting connections root 616 1 May22 ttyS0 00:00:00 gpm -t msroot 630 1 May22 ? 00:00:03 httpdnobody 641 630 May22 ? 00:00:02 httpdnobody 647 630 May22 ? 00:00:02 httpdroot 648 1 May22 ? 00:00:00 /usr/local/sbin/sshd2root 744 1 May22 tty1 00:00:00 /sbin/mingetty tty1root 745 1 May22 tty2 00:00:00 [mingetty]root 746 1 May22 tty3 00:00:00 [mingetty]root 747 1 May22 tty4 00:00:00 [mingetty]root 748 1 May22 tty5 00:00:00 [mingetty]….…..…..….

Muestra todos los procesos que se están realizando en ese momento. Los campos que se muestran son: UID, PID, PPID, CMD, TIME.

12

Page 130: Cur So Unix

Manual de Unix

6.6 Commando killDescripción: Comando utilizado generalmente para detener procesos que se están ejecutando,

comúnmente se llama matar a un proceso a esta acción.

En general, la acción que se realiza con el comando kill es mandar señales a los procesos en ejecución. Sólo podemos matar al proceso si se es el usuario que lanzó el proceso o el usuario root.

kill [-señal] pid

Opciones:

-señal Señal que se quiere enviar a proceso, generalmente es la señal SIGKILL o señal 9, que es la que mata al proceso sin remisión.

Existen 31 tipos de señales: las señales son las siguientes:

1) SIGHUP 2) SIGINT 3) SIGQUIT

4) SIGILL 5) SIGTRAP 6) SIGIOT

7) SIGBUS 8) SIGFPE 9) SIGKILL

10) SIGUSR1 11) SIGSEGV 12) SIGUSR2

13) SIGPIPE 14) SIGALRM 15) SIGTERM

17) SIGCHLD 18) SIGCONT 19) SIGSTOP

20) SIGTSTP 21) SIGTTIN 22) SIGTTOU

23) SIGURG 24) SIGXCPU 25) SIGXFSZ

26) SIGVTALRM 27) SIGPROF 28) SIGWINCH

29) SIGIO 30) SIGPWR 31) SIGSYS

pid Número identificador del proceso al que se pretende mandar la señal.

-l Muestra una lista con las señales que podemos mandar a los procesos.

Ejemplo:

$kill —9 543$

Eliminará al proceso cuyo pid es el 543, sólo podemos matar al proceso si se es el usuario que lanzó el proceso o el usuario root.

13

Page 131: Cur So Unix

Manual de Unix

13

Page 132: Cur So Unix

Manual de Unix

Cuando se hace un programa que posteriormente se puede usar como comando, es muy practico tener un manual para poder saber con exactitud que hace el comando. El hacer una página de manual puede parecer una perdida de tiempo, pero si se hace un programa con ciertas características y se deja de usar, cuando se vuelva a requerir, es más fácil leer el manual que empezar por entender que hace el programa.

Cuando se entrega un proyecto, se debe tener la documentación adecuada, para no perder los derechos sobre esté, una forma de hacer la documentación con cierta presentación es utilizando las páginas de manual.

Las etiquetas que se utilizan para crear una página de manual vienen a continuación con una descripción de su uso.

Etiquetas y descripción

.TH Es el encabezado del manual. Aquí se suele poner el nombre del comando en mayusculas y su sección entre parentesis

.TB Es el pie de página del manual. Aquí se incluye la numeración de página, la versión y otras cosas.

.SH Esto es cada una de las secciones del manual

.ad l Ajusta el margen izquierdo

.ad r Ajusta el margen derecho

.ad c Centra el párrafo

.aa b/n Justificado el párrafo. Las dos posibilidades son por compatibilidad con nroff.

.ce [N] Centra la N líneas siguientes.

.ls [N] Establece un espaciado de N entre las líneas del párrafo.

.us [N] Da un espaciado vertical de N puntos.

.CU [N] Pone en cursiva (subraya) el texto de N líneas siguientes. Este comando solo funciona para nroff.

.UL [N] Pone en cursiva (subraya) el texto de N líneas siguientes. Este comando solo funciona para ncroff.

.ft [RIBS] Deja el tipo de letra times normal (R) o en símbolos griegos o matemáticos.

.B El texto a continuación estará en negritas

13

Page 133: Cur So Unix

Manual de Unix

.I El texto a continuación estará en cursivas

.R El texto a continuación estará en normal

.BI Coloca la primera palabra en negritas, la siguiente en cursivas y se va alternando.

Se pueden hacer combinaciones con B, R, I en el orden que se quiera.

Un ejemplo de una página es el siguiente:

$ vi migrep.txt

.TH MIGREP.SED

.SH migrep.sedmigrep.sed - Hace la emulacion del comando grep

.SH SINOPSIS

.B migrep.sed - Busca el patrón introducido que se proporciono en el teclado del archivo..SH ARCHIVOS - No usa ningún..I "sed".SH VERSION - Realizada el 20 de mayo de 2003.SH AUTOR - Jazmín Espinosa

* Nota: Cuando se hace la página de manual, es necesario que al inicio del renglón se comience con las banderas, en el caso contrario no las tomara como banderas

Para hacer la página

nroff -man migrep.txt > migrep

otra forma de hacer la página es

groff -t -man -Tascci migrep.txt > migrep

donde

-t procesa

-man carga la página

-Tascciprepara la salida para poder usar la man page.

13

Page 134: Cur So Unix

Manual de Unix

Para ejecutar la página se utiliza

more ./migrep

Postscrip

Se puede hacer con la misma forma un postscrip, con una pequeña diferencia en la creación, para hacerlo se utiliza el comando:

groff -man migrep.txt > migrep.sp

esta se ejecuta igual que la página.

more ./migrep.sp

13

Page 135: Cur So Unix

Manual de Unix

13

Page 136: Cur So Unix

Manual de Unix

8.1 INTRODUCCIÓN

8.1.1 ¿ Qué son los shells?

Se puede decir que un shell es el programa que actúa como interfase entre el usuario y el sistema. El shell interpreta el texto que se teclea y las teclas que se presionan y le indican al sistema operativo cual es la acción apropiada que debe seguir. Un shell puede servir también como un lenguaje de programación.

8.1.2 ¿ Qué es Bourne Shell?

El Bourne shell es el shell más viejo de todos, fue hecho por Stephen Bourne en los Laboratorios Bell. Este shell es el de default para los usuarios de sistemas HP-UX. Este shell no cuenta con las características interactivas ni con las complejas construcciones de programación de cshell o kshell.

8.1.3 ¿ Qué es C shell?

Este shell se desarrolló por Bill Joy en la Universidad de California en Berkeley. La sintaxis de este shell es idéntica a la del lenguaje de programación C, de ahí su nombre. Tiene características interactivas muy poderosas tales como una historia de comandos y COMPLEMENTO de nombres de archivos.

8.1.4 ¿ Qué es Korn shell?

Éste es el shell más reciente. Fue desarrollado por David Korn en los Laboratorios Bell y es compatible con muchas de las características de Bourne Shell. Cuenta con las herramientas interactivas de C Shell, pero con la ventaja de que tiene una ejecución más rápida. Además tiene la capacidad de edición en la línea de comandos.

13

Page 137: Cur So Unix

Manual de Unix

8.2 CAMBIO DE SHELLPara poder saber con qué shell se está trabajando cuando se entra en sesión se puede

escribir:

$echo $SHELL

El comando echo imprime en pantalla el valor del contenido de la variable llamada SHELL. Ésta variable contiene el nombre del archivo que indica que shell se está usando actualmente.

8.2.1 Cambio temporal del shell.

A menos que se esté trabajando en un shell restringido, se puede hacer un cambio temporal de éste con sólo teclear en la línea de comandos el nombre del archivo del shell al que se quiere cambiar, por ejemplo, si se está trabajando en kshell y se desea cambiar a cshell se debe hacer esto:

$/bin/csh%

Como se puede observar, el prompt cambió de “$” que es el prompt por default de ksh a “%” que es el de csh.

Para salir del shell en uso simplemente se teclea en la línea de comandos la palabra exit.

8.2.2 Cambio permanente del shell.Comando: chsh (change shell)

Descripción: Este comando sirve para cambiar el shell de un usuario en forma permanente.

Para cambiar el shell que se tiene por default al entrar en sesión en forma permanente se debe usar el comando chsh seguido por el nombre del usuario al que se le desea cambiar y por el nombre del shell al que se quiere cambiar, por ejemplo si el usuario navajo deseara cambiar su shell a csh teclearía lo siguiente:

13

Page 138: Cur So Unix

Manual de Unix

$chsh navajo /bin/csh $

Para que tenga efecto este comando se debe salir de la sesión actual y al entrar la próxima vez el shell en uso será el que se especificó.

8.2.3 Usando ksh.

Una vez que se entra en sesión, el shell está listo para recibir comandos y esto se indica mediante el despliegue en pantalla de un prompt que en el caso de ksh es el caracter “$” (signo de pesos), por default.

8.2.3.1 Variables de ambiente y las del Shell.

Las variables de ambiente son parámetros globales del shell que crean un ambiente especial para los subshells y para cualquier comando que se invoque. Este ambiente se desactiva hasta que el usuario salga de sesión. Por su parte, las del shell son parámetros que son locales al shell por default y no pasan a los subshells o a los subprocesos que se ejecuten. Ambos tipos de variables se inicializan en los archivos .profile y $ENV (normalmente llamado .kshrc).

Cuando ksh es el shell por default, se ve si existen los archivos /etc/profile y .profile, si el primero existe, se ejecuta e inicializa las variables de ambiente, en el caso del segundo, se busca en el directorio propio y se ejecuta después de entrar en sesión.

Cuando se ejecuta el .profile se toma el contenido de la variable $ENV y se ejecuta, si el archivo nombrado ahí existe. Por convención, este archivo se llama .kshrc.

8.2.3.2 Inicializando variables en el .profile.

El archivo .profile establece el ambiente en el que se trabajará al definir variables, comandos, y parámetros al entrar en sesión. Los valores de éstos son globales y disponibles para subshells y subprocesos si son exportados. Un ejemplo de un .profile es este:

PATH=/bin/posix:/usr/bin/:/usr/lib:/users/ptc/kyo:.MAIL=/usr/mail/kyoHOME=/users/ptc/kyoEDITOR=/usr/bin/viENV=~/kshrcTERM=hp2392export ENV START EDITOR TERM PATH MAIL HOME

13

Page 139: Cur So Unix

Manual de Unix

stty sane susp ^Z

if mail -ethen echo “you have mail”fiPS1=“$ “

PATH define la ruta en el sistema de archivos de búsqueda para la ejecución de comandos. Cada directorio en el PATH se separa por “:”. Cuando se quiere ejecutar un comando, el shell busca en cada uno de los directorios especificados en el PATH, para encontrar el comando.

MAIL nombra el archivo en el cual se entrega el correo. La sentencia if checa si ha llegado nuevo correo y lo notifica.

HOME establece el directorio de casa donde el shell te colocará al ejecutar el comando cd sin opciones.

EDITOR define el editor por default, que en este caso es vi. Así, cada vez que se necesite hacer cambios en la línea de comandos, se entrará al modo vi.

ENV esta variable está asignada normalmente a ser .kshrc y se ejecuta siempre que un shell es creado.

TERM define el tipo de terminal para el cual la salida se preparará.

El comando export hace globales los valores de estos parámetros para que los subprocesos tengan acceso a ellos.

El comando stty define las características de la terminal los valores por default, por ejemplo susp ^Z (CTRL-Z) especifica la combinación de teclas con la que se podrá suspender un proceso.

Cuando se define un .profile de verdad se utilizan muchas más variables para hacer el ambiente de trabajo más amigable. La siguiente tabla muestra algunas otras variables y parámetros :

Parámetro Definición

# Representa el número, en decimal, de los parámetros dados al shell.

13

Page 140: Cur So Unix

Manual de Unix

Parámetro Definición

- (dash) Representa las banderas u opciones dadas al shell en algún comando.

? Representa el valor decimal (valor de salida) regresado al sistema por el último comando ejecutado.

$ Representa el número del proceso del último shell invocado.

! Da el número del proceso del último proceso en background ejecutado.

_ (subguión) Representa el último argumento de la línea de comando previa.

CDPATH Contiene la ruta de búsqueda para el comando cd.

COLUMNS Da el tamaño de la ventana de edición, en columnas, para los editores y para la impresión de listados.

EDITOR Contiene el editor que se usará cuando se invoque al comando set -o.

ENV Si este parámetro contiene el nombre de algún un shell script éste se ejecutará al invocar un nuevo shell.

FCEDIT Especifica el nombre del editor que se usará al ejecutar el comando fc.

IFS Internal Field Separator (usualmente el espacio, tab y enter). Se usa para separar los comandos cuando se utiliza la sustitución de parámetros y cuando se usa el comando read.

HISTFILE Contiene el nombre del archivo que se usará como almacén de la historia de comandos. Este es por default el .sh_history.

HSTSIZE Contiene el número de comandos guardados en el .sh_history. El default es 128.

HOME Es el directorio casa. Contiene el directorio al que se trasladará al ejecutar el comando cd.

LINES Determina el tamaño de la ventana de edición en líneas.

MAIL Si este parámetro contiene el nombre de un archivo y el parámetro de MAILPATH no está definido, el shell notifica que el correo que ha llegado está en el archivo nombrado aquí.

14

Page 141: Cur So Unix

Manual de Unix

Parámetro DefiniciónMAILCHECK

Este parámetro especifica qué tan frecuentemente (en segundos) el shell verificará la llegada de un nuevo mensaje. El default es 600 s.

MAILPATH Cuando el shell se da cuenta de que ha llegado correo, este notifica que se encuentra en el archivo nombrado ahí.

PATH Contiene la ruta de búsqueda para la ejecución de comandos.

PPID Contiene el número del proceso padre del shell actual. Cuando se ejecuta el comando ps -ef, se ve este número. Asociado con este PPID está un PID, que es el número del proceso actual.

PS1 Define el prompt primario del shell. El default es $. Si se precede este símbolo por un “!”, el prompt desplegará también el número del comando actual.

PS2 Define el prompt secundario. El default es “>“. Este aparece cuando se escribe un script en la línea de comandos.

PS3 Es el prompt que utiliza el comando select. El default es #?.

PWD Contiene el nombre del directorio de trabajo actual.

OLPWD Contiene el nombre del directorio de trabajo anterior inmediato.

RANDOM Cuando se hace uso de este comando se genera un número entero aleatorio.

REPLY Este parámetro se define por los comandos read y select cuando no se dan argumentos en la línea de comandos de select.

SECONDS Regresa el número de segundos desde que se invocó el último shell.

SHELL Contiene la ruta del shell que se está ejecutando actualmente.

TMOUT Si este parámetro contiene un valor mayor que cero, el shell terminará sino se teclea algún comando o se pulsa un enter dentro de ese número de segundos.

VISUAL Cuando esta variable contiene algún parámetro como vi, entonces las opciones del comando set -o se activan.

14

Page 142: Cur So Unix

Manual de Unix

8.2.3.3 Definiendo el $ENV.

Este shell script define valores, tales como rutas de búsqueda y alias. Estos valores pueden ser tomados por subprocesos del shell. Un archivo ENV puede ser como este:

rl=/abreviación/del/nombre/de/una/ruta/largaalias who=´who|sort´set -o monitor

La primera línea del archivo define el contenido de rl como el directorio especificado a su derecha. Así, al ejecutar el comando:

$ cd $rl

este colocará al usuario en el directorio especificado en rl. Se debe notar que el uso de “$” antes de rl, designa que se usará el contenido de ese parámetro.

El comando alias crea un nuevo comando, basado en los existentes en el shell. En el caso de este archivo, indica que el comando who será ahora el mismo comando pero que además, la salida se mostrará ordenada.

Cada usuario puede crear su propio .kshrc utilizando un editor, pero el nombre del archivo creado debe ser defindo en la variable ENV en el .profile, de otro modo este archivo no se leerá cuando se invoque un shell. Por ejemplo, si se usa el archivo .kshrc, una línea en el .profile debe verse como esta:

export ENV=$HOME/.kshrc

8.2.3.4 El comando set.

Existe un comando que despliega el valor actual de cada una de las variables de ambiente, este es el comando set. Si se teclea set, entonces aparecerá una lista de las variables definidas con sus contenidos:

EDITOR=/usr/bin/vi...TMOUT=0VISUAL=vi

14

Page 143: Cur So Unix

Manual de Unix

8.2.3.5 Terminando el shell.

Hay dos maneras para salir: tecleando exit o CTRL-D. La opción ignoreeof pone a CTRL-D en activado o desactivado. El valor de ignoreeof se asigna con el comando set -o (i.e. al teclear set -o ignoreeof). Para determinar el valor actual de ignoreeof se teclea :

$set -oCurrent option settingsallexport offbgnice onemacs offerrexit offgmacs offignoreeof oninteractive onkeyword offmarkdirs offmonitor onnoexec offnoclobber offnoglob offnolog offnounset onprivileged offrestricted offtrackall offverbose offvi onviraw offxtrace off$

En este ejemplo ignoreeof esta activado, si ignoreeof esta desactivado, se debería teclear exit para salir del shell.

Usando exit.

Normalmente se sale de sesión usando exit o CTRL-D. Si se tratara de salir del shell usando CTRL-D estando ignoreeof desactivado el sistema responde con :

Use exit to logout

14

Page 144: Cur So Unix

Manual de Unix

8.2.3.6 Ejecutando un logout script.

Si se deseara implementar una acción especial al salir de sesión, se podría hacer usando el comando trap y el shell script .logout.

Si el archivo .logout existe y la siguiente sentencia aparece en el .profile:

trap “HOME/.logout” O

al salir de sesión el shell script .logout se ejecuta. Este archivo podría contener líneas como:

clearecho “HASTA LUEGO”

Comandos que se ejecutarán después de teclear exit o CTRL-D.

8.2.3.7 Separadores y terminadores de comandos.

Algunos meta caracteres usados por el shell para separar o terminar comandos en una línea así como para indicarle funciones especiales al shell. Por ejemplo:

date;ls &

donde “;” es un separador y “&” es un terminador. Esta línea le indica al shell que se ejecute el comando date y que después se ejecute el comando ls en background.

La siguiente tabla muestra los separadores y terminadores de comandos y da un ejemplo de cada uno de ellos:

Carácter

Ejemplo Descripción.

; $whoami;ls kyoMail html mail nptc programs vuefilecorreo images men nsmail textos$

Separa comandos que son ejecutados en secuencia. En este ejemplo, ls se ejecuta solamente después de que el comando whoami se termina.

14

Page 145: Cur So Unix

Manual de Unix

Carácter

Ejemplo Descripción.

& $ find / text* >buscar & [1] 22719$echo holahola

Indica que el comando debe ser ejecutado como un proceso asíncrono. Eso significa que se pueden ejecutar otros comandos inmediatamente en la terminal mientras el otro comando se ejecuta invisiblemente en background. En este ejemplo el comando find se ejecuta en background dejando libre la terminal para ejecutar otros procesos.

&& $ls .kshrc && echo adiós.kshrcadiós$

Es un separador de comandos. Le indica al shell que el segundo comando sólo se ejecutará si el primero se ejecuta con éxito, esto es, si su estado de salida es 0. En este ejemplo, si el comando ls falla al encontrar el archivo .kshrc, entonces echo no se ejecuta.

|| $mail || ls file*No mailfile1file2file3$

Es un separador de comandos. En este caso, el segundo comando se ejecuta sólo si el primero falla, esto es, que su estado de salida es diferente de 0. En este ejemplo, ls file* se ejecutó porque no había correo.

14

Page 146: Cur So Unix

Manual de Unix

8.3 CAPACIDADES DE SUSTITUCIÓN

8.3.1 Sustitución con tilde.

Si una palabra comienza con una “~”, la expansión con tilde es representada para esa palabra. Se debe notar que la expansión con tilde es sólo para aquellas palabras que comienzan con una tilde, es decir, find /~pbm/abc no tiene una representación con tilde.

La expansión con tilde esta dada de acuerdo con las siguientes reglas:

Una tilde por sí misma o después de un “/” se remplaza por la ruta definida en la variable HOME:

echo $HOME /users/ptc/kyo$ echo ~/users/ptc/kyo$

Una tilde seguida por un “+” se remplaza con el valor de la variable PWD.

$ echo $PWD /users/ptc/kyo/textos$ ls ~+/May* /users/ptc/kyo/textos/May20 /users/ptc/kyo/textos/May30/users/ptc/kyo/textos/May25

Una tilde seguida por un “-” se remplaza con el valor de la variable OLDPWD:

$echo $OLDPWD /users/ptc/kyo$ls ~-/n*/users/ptc/kyo/nptc/users/ptc/kyo/nsmail:Inbox

Si una tilde es seguida por muchos caracteres y después por un “/”, el shell checa si los caracteres coinciden con el nombre de un usuario en el archivo /etc/passwd. Si coinciden, la secuencia de caracteres es remplazada por la ruta de entrada de ese usuario.

14

Page 147: Cur So Unix

Manual de Unix

$ ls ~nancy bailarina.jpg dead.letter mbox nuevocarri hola men pagclase mail nancy pag.html$

8.3.2 Sustitución de parámetros.

Un parámetro es una entidad que puede tomar un valor. Los dos tipos de parámetros usados aquí son los parámetros con nombre, tales como HOME o IFS y los parámetros posiciónales como 1, 2 ó 3.

La sustitución paramétrica se da cuando el shell reemplaza en una línea de comandos a los parámetros que encuentra en ella con sus valores, por ejemplo, cambia :

echo $HOME

por

echo /users/ptc/kyo

Y entonces, después de la sustitución paramétrica, la línea es ejecutada. El comando echo no lee $HOME, es el shell el que hace la sustitución. Como se vio en el ejemplo anterior, se puede accesar al contenido de un parámetro con nombre anteponiéndole el signo “$”, donde este símbolo especifica la sustitución del valor del parámetro.

Otro ejemplo es este:

$x=1$echo $x1$

Los parámetros posiciónales se pasan a un comando o a un shell script con el comando set. Los parámetros posiciónales siguen al comando o al shell en la línea de comandos. Entonces a cada uno de los argumentos separados con un espacio se le da un nombre de parámetro posicional 0, 1, 2, 3, etc. Estos números corresponden directamente a los argumentos dados en la línea de comando: 0 es número asociado al comando o script a ejecutar, 1 el número del primer argumento y así sucesivamente. El siguiente ejemplo aclarará el uso de este tipo de parámetros:

14

Page 148: Cur So Unix

Manual de Unix

$ function print_args>{>typeset -i x=0 #inic. x=0;declara a x como entero>while [ x -le $# ] # -le es “menor o igual que”>do> echo "El parametro posicional $x es: $(eval echo \$$x)"> let x=x+1>done>}$ print_args uno dos tresEl parametro posicional 0 es: print_argsEl parametro posicional 1 es: unoEl parametro posicional 2 es: dosEl parametro posicional 3 es: tres$

El comando set puede usarse para definir los parámetros posiciónales para el shell, como en el siguiente ejemplo:

$ set -- primero segundo tercero $ echo $1 $2 $3primero segundo tercero$

Lo anterior define al parámetro posicional 1 como primero, al parámetro posicional 2 como segundo y al parámetro posicional 3 como tercero.

8.3.3 Convenciones para la sustitución paramétrica.

Un adecuado uso de la sustitución paramétrica se da cuando se siguen las siguientes reglas:

${parámetro} Las llaves se requieren cuando un parámetro es seguido por una letra, dígito o subguión que no se quiere que sea interpretado como parte del nombre del parámetro, por ejemplo: ls /tmp/${file}_txt

${parámetro:-palabra}

Si “parámetro” está definido y no es nulo, su valor se sustituye, de otro modo, se sustituye “palabra”. Por ejemplo: $unset x$echo ${x:-”x esta vacía”}x está vacía$

14

Page 149: Cur So Unix

Manual de Unix

${parámetro:=palabra}

Si “parámetro no esta definido o es nulo, su valor será el valor de “palabra”

${parámetro:?palabra

Si “parámetro” está definido y no es nulo, se sustituye por su valor; de otro modo, se imprime “palabra” y se sale del shell. Si se omite “palabra”, se imprime un mensaje por default.

${parámetro:+palabra}

Si “parámetro está definido y no es nulo, se sustituye “palabra”, de otro modo no se sustituye algo.

${parámetro#patrón}${parámetro##patrón}

Si el “patrón” del shell coincide con el comienzo del “parámetro”, se sustituye el valor de parámetro con el “patrón” coincidente; de otra manera, se conserva el valor del “parámetro”. Por ejemplo:

$prog=/users/ptc/kyo/text$nombre_base=${prog##*/}$echo nombre_basetext$

En la primer forma el patrón coincidente más pequeño se borra, en la segunda el más largo.

${parámetro%patrón}${parámetro%%patrón}

Si el patrón del Shell coincide con el final del valor del parámetro, entonces el valor del parámetro se sustituye con la parte que no coincide del patrón:

$prog=/users/ptc/kyo/text$prefijo=${prog%/*}$echo $prefijo/users/ptc/kyo$

Para los casos en que la sustitución lleva “:”, si se omiten éstos, no se checa si el parámetro es nulo.

8.3.4 Parámetros especiales.

$@ o $* Si el parámetro es “*” o “@”, entonces todos los parámetros posiciónales , empezando con $1, son sustituidos:

$comando arg1 arg2 arg3...$echo $@arg1 arg2 arg3

14

Page 150: Cur So Unix

Manual de Unix

$${arreglo[*]} Si el parámetro describe un arreglo de elementos * o

@, entonces se sustituye el valor de cada uno de los elementos.

${#parámetro} El “#” especifica que se sustituirá el número de caracteres en el parámetro. Si el parámetro es “*” se sustituye el número de parámetros posiciónales en la línea de comandos.

${#arreglo[*]} Con esto se sustituye el número de elementos que contiene el arreglo.

8.3.5 Sustitución de comandos.

Este método utiliza la salida de un comando para reemplazarla en la ejecución de ese comando. La sintaxis para la sustitución de comandos es $(comando). Por ejemplo:

$echo "Usuarios en sesion:\n$(who)"Usuarios en sesion:luisg ttyrc Jun 24 14:26root console Jun 24 12:51sergio pty/ttys0 Jun 24 13:41kyo pty/ttys4 Jun 24 13:46$

Otra forma para ejecutar esto es así ‘comando‘, sintaxis reconocida para Korn y Bourne Shell.

15

Page 151: Cur So Unix

Manual de Unix

8.4 PROGRAMACIÓN EN KORN SHELL

8.4.1 Creación y ejecución de Shell Scripts.

Los Shell Scripts son líneas de comandos que se ejecutan en un grupo. Un shell script puede ser una simple línea de comandos:

$who;date;time

Los archivos .profile y .kshrc son ejemplos de un shell script.

Para crear uno, se necesita un editor como el vi. Después de ser creado el archivo, esté contiene las líneas de comando listas para ejecutarse. Para hacer a un archivo ejecutable se le deben cambiar sus permisos, por ejemplo:

$chmod +x nom_arch

Después de hacer esto, sólo se necesita escribir el nombre del archivo para que se ejecute y se obtenga la salida deseada.

Para el mejor entendimiento de un shell script se cuenta con la posibilidad de poner comentarios en él. Esto se logra anteponiendo a cualquier texto el caracter “#”. Por ejemplo:

#Este shell script imprime todos los archivos ejecutables for y in $(ls) #todos los archivos del directorio actual ...

8.4.2 Entrada y salida de datos.

Programar requiere inevitablemente la entrada y salida de datos. Korn Shell cuenta con los comandos echo y print para la salida y el comando read y la sustitución posicional paramétrica para la entrada.

15

Page 152: Cur So Unix

Manual de Unix

Hay muchas maneras de pasar datos a un shell script, una es dando argumentos al programa a través de parámetros posiciónales; otra es utilizando el comando read. Una tercer forma es que el script lea de la stderr o de algún archivo nombrado.

15

Page 153: Cur So Unix

Manual de Unix

8.4.2.1 El comando read.

El comando read posee la capacidad de leer la entrada durante la ejecución de un script. Su sintaxis es:

read [-prsu[n]][nombre?prompt][nombre...]

En cada caso el comando lee una línea y pone a cada palabra separada con un espacio en blanco en un nombre. El resto de la línea va en el último nombre. Si los nombres no se especifican, la línea se lee en la variable de Shell REPLY.

Las definiciones de las opciones son estas:

-p lee de la salida de un proceso.

-r No interpreta a “\” como continuación de línea al final de ella.

-s Pone la línea de entrada en el archivo de historia.

-u[n] Lee la salida del descriptor de archivo n.

Este es un ejemplo de un script utilizando read:

#hola.kshread nombre?”¿Cómo te llamas?”echo “Hola, $nombre, bienvenido a Korn Shell.”

En este script el nombre del usuario se pide a través de un prompt que es la pregunta y se almacena en la variable nombre. Al ejecutarlo se obtendría algo así:

$ hola.ksh Como te llamas?JoelHola, Joel, bienvenido a Korn Shell.

El comando read puede leer y almacenar muchos valores a la vez:

read campo1 campo2 todo

Esta línea lee el primer nombre separado con un espacio de la línea de entrada y lo guarda en campo1, el segundo en campo2 y el resto en todo.

15

Page 154: Cur So Unix

Manual de Unix

8.4.2.2 impresión de datos.

Algunas veces es necesario dar como salida de un script en la pantalla a algunos comentarios o datos, como los resultados del script y encabezados que describan la salida. El shell tiene dos mecanismos para hacer esto: el comando echo y el comando print.

El comando echo imprime sus argumentos en la salida estándar. Estos argumentos son separados por espacios. Su sintaxis es:

echo [argumentos]

El siguiente ejemplo aclarará los usos para este comando:

$var="var es una variable" $ echo $varvar es una variable$ echo "El contenido de var es: $var"El contenido de var es: var es una variable$ echo 'var es $var'var es $var

La primera parte del ejemplo muestra como se puede ver el contenido o valor de una variable anteponiéndole simplemente el carácter “$”. En la segunda línea se ve como se pueden combinar la impresión de texto con la de contenidos de variables. En la tercera parte se usan comillas sencillas para imprimir exactamente lo que se tiene entre ellas.

El comando echo se puede combinar con el caracter de escape “\c” y con el comando read para obtener una entrada de datos:

${ > echo " Como te llamas? \c"> read nombre> echo "Hola, $nombre"> } Como te llamas? JoelHola, Joel$

Algunos caracteres se pueden usar par imprimir cadenas con formato. Estos son llamados secuencias de escape. Éstas son:

15

Page 155: Cur So Unix

Manual de Unix

Caracter de escape Resultado\b backspace\c esperar al final de la línea\f salto de línea\n salto de línea\t tabulador\v tabulador vertical\\ antidiagonal

La otra herramienta para impresión de resultados es print. La sintaxis para este comando es así:

print [-Rnprsu[n]][arg...]

Las opciones que maneja este comando son:

-R ignora las secuencias de escape del comando echo excepto \n

-n no añade nueva línea a la salida

-p ¿?

-r ignora todas las secuencias de escape del echo

-s guarda los argumentos en el archivo de historia

-u[n] escribe en el archivo descriptor n

Por ejemplo la línea:

$print -s “# Fin del día. $(date)”

Pone el comentario : “Fin del dia” seguido por la fecha actual en el archivo de historia.

8.4.3 Sentencias condicionales.

8.4.3.1 El comando test.

Este comando evalúa la expresión dada, si la expresión s evalúa verdadera, se regresa cero. Si la expresión se evalúa falsa, se regresa un valor distinto de cero. La sintaxis de este comando es:

15

Page 156: Cur So Unix

Manual de Unix

test expro[expr]

Algunas formas para usarse son estas:

L arch regresa cero si arch es una liga simbólica

arch1 -nt arch2 regresa cero si arch1 es mas nuevo que arch2

arch1 -ot arch2 regresa cero si arch1 es mas viejo que arch2

arch1 -ef arch2 cero si ambos archivos son referidos al mismo archivo físico.

Este comando se puede usar con combinaciones de los operadores and &&, or ||, y el operador negación !.

8.4.3.2 La sentencia if.

Esta sentencia permite ejecutar uno o más comandos, si una cierta condición se cumple. La sintaxis para esta sentencia es:

if [ condición ]then instrucción1else instrucción2fi

Esta sentencia verifica que la condición sea verdadera (que regrese cero) para ejecutar la instrucción1 sino se ejecuta la instrucción2. Por ejemplo:

$ x=hola $ if [ $x == hola ]> then echo Bienvenido> else echo Adios> fiBienvenido$

15

Page 157: Cur So Unix

Manual de Unix

8.4.3.3 La sentencia case.

Esta sentencia permite checar condiciones fácilmente y entonces ejecutar una serie de comandos si la condición se evalúa verdadera. La sintaxis para esta sentencia es:

case cadena inpatrón1 [ | patrón2 ... ] ) lista de comandos1;;patrón2 [ | patrón3 ... ] ) lista de cimandos2;;...esac

La primer línea recibe una cadena, la se compara contra cada uno de los patrones para ver si coinciden. Si es así, la lista de comandos siguiente se ejecuta inmediatamente. Por ejemplo:

$case $i in> -d | -r ) rmdir $dir1; echo “directorio borrado” ;;> -o ) echo “opción -o” ;;> -* )echo “no es una opción válida”” ;;> esac

En este ejemplo case primero checa $i contra cada una de las opciones para ver si coinciden. Si $i coincide con -d o -r, el directorio se borra. Si coincide con -o o -*, se imprime un mensaje y por último, si la cadena no comienza con -, no se lleva a cabo ninguna acción.

8.4.3.4 La sentencia select.

Este comando imprime en la pantalla un conjunto de palabras precedido por un número. Después aparece el prompt “#?” pidiendo una selección la cual se guarda en la variable REPLY. Si el contenido de esa variable es un número de los que aparecen en la lista, el valor del parámetro ahora contiene el valor de la palabra correspondiente. Al seleccionar una de las palabras se ejecuta una lista de comandos . La sintaxis es:

select parámetro in palabrasdo líneas de comandosdone

El siguiente es un ejemplo de lo que se puede hacer con esta sentencia:

15

Page 158: Cur So Unix

Manual de Unix

select color in rojo verde azul salir > do> if [ $color = "salir" ]> then echo adios; break> else echo $color> fi> done1) rojo2) verde3) azul4) salir#? 1rojo#? 2verde#? 3azul#? 4adios$

Este menú seguirá apareciendo hasta que se teclee un valor no definido entre las palabras dedas en select o si se da una condición en la sentencia para salir.

8.4.3.5 Uso del loop for.

Este loop permite ejecutar una línea de comandos una vez para cada nuevo valor del parámetro especificado en la lista. La sintaxis es:

for parámetro [in lista]do línea de comandosdone

El siguiente es un ejemplo de como usar esta herramienta:

$for arch in $( ls ) > do> case $ls in>$ for arch in $( ls )> do> if [ -x $arch ]> then> echo "$arch es ejecutable"

15

Page 159: Cur So Unix

Manual de Unix

> fi

15

Page 160: Cur So Unix

Manual de Unix

> donecorreo.ksh es ejecutableimages es ejecutablemen es ejecutablevuefile es ejecutable$

8.4.3.6 Uso del loop while.

Este loop ejecuta las líneas de comandos que estén dentro de él mientras la condición que tiene se evalúe verdadera. La sintaxis es:

while [ condición ]do líneas de comandosdone

Este ejemplo aclarará su uso:

x=0 $ while [ $x != 3 ]> do> let x=x+1> echo " $x \c"> done 1 2 3 $

8.4.3.7 Uso del loop until.

Este loop tiene el mismo uso que el while, usando su misma sintaxis, sólo que éste ejecuta las sentencias declaradas en él mientras la condición sea falsa:

$x=0 $ until [ $x = 1 ]> do> let x=x+1> echo $x> done1

16

Page 161: Cur So Unix

Manual de Unix

8.4.3.8 La sentencia break.

Este comando sirve para salir del último loop creado, for, while, until o select. Su sintaxis es:

break [n]

Si se especifica el número n, se sale de los n loops anidados. Este es un ejemplo del uso de esta sentencia:

select color in rojo verde azul salir > do> if [ $color = "salir" ]> then echo adios; break> else echo $color> fi> done1) rojo2) verde3) azul4) salir#? 4$

8.4.3.9 La sentencia continue.

Este comando se salta cualquier línea que siga en un loop for, until, while o select hasta la próxima iteración. La sintaxis es:

continue [n]

Si se especifica n, entonces la ejecución del loop se hace hasta la enésima iteración siguiente. Por ejemplo:

$for file in $( ls ) > do> if [ -x $file ]> then continue> echo $file es ejecutable> fi> echo $file no es ejecutable> donebuscar no es ejecutablekyo.grep no es ejecutablenptc no es ejecutable$

16

Page 162: Cur So Unix

Manual de Unix

En el ejercicio se tienen cuatro archivos y el segundo es ejecutable, si se hubiera tenido otro archivo que fuera ejecutable, se hubiera impreso el nombre del archivo y que es ejecutable.

8.4.3.10 Evaluación aritmética usando let.

let es un comando que le permite al shell script usar expresiones aritméticas. Este permite aritmética con enteros largos. La sintaxis es:

let expresión_aritmética

En la siguiente tabla se muestra el orden de precedencia de signos que usa let:

Operador Descripción- menos unario! negación lógica

* / % multiplicación, división y residuo+ - suma y resta

<= >= < > comparación== != igualdad y desigualdad

= asignación

Ejemplos del uso de let:

$ x=1$$ let x=1$ x=1$$ let x=x+1OR$ x=1$$ let x=x+1*6-3/1$ echo $x4$

El uso de paréntesis se puede usar para romper la jerarquía de los operadores. Si se usan paréntesis entonces se deben usar comillas que encierren a la expresión para evaluarla:

16

Page 163: Cur So Unix

Manual de Unix

$ x=1$ let "x=(x+1)*(6-3)/1"$ echo $x6$

Como se puede ver en estos ejemplos, al usar let no es necesario anteponer el “$” a las variables.

8.4.3.11 Uso de arreglos.

Los arreglos son colecciones de elementos contiguos que pueden ser accesados por un subíndice. La sintaxis para la declaración de un arreglo es la siguiente:

array[subíndice]=valor

Por ejemplo:

$ array[0]=cero$ array[1]=uno$ array[2]=dos$ echo ${array[*]}cero uno dos$

8.4.3.12 Creación de funciones.

El comando function sirve para programar por módulos. La sintaxis para programar así es:

function nombre_función { shell script }

o

nombre_función () { shell script }

Ejemplo:

16

Page 164: Cur So Unix

Manual de Unix

$ function exef > {> if [ -x $1 ]> then> echo "$1 es ejecutable"> fi> }

Lo que hace esta función es tomar el nombre de archivo dado y verificar si es ejecutable, si la prueba es verdadera se imprime que es ejecutable

Para poder llamar a una función se escribe el nombre de dicha función y los argumentos que ella necesite para procesarlos:

$ exef mail.kshmail.ksh es ejecutable$

En un programa más grande la llamada a la función sería así:

function exef {if [ -x $1 ]then echo "$1 es ejecutable"fi}for file in $( ls )doexef $filedone

Las funciones en Korn Shell permiten regresar un valor para tener conocimiento de su estado de salida . La sintaxis para lograrlo es esta:

return [n]

n nos especifica si el valor que la función regresa es el valor que regresa el último comando ejecutado en la función. Por ejemplo:

16

Page 165: Cur So Unix

Manual de Unix

$ fact ()> {> integer x> if (( $1 <= 2 ))> then> echo $1> else> ((x=$1 -1))> let x=$(fact $x)> ((x=x*$1))> echo $x> fi> }$ fact 11$ fact 36$

16

Page 166: Cur So Unix

Manual de Unix

8.5 PROGRAMACIÓN EN BOURNE SHELL

La introducción para los shells ya se dió, así que para esté y los siguientes sólo se darán sus equivalencias en cuanto a sentencias y comandos útiles para la programación.

La única diferencia en cuanto a sustitución de comandos entre Bourne y Korn Shell es que Bourne sólo acepta la sustitución de comandos usando el acento grave “ ’ “, de esta manera:

‘comando‘

Recordemos que para Korn Shell la susutitución es $( comando ). La primer forma es válida tanto para Bourne como para Korn Shell, mientras que la segunda lo es sólo para Korn Shell.

8.5.1 La sentencia if.

La sintaxis para esta sentencia es:

if condición (o lista de comandos)then lista_de_comandos1elif lista_de_comandos2then lista_de_comandos3...else lista_de_comandosnfi

En esta estructura “elif” significa “else if” . Veamos un ejemplo para clarificar esta sentencia:

# shell par verificar si sampras o kyo están en sesiónif who | grep kyo >> buscarthenecho "Joel esta en sesion"elif who | grep sampras >> buscarthenecho "Manuel esta en sesion"elseecho "Ni Joel ni Manuel estan en sesion"fi$ buscar.shJoel esta en sesion

16

Page 167: Cur So Unix

Manual de Unix

$

16

Page 168: Cur So Unix

Manual de Unix

8.5.2 El comando test.

El comando test se usa frecuentemente dentro de la estructura if para probar condiciones tales como igualdades. Los siguientes ejemplos aclararán su uso:

dir1=/usr/binif test $dir1 == /usr/binthen echo “directorio encontrado”fi

En este ejemplo test se usa para comparar si el contenido de un variable es igual a una cadena.

if test $# -eq 0then echo “No hay parámetros”fi

En este ejemplo el if verifica si se le pasaron parámetros al script si no es así que despliegue un mensaje de error.

8.5.3 El comando read.

Este comando sirve para la lectura de parámetros durante la ejecución de un shell script, su sintaxis es así:

read [parámetro...]

8.5.4 El comando exit.

Un comando regresa al sistema un valor de estado cuando este se ejecuta. El comando exit permite que un shell script regrese un valor de estado cuando este termina de ejecutarse. Los estados de salida son :

16

Page 169: Cur So Unix

Manual de Unix

Valor de salida Descripción

0 Se ejecutó bien

1Error en la estructura del comando

2 Error de sintaxis

3Se recibió una señal que no es atrapada

8.5.5 Comentarios.

El caracter que sirve para agregar comentarios a un script es el #, todos los caracteres que le sigan no se interpretarán para ser ejecutados por el script.

8.5.6 El loop for.

La sintaxis para for es la misma que la que se vió anteriormente en ksh. Este ejemplo muestra otro uso para for:

for ido sort $i > /textos/${i}.srtdone

Cuando no se especifica la cláusula in , se toman como lista a los parámetros que se den al shell. En este caso, si los parámetros son nombres de archivo, estos se copiarán al directorio /textos ya ordenados.

8.5.7 Los loops while y until.

La sintaxis para estas dos herramientas de programación es igual que en Korn Shell. Sólo daremos ejemplos:

16

Page 170: Cur So Unix

Manual de Unix

x=1while [ x <= $# ]do cat $1 >> mezcla x=x+1done

Este ejemplo ilustra el uso del loop while, que en este caso añade los archivos que se dan como parámetro a otro archivo. La ejecución se detiene cuando se terminan los archivos. El loop until se ejecuta igual que el while con la diferencia de que se hace el ciclo hasta que la condición sea verdadera.

8.5.8 La sentencia case.

La sintaxis y el uso de esta sentencia es exactamente la misma que la que se vió en Korn Shell.

8.5.9 El comando dot (.).

Cuando se ejecuta un shell script, este lo hace en un subshell, así que si en el programa se definen variables sus valores son legítimos sólo mientras el programa se ejecuta. Para poder dejar los valores de las variables en el shell actual, se cuenta con el comando dot. Su sintaxis es :

. shell_script

Veamos un ejemplo de su uso. Cree un archivo con las siguientes líneas:

echo $dogdog=bullecho $dog

Después hay definamos la variable dog así:

dog=rover

Ahora ejecutemos el script. La salida debió ser esta:

17

Page 171: Cur So Unix

Manual de Unix

roverbull

Al checar el valor de dog este es:

$echo $dogrover$

Como se ve, el valor que aparece es el que se le dió en el shell donde se ejecutó el programa, no el que se le asignó dentro de él. Ahora, ejecutando el programa con el comando dot:

$ . dog.shroverbull$

Después probando el valor de dog:

$echo $dogbull$

El valor de la variable dog ha cambiado porque el script se ejecutó en el shell actual.

17

Page 172: Cur So Unix

Manual de Unix

8.6 PROGRAMACIÓN EN C SHELL

El ambiente que se crea cuando se usa C Shell es diferente al que se tiene cuando se trabaja con alguno de los otros shells. Esta diferencia se basa primordialmente en los comandos, en la forma de programar y en la manera de definir las variables de ambiente.

8.6.1 Variables de ambiente y de shell.

Existen dos clases de variables que pueden definirse en el shell. Las variables de ambiente que son globales a cualquier subshell o subproceso. Estas variables son escritas normalmente en mayúsculas. La segunda clase de estas variables es la de variables del shell, las cuales son conocidas sólo en el shell que se definieron. Estas variables son representadas normalmente en minúsculas.

A las variables de ambiente se les define con el comando setenv, mientras que a las de shell con el comando set. Sin embargo existen tres variables mas comúnmente usadas que son USER, TERM, y PATH, las que son modificadas automáticamente al definirse las variables de shell user, term y path, respectivamente. Por ejemplo, si se ejecuta la línea:

$set path=(/bin/posix /bin /usr/bin)$

El valor de la variable de ambiente PATH, también se modifica, ahora PATH tiene /bin/posix /bin /usr/bin.

Para verificar el ambiente actual del shell se ejecuta el comando set, sin argumentos, entonces aparecerá una lista similar a esta:

[4] %set argv ()autologout 60cwd /tmp_mnt/users/ptc/kyohome /users/ptc/kyoignoreeofnoclobberpath (/bin/posix /bin /usr/bin /usr/contrib/bin /usr/bin/X11 /users/local/bin /users/ptc/kyo/programs/ksh /users/ptc/kyo/programs/c /users/ptc/kyo/bin .)prompt [!] %shell /bin/csh

17

Page 173: Cur So Unix

Manual de Unix

status 0term vt100 [5] %

17

Page 174: Cur So Unix

Manual de Unix

En este ejemplo las variables ignoreeof y noclobber están activadas.

8.6.2 Sustitución de comandos.

Para hacer la sustitución de comandos en csh se utiliza el acento grave “‘“, de esta manera:

[43] % set pwd=‘pwd‘[44] % echo $pwd/users/ptc/kyo/textos[45] %

La sustitución de comandos también provee una manera de generar argumentos para otros comandos, por ejemplo:

[45] % ex ‘grep -l TRACE *.c‘

Esta línea corre el editor ex, supliendo como argumentos a todos aquellos archivos que tienen terminación .c y que contienen líneas que llevan la cadena TRACE.

8.6.3 Variables del shell.

C shell tiene un conjunto de variables que pueden ser definidas con ayuda del comando set. Algunas de estas variables son estas:

$argv. Esta variable contiene los argumentos de la línea de comando del shell ejecutado.

$autologout. Esta variable se usa para salir de sesión automáticamente si la terminal no se usa durante el tiempo especificado. Por ejemplo:

set autologout=60

terminará la sesión automáticamente si no se usa el sistema por un lapso de una hora. Para desactivar esta variable hay que igualarla con cero o teclear :

unset autologout

17

Page 175: Cur So Unix

Manual de Unix

$cwd. Esta variable contiene la ruta del directorio actual de trabajo, esta variable se cambia cuando se usa el comando cd.

$home. El contenido de esta variable es la ruta del directorio de trabajo de cada usuario. El valor por default de esta variable se toma del archivo /etc/passwd.

$cdpath. En esta variable se especifican los directorios alternativos en los que se buscará cuando se le den argumentos a los comandos pushd, cd y chdir.

noclober. Con este comando se evita la sobre escritura en un archivo al usar el comando cat o el redireccionamiento sobre ese archivo.

notify. Si esta variable está activada, el sistema avisa cuando un proceso en background ha terminado.

$path. Esta variable es una de las más importantes en la operación de C Shell. Esta variable contiene los directorios en los que se buscará cuando se deseé ejecutar un comando.

$prompt. Esta variable se utiliza para personalizar el prompt del shell. Por ejemplo:

% set prompt=“[\!] %”[1] % _

$status. Esta variable guarda el valor de cero si el último comando ejecutado se llevó a cabo con éxito y algún valor diferente de cero si ocurrió algún otro error.

8.6.4 Variables numéricas del shell.

El comando @ (arroba) asigna un valor a una variable numérica, así como el comando set asigna una cadena a una variable no numérica. Estos valores pueden ser valores enteros. Por ejemplo:

% @ sum=(1+4)% echo sum5% @ sum=(01 + 012)% echo $sum13%

8.6.5 Expresiones numéricas.

La sintaxis para evaluar una expresión aritmética es esta:

17

Page 176: Cur So Unix

Manual de Unix

@ variable = expresión

8.6.6 Evaluación de archivos.

Las expresiones que incluyen la evaluación de un archivo regresan un valor de 1 si esa evaluación es cierta, al contrario, se regresa un 0. La expresión para evaluar un archivo es esta:

-prueba Nom_arch

La opción prueba puede escogerse de entre la siguiente tabla:

Prueba significadod Verifica si el archivo es un directorioe Verifica si el archivo existef Verifica si el archivo es ordinarioo Verifica si el archivo le pertenece al usuarior Verifica si el archivo ha sido accesado para lectura por

el usuariow Verifica si el archivo ha sido accesado para lectura por

el usuarioz Verifica si el archivo está vacío.

8.6.7 Scripts en C Shell.

Un shell script puede ser ejecutado si se teclea el siguiente comando:

csh shell_script arg1 arg2 ...

A los argumentos que se le dan a un script en C Shell se guardan en el arreglo argv como argv[1], argv[2], etc. Si se desea ejecutar el script sin teclear el comando csh, entonces debe incluirse en la primer línea del programa esto:

#!/bin/csh

17

Page 177: Cur So Unix

Manual de Unix

8.6.8 Estructuras de control.

8.6.8.1 Comentarios.

Para escribir comentarios en un script si a ellos se les antepone el signo de libras “#”.

8.6.8.2 El comando foreach.

La sintaxis para esta sentencia es:

foreach variable_índicecomando1comando2...end

Los comandos que se tienen entre el foreach y el end se ejecutan para cada argumento de la variable índice. Dentro de este loop se pueden usar los comandos break y continue para detener y adelantar las ejecuciones en una iteración.

8.6.8.3 La sentencia if-then-endif.

Este comando tiene la siguiente sintaxis:

if ( expresión ) then comando1 comando2 ...else comandoA comandoB ...endif

17

Page 178: Cur So Unix

Manual de Unix

8.6.8.4 El loop while.

La estructura para esta sentencia es esta:

while ( expresión ) comando1 comando2 ...end

8.6.8.4 El comando switch.La estructura para este comando es esta:

switch ( word )case cadena1: comando1 comando2 ... breakswcase cadena2 comandoA comandoB ... breaksw...default comandoI comandoII ... breakswendsw

8.6.8.5 El comando goto.

C shell permite el manejo de etiquetas, su uso es como así:

etiqueta1:comando1comando2......goto etiqueta1

17

Page 179: Cur So Unix

Manual de Unix

17

Page 180: Cur So Unix

Manual de Unix

9.1 INTRODUCCIÓN

AWK es uno de esos programas-joya con que nos obsequia el mundo UNIX. Uno de los filtros más importantes, es un localizador de patrones de lenguaje de programación que examina un flujo de datos de entrada y compara cada línea con el conjunto de patrones especificados.

Conocido y apreciado por los usuarios mas avanzados y notablemente desconocido por el resto, es el lenguaje que, entre otras cosas, podría ahorrar mucho tiempo, dinero y esfuerzo de programación para gestión de pequeñas y medianas bases de datos, personales o de empresas. La palabra 'awk' se usa tanto para referirse a un lenguaje de manipulación de ficheros de datos como para referirse a su interprete.

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. Estos lo diseñaron e implementaron en 1977, en parte como un experimento para mostrar como las herramientas, de UNIX, grep y sed podían generalizarse para trabajar con números además de texto. En particular, los autores estaban interesados en expresiones regulares y editores programables.

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.

Aunque diseñado para escribir pequeños programas, pronto atrajo a gran número de programadores, quienes produjeron muchos programas extensos que pusieron de manifiesto las limitaciones de la implementación original. Por eso, en 1985 la versión original fue mejorada.

Dado que los SO tipo Unix acostumbran con mucha frecuencia a usar ficheros de configuración del sistema en formatos de texto perfectamente legibles y editables. En muchos otros casos un fichero de configuración será accedido de forma muy ocasional, y resulta más interesante usar un formato de texto sencillo.Por ejemplo hay ficheros de configuración que sólo se usan durante la carga de un programa. Algunos de estos programas suelen cargarse una sola vez mientras arranca el sistema y luego en condiciones normales permanecen arrancados todo el tiempo.

Se modificó el lenguaje AWK para poder procesar este tipo de ficheros de datos en formato de texto. Puede sustituir también con ventaja a programas shell que combinen filtros como grep, sed, join, cut, paste y otros, ya que los programas típicos de awk constan de una o dos líneas, y esto es suficiente para efectuar operaciones notablemente sofisticadas.

En su estado actual, awk es un lenguaje tremendamente versátil, que ha sido y es usado para administración de bases de datos, diseño de circuitos, análisis numérico, gráficos, diseño e implementación de compiladores, administración del sistema, lenguaje de entrada para no programadores y cursos de ingeniería de software.

18

Page 181: Cur So Unix

Manual de Unix

9.2 FORMA GENÉRICA DEL PROGRAMA AWK

Si se escribe en línea de comandos el programa va entre apostrofes (comillas) para protegerlo del shell en el que se ejecuta.

awk [-Fc] ['programa'] [variable=valor ] [archivo]

Si lo paso por programa es

awk [-f archivo_programa] archivo(s)

En donde:

archivo_programa : especifica el archivo fuente del programa a aplicar a archivo.

-Fc : especifica el carácter delimitador de campos. Por defecto se considera el espacio en blanco.

programa : especifica el conjunto de patrones e instrucciones a ejecutar con archivo. La diferencia con archivo_programa, es que en este caso hay que especificar los patrones e instrucciones en la línea de comandos. Para evitar interferencias con la shell deben ir encerradas entre comillas simples (').

variable=valor : se utiliza para establecer los valores que tomarán las variables que utilice el programa.

archivo : archivo que será procesado por awk. Si se especifica "-" se interpretará como la entrada estándar.

Cuando se da la orden desde la línea de comandos, no existirá ningún problema, amenos que la orden este mal dada. Es más recomendable que lo que se quiere ejecutar se realice en un script y posteriormente se corra, esto con el fin de poder corregir algún error más fácilmente. Cuando se hace un script, la forma de correr el programa es:

awk -f archivo_programa archivo(s)

sí el programa no necesita ningún archivo, entonces se omite esa parte. Sí se necesitan más de un archivo, se colocan todos los que se requieran.

18

Page 182: Cur So Unix

Manual de Unix

9.3 CAMPOS, VARIABLES Y OPERADORES

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 como cualquier otra variable.

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

En los programas de awk no es necesario declarar las variables, 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:

FS : Separador del campo de entrada. Se puede especificar con la opción -Fc en la línea de comandos

RS : Separador de registro de entrada

OFS : Separador del campo de salida.

ORS : Separador de registro de salida

NF : Número de campos en el registro actual

NR : Número de registros procesados hasta el momento. Al final del programa se podrá conocer el número e registros tratados.

RSTART : Posición de la cadena en la que se verifica el patrón utilizado, comenzando desde 1. Es equivalente al valor retornado por la función match.

RLENGTH : Longitud de la cadena en la que se verifica el patrón utilizado.

SUBSEP : Separador de cadenas en arrays multidimensionales. El valor por defecto es " 34".

En 'awk' podemos usar toda clase de expresiones presentes en cualquier lenguaje. Cualquier identificador que no corresponda con una palabra reservada se asumirá que es una variable. Para asignar un valor se usa el operador '='.

Existen operadores aritméticos y lógicos que se pueden utilizar en AWK, son los siguietes:

Operadores aritméticos

+ Suma

18

Page 183: Cur So Unix

Manual de Unix

- Resta

* Multiplicación

/ División

% Módulo (resto)

^ Potenciación

Operadores lógicos

var = expr Asignación

var ++ Incrementa la variable en una unidad

var -- Decrementa la variable en una unidad

var += expr_aritm Incrementa la variable en cierta cantidad

var -= expr_aritm Decrementa la variable en cierta cantidad

var *= expr_aritm Multiplica la variable por cierta cantidad

var /= expr_aritm Divide la variable por cierta cantidad

var %= expr_aritm Guarda en la variable el resto de su división por cierta cantidad

var ^= expr_aritm Eleva el valor de la variable en cierta cantidad

18

Page 184: Cur So Unix

Manual de Unix

9.4 AWK COMO LENGUAJE DE PROGRAMACIÓN

Algunos ejemplos desde la línea de comandos, para empezar a conocer a awk y su forma de trabajar. Un ejemplo para utilizar a awk:

$ awk ‘{print $0}’ mundo

con este comando obtendremos de salida la impresión del archivo mundo. Otro ejemplo es el siguiente:

$ awk ' $3 > 0 { print $1, $2*$3} ' datos.emp

el patrón lo satisfacen aquellas líneas cuyo tercer campo es mayor que cero, y la acción consiste en imprimir el primer campo y el producto del segundo por el tercero. Un ejemplo donde se utiliza un entubamiento para el comando awk es el siguiente:

$ ls –l | awk ‘/^d/ {print $9}’

en esté ejemplo, primero se realiza un comando, el listado del directorio, y la salida se manda al comando awk, donde esté busca los archivos que empiezan con d, y de estos va a imprimir en pantalla el campo 9.

9.4.1 Bloques BEGIN y END

Un archivo programa “awk” puede tener tres secciones distintas.

Puede incluir una primera parte para que se ejecute antes de procesar alguna de las líneas de entrada. Se usa para ello la palabra reservada BEGIN seguida de una o mas instrucciones todas ellas englobadas dentro de un par de corchetes. “{“ , “}”.

Puede incluir una parte central donde se procesará entera para cada línea de entrada de datos y que puede tener varios bloques “{“ , “}”. Si uno de estos bloques contiene una expresión regular se procesará solo cuando la línea de entrada se ajuste al patrón de la expresión regular. Es importante que comprenda que esta parte se ejecutará tantas veces como líneas de datos existan.

18

Page 185: Cur So Unix

Manual de Unix

Puede incluir una parte final que se procesará en último lugar una vez termine la lectura y procesado de todas las líneas de entrada. Se usa para ello la palabra reservada END seguida de una o más instrucciones todas ellas englobadas dentro de un par de corchetes. “{“ , “}”.

9.4.2.- Control de flujo.

Dada una pareja patron-accion, las estructuras de control de flujo que proporciona awk son exclusivas de la parte `accion'.

9.4.2.1.- if-else

La sintaxis de esta instrucción es:

if (expresion) {instrucciones}else {instrucciones}

Por ejemplo, para encontrar la media del dinero ganado por aquellos empleados que han trabajado mas de treinta horas:

BEGIN {n=0pagado=0}$3 > 30 { n=n+1; pagado=pagado+$2*$3}END {if (n>0) {print "numero de empleados: ", nprint "se pago de media : ", pagado/n}elseprint "ningun empleado trabajo mas de treinta horas."}

18

Page 186: Cur So Unix

Manual de Unix

9.4.2.2.- while

La sintaxis de while es:

while (expresion){instrucciones}

Por ejemplo, para calcular el capital acumulado dada una cierta cantidad inicial que renta unos interés anuales:

# capital=capital_inicial*(1+interes)^años{i=1while (i<=$3){printf "%.2f0 , $1*(1+$2)^Ii=i+1}}

Se ha introducido un comentario, señalado mediante ‘#’.

9.4.2.3.- for

La sintaxis de for es igual a la de C, y condensa en una sola línea la inicialización de la variable de control del bucle, el test y el incremento de dicha variable. Por ejemplo, el programa con el que se ilustró el bucle while puede rescribirse como:

{for(i=1;i<=$3;i=i+1){printf "%.2f0,$1*(1+$2)^I}}

18

Page 187: Cur So Unix

Manual de Unix

9.4.2.4. Otras funciones

Además de las funciones que se mencionan arriba, existen otras funciones con las que cuenta AWK, las funciones son:

break .- Se usa para salir del ciclo y ponerse en la instruccion siguiente

continue .- vuelve al principio del ciclo (ignorando lo que quede por cumplir de ese ciclo).

print .- sirve para imprimir en pantalla.

print [lista de expesiones] [> expresion]

lista de expresiones

nombre de variables o entre comillas el texto que queremos que se imprima

expresion

direccionamiento a un archivo >> adicionar

printf .- para imprimir en pantalla.

La sintaxis es como C

printf(formato, lista de expresiones, ... [>expresion])

Especificación de formato de datos para 'printf'

%c Carácter ASCII

%d Entero representado en decimal

%e Coma flotante (exponente = e[+-]dd)

%E Coma flotante (exponente = E[+-]dd)

%f Coma flotante sin exponente

%g Equivale al más corto de los formatos 'e' o 'f'

%G Equivale al más corto de los formatos 'E' o 'F'

%o Entero representado en octal

%s Cadena de caracteres

%x Entero representado en hexadecimal con minúsculas

%X Entero representado en hexadecimal con mayúsculas

%% Carácter '%'

18

Page 188: Cur So Unix

Manual de Unix

next .- saltea los patrones restantes

exit.- sale de todo el programa de ese archivo

sprintf.- igual a printf pero escribe en la variable de tipo string

log.- devuelve logaritmo decimal de lo que sigue

sqrt .-calcula la raíz cuadrada de lo que sigue

exp .- calcula la potencia

length .- devuelve un numero de la cantidad de caracteres de la línea en la que me encuentro

int .- devuelve la parte entera por defecto de un numero real o racional

substr(s,m,n).- devuelve sub cadena de s sacada desde m hasta n

9.4.3 Funciones incorporadas en el sistema

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

18

Page 189: Cur So Unix

Manual de Unix

rand() Devuelve un número aleatorio comprendido entre 0 y 1

match(s,r) Devuelve la posición de s en donde ocurre r, comenzando desde 1. Si no existe devuelve 0.

substr(s,m,n) Devuelve la subcadena de s que comienza en la posición m y finaliza en la n.

sub(r,t,s) Sustituye t por la primera ocurrencia de r en la cadena s. Si no se especifica s se tomará todo el registro ($0).

g(sub(r,t,s) Igual que sub, pero sustituyendo todas las ocurrencias.

split(s,array,sep) Divide la cadena s en array[1],...,array[n]. Se devuelve el número de elementos. Si no se especifica el separador en sep se utilizará el valor de FS. s puede ser una variable.

index(s1,s2) Devuelve la posición de la cadena s1 en donde se encuentra la cadena s2. En caso de no encontrarse se devuelve 0.

sprintf(f,e1,e2,...) Devuelve la cadena resultante de imprimir los valores e1, e2, ... con el formato especificado en f.

toupper(s) Devuelve la cadena s convertida a mayúsculas.

tolower(s) Devuelve la cadena s convertida a minúsculas.

system(cmd) Ejecuta el comando UNIX cmd especificado y retorna el estado de salida de este.

print e1, e2, ... Presenta en la salida los valores e1, e2, ...

printf f, e1, e2, ... Presenta en la salida los valores e1, e2, ... con el formato especificado por f.

close(f) Cierra el archivo o pipe abierto con print, printf o getline.

getline X Lee el siguiente registro de la entrada y se lo asigna a X, si no se especifica X se asignará a $0.

18

Page 190: Cur So Unix

Manual de Unix

9.4.4.- Arrays

Uno de los aspectos más agradables de awk es la forma de trabajar con arrays. Al igual que para los números y las cadenas, no es preciso declararlos, y el interprete se encarga de todo lo relacionado con el almacenamiento. El siguiente programa usa un array llamado `lineas' para guardar un archivo completo y luego imprimirlo en orden inverso:

{linea[NR]=$0 # almacena cada linea}END {for(i=NR;i>0;i=i-1){print linea[i]}}

19

Page 191: Cur So Unix

Manual de Unix

19

Page 192: Cur So Unix

Manual de Unix

10.1 COMANDO TAR (respaldo)

Descripción: tar es una aplicación de unix que permite colocar varios archivos en uno solo, o en un diskette, cinta, etc. Tar se puede utilizar de forma remota o de forma local. Al colocar varios archivos, se crea una copia del archivo original, por tanto se crea un respaldo.

La forma de utilizar lo es la siguiente:

tar acción [opciones] archivos-origen archivo-destino

Opciones:

acción Acción que se quiere realizar, se tienen las siguientes posibles acciones:

c Crea un nuevo archivo .tar

r Copia los archivos al final del archivo tar indicado (concatena).

t Muestra la tabla de contenidos del archivo de cinta especificado.

U Actualiza el archivo Lar con los especificados, los nuevos los pone al final del archivo y los que ya están sólo se sustituyen si han sido modificados o actuali-zados.

x Extrae del archivo Lar los archivos indicados.

F Especifica el nombre del archivo destino del archivo Lar que sc va a crear. Puede ser un archivo normal o un archivo especial de dispositivo como una cinta.

v Muestra el nombre de los archivos conforme se van procesando

w Modo interactivo hace que Lar pregunte antes de realizar cualquier accion.

F archivo Se especifican los archivos a procesar en el archivo de texto archivo.

Z Pasa el archivo de cinta por el comando gzip antes que por tar, en el caso de extraer, para descomprimir el archivo Lar previamente comprimido con gzip. Para la creación, después de procesar con Lar pasa el resultado por gzip para comprimir Generalmente estos archivos toman la extensión .tgz

archivos Lista de archivos que se van a procesar m, pueden ser directorios que se procesarán recursivamente.

19

Page 193: Cur So Unix

Manual de Unix

Ejemplos:

Si utilizamos la siguente instrucción en la línea de comandos.

$cd$ tar cvf respaldo.tar *$

con estos dos comandos, se crear el archivo respaldo.tar, esté contendrá todos nuestros archivos. Como el tar coloca varios archivos en uno solo, se dice que los encapsula. Para poder ver los archivos que contiene respaldo.tar, se tiene que desencapsular el archivo, se utiliza las siguientes opciónes de tar.

$tar zxvf respaldo.tar$

En el directorio que estemos se creara un directorio llamado igual que el archivo, en este caso se llamara respaldo. Adentro de este directorio estarán todos los archivos, mantiene la estructura de directorios original que colocamos dentro del archivo tar.

19

Page 194: Cur So Unix

Manual de Unix

10.2 COMANDO GZIP (GNU zip)

Descripción: es un programa popular de compresión de datos escrito por Jean-Loup Gailly, para el proyecto GNU.

La forma de utilizar el gzip, es la siguiente:

gzip [opciones] archivos

Opciones:

-c Comprime pero dejando intactas los archivos originales, así tendremos tanto la copia comprimida como la original.

-d Descomprime.

-f Fuerza la compresión sin preguntar antes de borrar o sobrescribir.

-l lista los siguientes campos, de un fichero comprimido.

compressed Tamaño del fichero comprimido.

uncompr Tamaño del fichero descomprimido.

ratio Relación de compresión (0.0% si no se conoce).

uncompressed_name Nombre del fichero descomprimido.

-q Suprime los avisos por errores.

-r Recorre la estructura de directorios recursivamente. Si algún archivo de los facilitados es un directorio con esta opción lo recorre recursivamente comprimiendo todos sus archivos.

-t Comprueba la integridad del fichero comprimido.

archivos Lista de archivos a procesar, se permiten los caracteres comodín.

Ejemplos:

$gzip *$

Comprime todos los archivos del directorio actual.

19

Page 195: Cur So Unix

Manual de Unix

$gzip -d documento.gz$

Descomprime el archivo documento.gz dejándolo en su estado original

$gzíp –r /tmp$

Comprime todos los archivos del directorio /tmp.

Se puede utilizar el comando gzip en un archivo en capsulado, como se muestra continuación:

$ cd$ tar cvf respaldo.tar *$ gzip respaldo.tar$

Para desencampusular y des comprimir se utilizan los siguientes comandos:

$ gzip -d respaldo.tar.gz$ tar zxvf respaldo.tar$

Cuando se desea llevar la información, en al gun dispositivo de almacenamiento, de un lugar a otro es recomendable utilizar el encapsulado y el comprimido en el orden que se muestra en el ejemplo, ya que al desencapsular y dercomprimir se mantiene la jerarquia.

Se puede utilizar primero el gzip y después el tar, cuando se hace la encapsulación y se comprime no importa el ordén. Cuando se quiere hacer el proceso inverso, si importa el ordén, primero canselamos lo ultimo que hicimos, en caso contrario mandara un mensaje de error.

19

Page 196: Cur So Unix

Manual de Unix

10.3 ACCESO A LA RED CON TELNET

El comando telnet es la herramienta básica para conexiones remota. Con telnet podrá mantener sesiones como un terminal de la computadora remota, ejecutando comandos como si estuviera conectado localmente.

Para conectarse a una computadora vía telnet, debe disponer de un nombre de usuario y de una contraseña válida para la computadora remota. Aunque algunos sistemas proporcionan funciones de conexión para invitados, esto no es muy corriente por razones de seguridad. Cuando se permiten conexiones de invitados, éstas casi siempre colocan al usuario en un shell o sistema de menú sujeto a restricciones.

Un shell restringido impide que el usuario pueda ejecutar determinados comandos y un sistema de menú sólo permite seleccionar entre un conjunto previamente determinado de menús, bloqueando completamente el acceso al shell.

Una desventaja es que debe trabajar en un entorno basado en terminal, puesto que telnet sólo proporciona emulación de terminal para terminales corrientes como, por ejemplo, el VT-100 de DEC, que no soporta entornos gráficos.

El telnet es poco recomendado, debido a que la información que viaja de la maquina donde nos encontramos a la maquina donde estamos trabajando se tranfiere como la colocamos. Esto provoca muy poca seguridad a la hora de transferir información o recivirla.

La forma de utilizar telnet es la siguiente:

$ telnet cronos.fi-b.unam.mx

19

Page 197: Cur So Unix

Manual de Unix

10.4 FTP (protocolo de tranferencia de archivos)

Para utilizar los archivos de transferencia FTP, deberá disponer de un nombre de usuario y contraseña válidos para la computadora remota. Esta combinación de nombre de usuario y contraseña se utiliza para validar su sesión y determinar el tipo de acceso que tiene para transferir los distintos archivos. Además, es obvio que deberá conocer el nombre de la computadora con la que desea mantener una sesión FTP.

Para abrir una conexión se utiliza:

$ ftpftp> open cronosunam.mx

También se puede abrir una conexión de está forma:

$ ftp cronos.fi-b.unam.mxftp>

Para cerrar la conexión:

ftp> close

Un ejemplo de cómo sería una sesión con ftp es el siguiente:

$ ftpftp> open cronos.fi-b.unam.mxConnected to cronos.fi-b.unam.mx.220 cronos FTP server (Version 1.7.193.3 Thu Jul 22 18:32:22 GMT 1993) ready.500 'AUTH GSSAPI': command not understood.500 'AUTH KERBEROS_V4': command not understood.KERBEROS_V4 rejected as an authentication typeName (cronos.fi-b.unam.mx:delta01): delta01331 Password required for delta01.Password:530 Login incorrect.Login failed.Remote system type is UNIX.Using binary mode to transfer files.ftp>

19

Page 198: Cur So Unix

Manual de Unix

Se pide el login y posteriormente el password, esto con el fin de validar. Cuando se hace la conexión, ya se pueden transferir archivos.

El FTP se puede acceder como usuario anónimo. Como en el ejemplo:

$ ftp ftp.uu.netftp.uu.net (login:smith): anonymousPassword: smith@linux. somewhere .com

NOTA

Muchos sitios no permiten FTP como usuario anónimo por razones de seguridad. En los casos en que no se permite FTP como usuario anónimo, el comando ftp da un mensaje de error del tipo Login failed -User “anonymous” unknown. Los sitios que sí permiten FTP como usuario anónimo normalmente sitúan al usuario en un árbol de directorios sujeto a restricciones con acceso sólo de lectura. Si se le permite colocar archivos en la computadora remota, normalmente sólo podrá ubicarlos en un directorio.

10.4.1 Comandos ftp disponibles en la modalidad interactiva

Comando Descripción! Escapa al shell.$ Ejecuta una macro.account Envía el comando de cuenta al servidor remoto. append Añade a un archivo.ascii Establece el tipo de transferencia de archivos en la modalidad ASCII.bell Emite una señal acústica cuando se completa un comando.binary Ajusta el tipo de transferencias de archivos a la modalidad binaria. bye Finaliza la sesión FTP y sale.Case Conmuta mget entre asignación de nombre de archivos con mayúsculas o

minúsculas.cd Cambia el directorio de trabajo en la computadora remota.cdup Cambia el directorio de trabajo remoto al directorio matriz. chmod Modifica los permisos de archivo del archivo remoto.close Finaliza la sesión FTPcr Conmuta el filtrado de retornos de carro cuando se recibe un archivo

ASCII. delete Borra archivos remotos.debug Borra archivos remotos.dir Lista el contenido del directorio remoto. disconnect Finaliza la sesión FTP (igual que close). exit Finaliza la sesión FTP y sale.

19

Page 199: Cur So Unix

Manual de Unix

form Establece el formato de transferencia de archivos. get Obtiene un archivo de la computadora remota.glob Conmuta la expansión de comodín de nombres locales de archivo.hash Conmuta la impresión del carácter para cada memoria intermedia

transferida. help Imprime información de ayuda local.idle Obtiene o fija el temporizador en la computadora remota.image Establece el tipo de transferencia de archivo al modo binario (lo mismo

que binary).lcd Cambia al directorio local de trabajo.ls Lista el contenido del directorio remoto (proporciona el tamaño y el tipo de

permiso asignado).macdef Define una macro.mdelete Borra archivos múltiples en la computadora remota.mdir Lista el contenido de directorios remotos múltiples.mget Obtiene archivos múltiples de la computadora remota. mkdir Crea un directorio en la computadora remota.mls Lista el contenido de directorios remotos múltiples.mode Establece la modalidad de transferencia de archivos.modtime Muestra la hora de la última modificación del archivo remoto.mput Envía archivos múltiples a la computadora remota.newer Obtiene el archivo remoto si éste es más reciente que el archivo local

correspondiente.nmap Establece plantillas para asignación predeterminada de nombres de

archivos.niist Lista el contenido del directorio remoto.

10.4.2 Una sesión FTP

El comando open se utiliza para abrir una sesión FTP con un sistema remoto. Su sintaxis es la siguiente:

ftp> open nombre_del_servidor

Los comandos close, quit, exit y bye se utilizan para finalizar una sesión FTP con una computadora remota. El comando close cierra su conexión a la computadora remota, pero le dejan dentro del programa ftp en su computadora local. Los comandos quit, exit y bye cierran su conexión a la computadora remota si hay una conexión activa y posteriormente provocan la salida del programa ftp en su computadora.

19

Page 200: Cur So Unix

Manual de Unix

Los comandos get y mget se utilizan para recuperar archivos de una computadora remota. El comando get recupera el archivo que especifica como un argumento (nombre-archivo); la sintaxis del comando get es:

ftp> get nombre_archivo_remoto

También puede proporcionar un nombre al archivo cuando lo creó en su computadora local, si no proporciona un nombre de archivo local se utiliza el nombre_ archivo_remoto.

El comando mget recupera archivos múltiples al mismo tiempo. Su sintaxis es la siguiente:

ftp> mget archivo1 archivo2 archivo3

Estos archivos se especifican proporcionando una lista de nombres de archivo separados por espacios o utilizando un patrón de comodines a mget. Aparecerá un indicador para cada archivo. Utilice el comando prompt antes de utilizar mget si desea desactivar los indicadores. En ambos casos, los archivos se transfieren como archivos ASCII, salvo que haya establecido la modalidad de transferencia de otra forma.

Los comandos put y mput se utilizan para enviar archivos a una computadora remota. El comando put envía el archivo local que especifique como un argumento. La sintaxis de este comando es:

ftp> put nombre_archivo_enviar

El comando mput envía una serie de archivos locales. La sintaxis de este comando es:

ftp> mput lista_nombre_archivo

Estos archivos se especifican proporcionando una lista de nombres de archivos separados por espacios o un patrón de comodines a mput. Cuando utilice mput aparecerá un indicador para cada archivo. Utilice el comando prompt si desea desactivar los indicativos. En ambos casos, los archivos se transfieren como archivos ASCII, salvo que haya establecido la modalidad de transferencia de forma distinta.

20

Page 201: Cur So Unix

Manual de Unix

10.4.3 Comprobación del estado de transferencia

Cuando transfiera un archivo de gran tamaño, resulta muy útil que ftp le proporcione información sobre el proceso de transferencia. El comando hash hace que ftp imprima un carácter de almohadilla (#) en la pantalla cada vez que finaliza la transferencia de un almacenamiento de datos. Este comando funciona igual para el envío que para la recepción de archivos.

El carácter ! se utiliza para pasar un comando al shell de comandos de su computadora local mientras se encuentran en FTP. Esto puede ser de gran utilidad si tiene que hacer algo mientras se encuentra en medio de una sesión FTP. Por ejemplo, suponga que necesita crear un directorio donde guardar los archivos recibidos. Si escribe !mkdir new_dir. El sistema creará un directorio llamado new_dir en su directorio local actual.

20

Page 202: Cur So Unix

Manual de Unix

10.5 ROLOGINEl comando rlogin es muy parecido al comando telnet, ya que permite iniciar una sesión

de comandos interactiva en un sistema remoto. La sintaxis de este comando es la siguiente:

$rlogin [-8EKLdx] [-e char] [-k realm] [-l nombre_usuario] nombre_servidor

Aunque la utilización más común es sencillamente:

$ rlogin nombre _servidor

20

Page 203: Cur So Unix

Manual de Unix

10.6 CONECCIÓN REMOTA CON SSHssh (abreviatura de la expresión inglesa “secure shell” o shell seguro), es un programa que

permite conectar con la máquina remota y ejecutar comandos en dicha máquina remota. ssh está diseñado definir una sesión encriptada entre sistemas poco fiables en una red insegura.

Uno de los problemas que plantea telnet es que, cuando el usuario se conecta al sistema remoto, la contraseña se envía como texto ASCII a la red. De esta forma, si otro usuario comprueba los paquetes Ethernet, puede detectar el nombre de conexión y contraseña del usuario original para el sistema remoto.

ssh evita este tipo de problemas al utilizar una autentificación basada en RSA. Debido a sus prestaciones en materia de seguridad, los administradores de sistemas utilizan ssh de forma habitual. Los clientes de ssh también pueden utilizarlos otros sistemas operativos, como Macintosh y Windows.

El comando ssh es muy parecido al comando telnet ya que permite iniciar una sesión de comandos interactiva en un sistema remoto. ssh tiene la sintaxis siguiente:

ssh [-a] [-c idea | blowfish | des | 3des | arcfour | tss | none ] [-e escape_char] [-I identity file] [-l login_name] [-n] [-k] [-V] [=o option] [-p port] [-q] [-P] [-t] [-v] [-x][-c] [-L port”host:hostport ] [-R port:host:hostport] hostname [comand]

Sin embargo, normalmente se usa como sigue:

$ ssh hostname

Un ejemplo es el siguiente:

$ ssh hostname

20