x i n U x i i n n U U x x i i n n n U U U x x x i i i n Un Un x x x i i i n n n U ix U ix U i n n n U ix U ix U Curso VzAIX01 UNIX/AIX Basics for Operators Ramón Barrios Lascar 2010 Le dedico este libro y todo mi trabajo a la mujer que ha soportado que pase horas y horas frente a un “jugando” con computadoras que parecen primitivas. Oh Estefanía! Marcas registradas En este documento aparecen una cantidad de términos que son marcas registradas o marcas comerciales de IBM u otras compañías. IBM® es una marca registrada de International Business Machines Corporation. Las siguientes sin marcas registradas de International Business Machines Corporation en los Estados Unidos de América y otros países: AIX® DB2® DB2 UDB® POWER PowerPC® SP® POWERparallel® eServer pSeries Intel® es una marca registrada de Intel Corporation en los Estados Unidos de América y otros países. UNIX® es una marca registrada de The Open Group en los Estados Unidos de América y otros países. Sun y Sun Solaris® son unas marca registrada por Sun Microsystems Corporation en los Estados Unidos de América y otros países. Linux® es una marca registrada de Linus Torvalds en los Estados Unidos de América y otros países. Microsoft® Windows™ es una marca registrada de Microsoft Corporation en los Estados Unidos de América y otros países. Edición de septiembre de 2010. © Ramón Barrios Lascar 2003, 2010. Todos los derechos reservados. Este documento no puede ser reproducido sin el permiso y consentimiento expreso de Ramón Barrios Lascar. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 2 Contenidos INTRODUCCIÓN .............................................................................................................................................9 OBJETIVOS AUDIENCIA 9 9 INTRODUCCIÓN A SISTEMAS IBM P5 Y PSERIES ........................................................................................11 EL CONCEPTO GENERAL CAPACIDADES DEL HARDWARE Los Procesadores La Memoria De Acceso Directo, RAM Los Buses Externos Las Comunicaciones Externas El Substrato Electrónico El Sistema De Manejo De Los Recursos De Hardware CAPACIDADES DEL SOFT WARE Capacidades Base (por Ser Unix) Capacidades Logradas Debido Al Hardware Que Soporta Capacidades Únicas 11 15 15 17 18 19 19 20 23 23 23 24 SISTEMAS OPERATIVOS UNIX ......................................................................................................................27 HISTORIA, TERMINOLOGÍA DEFINICIONES COMPONENTES DE UN SISTEMA UNIX EL KERNEL O NÚCLEO DEL SISTEMA OPERATIVO SISTEMAS DE ARCHIVOS/DE ARCHIVADO Nomenclatura De Archivos Conceptos: Directorios Conceptos: Archivos Conceptos: Archivos Especiales Nodo 27 29 31 33 33 34 34 34 INTÉRFACES DE USUARIO: INTÉRPRETE DE COMANDOS (SHELL) 37 Intérprete De Comandos Original: Sh Intérprete De Comandos De La Universidad De Berkeley: Csh Intérprete De Comandos Comercial AT&T: Ksh Intérprete De Comandos De Código Abierto: Bash 37 38 38 38 INTERFACES DE USUARIO: AMBIENTES DE ESCRITORIO GRÁFICO 41 Gnome (GNU Network Object Model Environment) KDE (K Desktop Environment) CDE (Common Desktop Environment) 42 43 44 APLICACIONES GENERALES EN UNIX: EDITORES DE TEXTO 45 Editor Ed Editor Vi APLICACIONES GENERALES EN UNIX: AMBIENTES DE DESARROLLO PERFILES DE USUARIOS Y DE GRUPOS DE USUARIO 46 46 49 51 COMANDOS BÁSICOS DE UNIX ...................................................................................................................53 COMANDOS BÁSICOS DE SESIÓN DE USUARIO Entrar Al Sistema Quién Soy (qué Usuario Soy): Whoami Quienes Están En El Sistema (qué Usuarios Están Conectados): Who A Qué Grupos Pertenezco: Groups Cambiar Mi Contraseña: Passwd Salir Y Desconectarse De La Sesión: Logout ESTRUCTURA “ESTANDAR” DE LOS COMANDOS AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 53 53 53 54 54 54 55 58 3 Acerca De Los Comandos Acerca De Las Opciones 58 58 COMANDOS RELACIONADOS CON LA FECHA Y LA HORA ..........................................................................60 Qué Fecha Y Hora Es En El Servidor: Date Cuánto Se Demora Una Tarea: Time Calendario: Cal 60 60 61 COMUNICACIÓN CON OTROS USUARIOS ...................................................................................................64 UNIX Y LAS COMUNICACIONES MENSAJES DIRECTOS A LA SESIÓN: WRITE COVERSACIÓN (CHAT) CON OTROS USUARIOS: TALK MENSAJES A TODO EL MUNDO: WALL CORREO ELECTRÓNICO: MAIL Modo Interactivo Y Lectura Del Correo Electrónico Modo Directo Y Envío De Nuevos Mensajes De Correo Electrónico 64 66 68 70 72 72 74 ARCHIVOS Y DIRECTORIOS: MANEJO DE DIRECTORIOS ...........................................................................76 DIRECTORIOS LISTAR CONTENIDOS DE DIRECTORIO: LS Uso Básico Del Comando “listar Contenidos Del Directorio” Listar Contenidos De “otro Directorio” Listar Incluyendo Los “archivos Normalmente Ocultos” LISTAR CONTENIDOS DE DIRECTORIO CON DETALLES: LS –L MOVERSE ENTRE DIRECTORIOS: CD CREAR DIRECTORIOS: MKDIR Crear Toda Una Estructura De Directorios: Mkdir –p 76 78 78 78 79 80 82 84 85 CAMBIAR NOMBRE DE DIRECTORIO (O MOVER): MV REMOVER DIRECTORIOS: RMDIR 86 88 Remover Una Jerarquía De Directorios: Rmdir –p 88 ARCHIVOS Y DIRECTORIOS: MANEJO DE ARCHIVOS .................................................................................90 ARCHIVOS Nombres De Los Archivos Nombres Por Ruta Absoluta Y Por Ruta Relativa LISTAR ARCHIVOS: LS LISTAR ARCHIVOS CON DETALLES: LS –L CREAR ARCHIVO VACÍO: TOUCH COPIAR ARCHIVOS: CP Uso De Cp Para Hacer Una Copia Sencilla De Un Archivo Uso De Cp Para Copiar Varios Archivos Uso Del Comando Cp Para Copiar Directorios Completos: Cp -R MOVER O RENOMBRAR ARCHIVOS: MV Uso De Mv Para Renombrar Un Archivo Uso De Mv Para Mover Varios Archivos AGREGAR NOMBRES A ARCHIVOS: LN Agregarle Un Nuevo Nombre A Un Archivo Individual AGREGAR ENLACES SIMBÓLICOS: LN –S Agregarle Un Enlace Simbólico A Un Archivo Individual Agregarle Enlaces Simbólicos A Múltiples Archivos A La Vez REMOVER ARCHIVOS Y NOMBRES DE ARCHIVOS: RM Remoción De Directorios DETERMINAR TIPO DE ARCHIVO: FILE AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 90 91 92 94 96 98 100 100 100 101 102 102 102 104 104 106 106 106 108 108 110 4 EDICIÓN DE ARCHIVOS DE TEXTO: VI ......................................................................................................112 ARCHIVOS DE TEXTO Editores De Texto: Vi Modos De Vi EDITAR ARCHIVOS EXISTENTES CON VI CREACIÓN DE NUEVOS ARCHIVOS DE TEXTO MOVERSE DENTRO DE UN ARCHIVO Moverse De A Líneas Moverse De A Páginas O Pantallas Moverse Según El Contexto 112 112 112 114 116 118 118 118 119 INSERCIÓN DE NUEVOS CONTENIDOS DE TEXTO (EN VI) COMANDOS BÁSICOS DE EDICIÓN DE TEXTO (DE VI) BUSCAR Y REEMPLAZAR TEXTOS CONTENIDOS (DENTRO DE VI) TABLEROS DE RECORTES: CORTAR, COPIAR Y PEGAR EDITAR Y TRABAJAR CON MÁS DE UN ARCHIVO DE TEXTO PERSONALIZACIÓN DEL EDITOR DE TEXTO VI 120 122 124 126 128 130 Uso Práctico De Los Archivos De Opciones De Vi Formato De Un Archivo De Opciones De Configuración De Vi 132 132 EL AMBIENTE DE TRABAJO: PROCESOS Y VARIABLES ..............................................................................134 EL AMBIENTE DE TRABAJO PROCESOS Iniciar Y Detener Procesos LISTAR PROCESOS Listado Básico De Procesos: Ps Listado De Todos Los Procesos: Ps –e Listado Largo (técnico) De Los Procesos: Ps –l Listado Completo (full) De Información De Los Procesos: Ps –f Variantes BSD - Listado Extendido De Procesos: Ps –U NombreUsuario Listado Extra Extendido De Procesos, En BSD: Ps –aux Acerca De Las Columnas: %CPU Acerca De Las Columnas: %MEM Acerca De Las Columnas: STATE PROCESOS DE FONDO Ejecución De Procesos “de Fondo” (en Background) Listar Procesos De Fondo Manejo De Las Tareas De Fondo Con Fg Y Con Bg Señales A Procesos: Combinaciones De Tecla Y El Comando Kill Sintaxis Del Comando Kill Acerca De Las Señales VARIABLES DE AMBIENTE Listar Las Variables De Ambiente Del Intérprete Shell Definición De Nuevas Variables En El Intérprete Shell PASO DE VARIABLES ENTRE GRUPOS DE PROCESOS Uso Del Comando Export Paso De Variables Nuevas No Preexistentes En El Intérprete PASO DE SEÑALES ENTRE GRUPOS DE PROCESOS Uso Del Comando Kill Para El Envío De Señales A Grupos De Procesos 134 136 136 138 138 138 138 139 140 141 142 143 143 144 144 144 145 145 146 146 150 150 151 152 152 153 154 154 SEGURIDAD Y PERMISOS DE ARCHIVOS ...................................................................................................156 ARQUITECTURA DE SEGURIDAD DE UNIX® PROCESOS Y PERMISOS USUARIOS Y GRUPOS DE USUARIOS PERMISOS DE ARCHIVOS: LS -L AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 156 158 160 164 5 PERMISOS DE DIRECTORIOS: LS -LD CAMBIAR PERMISOS: CHMOD CAMBIAR PROPIETARIO: CHOWN CAMBIAR IDENTIDAD DE USUARIO: SU 166 168 170 172 USO EFECTIVO DEL INTÉRPRETE DE COMANDOS ...................................................................................174 EL INTÉRPRETE DE COMANDOS El Intérprete De Comandos Y El Uso De La Multitarea El Intérprete De Comandos Y Los Metacaracteres COMODINES (DE NOMBRES) Comodín Básico ? (cualquier Un Caracter Del Nombre) Comodín Amplio * (cualesquiera Caracteres Del Nombre) Comodín [xyz] (cualquier Un Caracter De La Lista) Comodín [!xyz] (cualquier Caracter Que No Esté En La Lista) Comodín [x-z] (cualquier Caracter Que Esté En Un Rango) Comodín [!x-z] (cualquier Caracter Que No Esté En El Rango EJECUCIÓN DE COMANDOS EN SECUENCIA EJECUCIÓN CONDICIONAL DE COMANDOS Códigos De Retorno De Una Ejecución Ejecución Condicional: Ejecución Sólo Si El Anterior Ejecuta Sin Error Ejecución Condicional: Ejecución Sólo Si El Anterior Ejecuta Con Error REDIRECCIÓN: ARCHIVOS Archivos Estandar: “entrada Estandar”, “salida Estandar”, “salida De Errores Estandar” Redirección De La Entrada Desde Un Archivo Redirección De La Salida Hacia Un Archivo Redirección De Los Mensajes De Error Hacia Un Archivo Redirección De La Salida Sin Destruir Redirección De Los Mensajes De Error Sin Destruir Combinaciones De Redirecciones SUBSTITUCIÓN DE VARIABLES Variables De Ambiente Importantes En El Shell SUBSTITUCIÓN DE COMANDOS REDIRECCIÓN: TUBERÍAS Comandos Filtro ESCAPES Escape De Un Único Caracter: Símbolo \ Escape De Todos Los Significados Especiales: ' Escape De No Todos Los Significados Especiales: " 174 174 174 176 176 177 178 178 179 179 182 184 184 184 185 186 186 187 188 188 190 190 191 192 193 196 198 198 200 200 201 202 UTILIDADES DE TEXTO ..............................................................................................................................204 EL CONCEPTO VOLCAR TEXTO A LA SALIDA ESTÁNDAR: CAT CONTAR CARACTERES, PALABRAS, LÍNEAS: WC NUMERAR LÍNEAS DE TEXTO: NL PAGINAR TEXTO: PG OBTENER PRIMERAS LÍNEAS DE TEXTO: HEAD OBTENER ÚLTIMAS LÍNEAS DE TEXTO: TAIL OBTENER COLUMNAS DE TEXTO: CUT COMBINAR TEXTO EN COLUMNAS: PASTE COMBINAR TEXTO EN COLUMNAS: JOIN FILTRAR LÍNEAS DE TEXTO: GREP EXPRESIONES REGULARES BÁSICAS (EN GREP) FILTRADO AVANZADO DE LÍNEAS DE TEXTO: EGREP AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 204 206 208 210 214 216 218 222 226 230 234 238 242 6 EXPRESIONES REGULARES EXTENDIDAS (EN EGREP) ORDENAR LÍNEAS DE TEXTO: SORT TRANSLITERAR CARACTERES: TR 246 250 256 UTILIDADES AVANZADAS DE ARCHIVOS Y DIRECTORIOS .......................................................................262 UTILIDADES, MÁS UTILIDADES BÚSQUEDA DE ARCHIVOS: FIND Criterios De Selección En Find Acciones En Find Operadores Lógicos En Find EJECUCIÓN DE COMANDOS EN CANTIDADES DE ARCHIVOS: XARGS COMPRIMIR ARCHIVOS 1: COMPRESS & UNCOMPRESS COMPRIMIR ARCHIVOS 2: GZIP & GUNZIP EMPACAR ARCHIVOS: TAR COMANDOS VARIOS Comando Host Comando Hostname Comando Uptime Comando Du Comando Sum Comando Cksum Comando True Comando Yes 262 264 264 267 268 274 278 282 286 292 292 292 292 293 294 294 294 295 USO AVANZADO DEL INTÉRPRETE DE COMANDOS: .................................................................................296 USO DEL INTÉRPRETE COMO UN LENGUAJE DE PROGRAMACIÓN Desarrollo De Shell Scripts PRUEBAS LÓGICAS: TEST Pruebas Lógicas Básicas Pruebas Lógicas Con Cadenas De Texto Pruebas Lógicas Con Archivos OPERADORES Y OPERACIONES: EXPR COMANDOS DE CONTROL DE FLUJO: IF, THEN, ELSE & FI COMANDOS DE CONTROL DE FLUJO: FOR, DO & DONE COMANDOS DE CONTROL DE FLUJO: WHILE, DO & DONE MANIPULACIÓN DE VARIABLES: LET AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 296 296 298 298 300 300 302 306 308 310 312 7 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 8 Introducción Objetivos El presente curso pretende, mostrar, explicar y poner en práctica una serie de comandos y técnicas que permiten a un individuo trabajar con sistemas UNIX, Linux, POSIX y parecidos. La idea del mismo es dar los conocimientos suficientes a un usuario u operador para poder trabajar cómoda y eficientemente a través del uso de una cuenta de acceso a un sistema multiusuario como los mencionados en modo texto; es decir a través del uso de comandos y toda la sintaxis de un intérprete de comandos estilo Bourne. Al tomar este curso y aprender lo que aquí se pretende, el estudiante logra los conocimientos necesarios para trabajar en sistemas como Sun Solaris, Hewlett-Packard HPUX, Digital/Compaq/HP UNIX /Tru64, SCO OpenServer/OpenDesktop, SCO UnixWare, QNX y QNX Centrino, FreeBSD/NetBSD/OpenBSD, prácticamente todas las distribuciones de Linux, y muy especialmente, IBM AIX. Adicionalmente los comando son usables también en la interfaz de texto del sistema Mac OS X. Audiencia Este documento y el curso relacionado está dirigido a profesionales de sistemas, sin experiencia o capacitación previa en el manejo de sistemas UNIX, pero que saben trabajar y conocen de sistemas de cómputo en general, como sistemas estaciones Microsoft Windows y Apple Mac OS X. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 9 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 10 Introducción a sistemas IBM p5 y pSeries El concepto general Desde su introducción, los sistemas de servidor multiusuario basados en tecnología POWER disponibles al público por IBM han sido sistemas muy avanzados que ofrecen: Muy alto desempeño (tal vez el más) en su gama de precios Flexibilidad en las configuraciones Las más avanzadas y variadas herramientas y mecanismos de disponibilidad del mercado Un sistema operativo capaz de usar toda la funcionalidad del hardware Soporte a tecnologías de terceros –tecnologías abiertas y estándares de la industria-. Para comprender a cabalidad las capacidades que ofrecen estos sistemas es bueno concentrarnos en los mercados principales a los que IBM ofrece soluciones basadas en POWER: Organizaciones que, bajo ningún concepto, pueden dejar de disponer de sus servidores centrales más que unas horas al año máximo. Organizaciones que usan aplicaciones de servidor de datos, en especial como núcleo central en un esquema distribuido cliente/servidor. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 11 Organizaciones que funcionan o hacen disponibles sus servicios las 24 horas del día, los 365 días del año. Estas organizaciones tampoco tienen amplias ventanas de tiempo para mantenimientos del sistema, es más ni aún para tareas rutinarias, como las necesarias – críticas- copias de respaldo. Organizaciones con más de una sede, que centralizan sus datos en un único punto, con un complejo pero muy eficiente sistema de comunicaciones. Organizaciones en las que centenares, tal vez miles de usuarios usan aplicaciones cuyas fuentes de datos están contenidos en unos muy pocos sistemas, pero en las que los mismos datos son tal vez contenedores con múltiples o muchos terabytes. Si analizamos detenidamente, muchísimas organizaciones en nuestro país clasifican en uno o más de los parámetros arriba mencionados, pero en especial: Organizaciones financieras: bancos, corporaciones financieras y de crédito, corredores de bolsa. Empresas de servicios públicos (las llamadas utilities): agua, energía, telefonía, gas. Instituciones del estado, en especial las relacionadas con la seguridad y el sistema impositivo. Entidades relacionadas con la salud: hospitales y clínicas. Mirando los conceptos de diseño y desarrollo, los requerimientos de funcionalidad y capacidad de las organizaciones que adquieren servidores p de IBM, es preciso que tanto el hardware como el software se reconozcan mutuamente, que empalmen y sincronicen, de manera que se tengan servidores siempre disponibles (en realidad con “cinco nueves”). IBM ofrece entonces: Servidores basados en hardware de alto desempeño, con: Múltiples procesadores, cada uno con muy alto desempeño. Se ofrecen servidores p con hasta 256 procesadores POWER 6 o POWER 6+ o Power7 (usables como 512 procesadores lógicos) en configuraciones SMP (no de cluster). Grandes cantidades de espacio de ejecución, RAM. Se ofrecen servidores p con hasta 8TB de RAM (sí, 8192GB de memoria de acceso directo). Amplia capacidad de expansión en tarjetas. Servidores base y Es bueno record ar que IBM expansiones externas para lograr sistemas con capacidad de significa Int ernacional centenares de ranuras, todas usables internamente, todas configuradas Business Machines, es decir “máquinas intern acionales automáticamente á la Plug And Play. Muchas de estas ranuras, cuando negocio s”, y este siempr de e ha sido y será el no todas, soportando estándares como PCI-X con conectado en mercado que maneja, y para el que diseña caliente. sus solucione Amplísima capacidad de expansión en espacio de disco. Servidores AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow s y productos. 12 base y expansiones para lograr servidores con capacidad en centenares de terabytes de espacio. Recordando que las versiones actuales del sistema operativo AIX puede manejar exabytes de espacio en disco. Los mejores esquemas de detección, diágnóstico y reacción ante los errores. Los sistemas p han sido diseñados desde el comienzo para mejorar, por encima de toda la industria, cómo los mismos reaccionan ante los errores. Es de notar que IBM viene trabajando en estos temas desde la década de los setenta, para implementar y ofrecer esquemas adecuados en sus sistemas mainframe de la época. Las mismas tecnologías las ha ido evolucionando y mejorando para ofrecer en todos sus sistemas i (antes iSeries y AS/400), sus sistemas z (antes zSeries y S/390) y lo que nos atañe de momento, los sistemas p (antes pSeries y RS/6000). AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 13 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 14 Capacidades del hardware IBM viene ofreciendo a sus clientes –y el mercado en general- servidores de negocios centrándose en unas pocas pero avanzadísimas tecnologías: Los procesadores IBM ofrece servidores con procesadores POWER 6 y Power7 en las familias p, e i. Los mismos procesadores han evolucionando desde su invención e implementación de fines de los ochenta al día de hoy. Entre otras muchas características están: “Ancho” de dato nativo de 64 bits, pero, pudiendo manejar sin emulaciones por software datos a 32, 128 y 256 bits, según el caso. Los sistemas operativos actuales corren a 64 bits –es decir nativos- en estos procesadores. Los mismos pueden trabajar en dos “orientaciones de palabra”, tanto little-endian como big-endian, siendo nativos en little. AIX siempre ha sido little-endian. Esta última orientación de palabra es la natural de TCP/IP, por eso a veces se le denomina “orden de red”. Doce (12) unidades paralelas de ejecución (pipelines), con diferente funcionalidad, pero funcionando todas al tiempo si es necesario. Diferentes unidades se encargan de los accesos a RAM (fectch, load, store), los cálculos con enteros y con unidades menores como los bytes, los cálculos con números de punto flotante. Recuerde que por ser tecnología RISC, la RAM no es accedida directamente por el procesador, si no que se usa como una remote data store. Los procesadores actuales tienen un “archivo de registros” con 64 direccionables directamente, todos con el ancho nativo. Al mismo tiempo tienen un “archivo de registros temporales fantasma” con capacidad para contener hasta 210 estados de registro en etapas parciales de ejecución. Esto último le permite despachar más operaciones en paralelo que cualquier otro ofrecimiento real y actual en el mercado. Procesadores con la posibilidad de procesar instrucciones de dos hilos de ejecución diferentes simultáneamente. Esta capacidad lleva por nombre –en IBMSimultaneous Multi-threading (SMT). En otras arquitecturas se conoce con otros nombres, por ejemplo Hyper-Threading. Los procesadores Power6 actuales son todos fabricados “con doble núcleo” (dual core) o con “cuadruple núcleo” (quad core); los procesadores Power7 actuales son todos fabricados “con ocho núcleos” (octo core). Estas característica de fabricación implica que cada dos, cuatro u ocho procesadores están litografiados en un mismo substrato de silicio. Cuando dos o más procesadores están en el mismo substrato pueden llegar a comunicarse a la velocidad nativa a la que trabajan, no en divisores, como las otras tecnologías. Cuando un cliente adquiere un sistema con un solo AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 15 procesador, realmente adquiere un magazín de procesador con un chip de doble núcleo, pero con uno de ellos permanentemente desactivado. En el mismo substrato donde se han litografiado los procesadores se incluyen tanto la memoria caché de nivel 1 (L1), funcionando a la misma velocidad que el núcleo de cada procesador, y la memoria caché de nivel 2 (L2), funcionando a la mitad de la velocidad que cada núcleo. Cada procesador posee, maneja y accede, su propio caché L1, de 192KB, y su accede a un banco compartido de caché L2, de 1.9MB (realmente 3x640KB). El caché L2 funciona también a la mitad de la velocidad del procesador. En una circuitería y tarjetería externa a cada procesador, pero protegidas por el mismo magazín contenedor se encuentra la memoria caché de nivel 3 (L3) que, a pesar de ser independiente es controlada directamente por una área dedicada de transistores (cada procesador tiene un controlador integrado de memoria y de caché) dentro de cada procesador. Cada banco de caché L3 es de 36MB por par de procesador. Se dice que cada POWER 5 o posterior incluye un chip RAM Cache Controller. Todo lo anterior es vigilado permanentemente por circuitería de diagnóstico integrada; diseñada e implementada con, y al mismo tiempo que cada procesador, controllador y banco de caché. Los mecanismos de diagnósticos ni son externos ni son agregados a cada elemento, son una parte fundamental del diseño y de la fabricación del mismo, con puertos de comunicaciones al “mundo exterior”. Ahora, todos los puertos de comunicaciones del sistema de diagnóstico son manejados externamente a cada elemento diagnosticado, para que del mismo no dependa la detección de las fallas. Note que un se rvidor POWER no funcionará Usando los mismos puertos de diagnóstico, el sistema detecta, si p r o c e s a d o r todos sus es están configura, maneja la energía, y en especial la temperatura de desactivados por fallas. todos los elementos. El avanzado sistema de manejo de energía de los procesadores POWER 5 usados en los sistemas p5 contínuamente apaga y enciende los subsistemas que no se están usando, de manera que, cuando se hayan en reposo ni consumen prácticamente energía y por consiguiente tampoco disipan calor. Note que adicionalmente a todo, un sistema p puede funcionar con algunos de los elementos arriba mencionados totalmente desactivados por fallas. Lo normal es que el sistema de monitoreo automático apagará y virtualmente desconectará los elementos fallidos. Mientras uno de los sistemas operativos dependientes tenga recursos para continuar el sistema como un todo, proseguirá en operación; en muchos casos sin que los usuarios cliente sean conscientes de los hechos. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 16 Más aún, tanto los registros, como los bancos de caché, como las líneas internas de comunicaciones funcionan con ECC2 todo el tiempo. La memoria con ECC2 puede detectar fallas de hasta dos bits por byte, y corregir cambios de un bit por byte, automáticamente, sin concurso del sistema operativo o de hardware externo. La memoria de acceso directo, RAM IBM se ha caracterizado desde los inicios por notar que estos servidores sirven a una multitud de usuarios, de hecho centenares, tal vez miles. Esto hace que normalmente ejecutan múltiples procesos simultáneamente, y cada uno con un “lote de ejecución” (working set) grande, los servidores p, son capaces de: Soportar la expansión a miles de gigabytes, en las ofertas actuales, hasta 2TB de RAM máxima. Este ofrecimiento es de los más grandes del mercado. Soportar los chips de RAM de última tecnología, que permitan amplios anchos de banda. Los servidores actuales soportan DDR1 y DDR2 (double data rate), siendo ofrecidos siempre con DDR2, a menos que el cliente solicite más de 512GB de RAM, ya que las ofertas actuales de mercado no hacen posible “armar” 2TB de RAM con unos pocos chips DDR2. Trabajar siempre con controladores de RAM, líneas de acceso y pastillas de memoria con detección y corrección automática de errores chip-kill. IBM usa y sólo soporta memoria con ECC2. Adicionalmente a esto, el sistema de detección y corrección de errores de hardware visualiza permanentemente la RAM, y en el caso de errores contínuos sobre un mismo SIPP de RAM, puede llegar a desactivarlo, sin que se pierda la pastilla completa. Este tipo de cambios son registrados en memoria no volátil (NVRAM) para que sobreviva a reinicios del sistema. Soportar simultáneamente la comunicación de los múltiples procesadores y múltiples pastillas DDR sin generarse conflictos y bloqueos contínuamente. Esto como un ofrecimiento único del mercado, los servidores p5 incluyen una circuitería que implementa un switch de RAM de alta velocidad (high speed RAM switch), con un ancho de banda de entre 16GB/s y 270GB/s según el modelo, superior a todo lo otro en el mercado. Este switch permite la funcionalidad avanzada de los buses de RAM, que logra acceso simultáneo en paralelo de los procesadores, los controladores de memoria caché y los dispositivos con DMA sin conflictos. Manejar tanto los controladores de RAM como los controladores de caché con “doble entrada” (dual ported), de manera, que en el caso de la RAM, puede ser accedida al tiempo por los procesadores (el controlador de caché realmente) y por las tarjetas adaptadoras con uso de DMA, sin conflictos; y, en el caso de los bancos de caché, puede ser accedida al tiempo por los procesadores y por la RAM, sin conflictos. Los AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 17 accesos además pueden ser de lectura o de escritura, simultáneamente, y sin problemas. Los buses externos Los servidores IBM p5 son diseñados con base en una jerarquía de buses jerarquizados, con corrección de errores ECC2 permanente, con zonas de intercambio de alta velocidad (buffers), y todos con una variante de PCI (Peripheral Component Interconnect). Los servidores p5 ofrecen: Múltiples, realmente decenas, de buses PCI en diversas variantes, desde PCI estándar de 32bits y a 33MHz hasta los últimos PCI-X, de 64 bits y a 512MHz. Todos estos buses, con manejo de errores permanente, a través de puertos de detección, configuración, manejo de errores, y de energía independientes. Acceso externo a todos los buses, es decir aquellos que incluyen ranuras para tarjetas adaptadoras, con función de desactivado, es de decir de apagado lógico. Estos buses de acceso externo son armados de manera que soportan normalmente una única ranura por bus. Esto logra aislar los problemas, evitar la interferencia intertarjetas y facilita las funciones de particionamiento lógico dinámico (Dynamic Logical Partitioning, DLPAR). Múltiples buses PCI Express con funciones de conectado y desconectado en caliente (hot plug). Esto, combinado con las funciones arriba mencionadas logra el mejor manejo de cambios de hardware en caliente de la RIO2 es sigla de Remote Input/ industria para el segmento de los servidores intermedios. Output, vers ion 2, S y s t e m Po w e y SPCN de r Control Network. Soporte a expansiones externas con conectividad a través de un bus externo intermedio de muy alta velocidad (2GB/s), adicionado con un bus de manejo de poder (RIO2-GX + SPCN). Las mencionadas expansiones hacen que se puedan agregar buses PCI (de diversas variantes) y que los mismos sean vistos como buses locales, externos, pero vistos y usables como si fueran internos. Las características anteriores todas manejadas con configuración automática, usando el estándar que PCI incluye para ello. Tanto PCI com o USB son estándares diseñados, implementados, y de Intel Corporat licenciados ion. Adicionalmente, los servidores p5 incluyen buses USB (Universal Serial Bus) versión 2, estándar de la industria, que soporta dispositivos de baja velocidad como teclados, ratos y disqueteras externas. Como es en las otras plataformas, USB no solo es de detección automática, si no de conectado y desconectado en caliente. Para cerrar el círculo, los servidores POWER han sido diseñados para tener un ancho de banda amplio a los sistemas de almacenamiento, por ello estos mismos son o SCSI de última AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 18 generación (actualmente UltraSCSI 320) o de canal de fibra de última generación (Fiber Channel de hasta 4Gb/s). Mientras que todo sistema de almacenamiento por bus SCSI es visto como una data store local, con detección y configuración automática de los componentes, los sistemas de almacenamiento FC pueden verse como una data store local o remota, pero en ambos casos, con detección y configuración automática. Igual que siempre, en ambos casos, con manejo dinámico de errores, usando las funciones que cada protocolo de hardware incluye e implementa. Las comunicaciones externas Como los sistemas p5 normalmente no son usados directamente, si no que prestan todos sus servicios a infinidad de usuarios a través de una o más redes, es crucial que se puedan implementar eficientemente las comunicaciones. Los servidores p5 ofrecen: El fu nc io na m ie nt o au to crossover que tie implementadas las tar n e n jet red IBM sigue el están as de dar MDIX Dos puertos de red integrados en una sola tarjeta de redes ethernet con soporte a 10, 100 y 1000 Mb/s. Dicha tarjeta incluye una antememoria en hardware de 4MB, para evitar que las congestiones se den en la misma, además de que tiene acceso directo a la RAM, esto es, DMA. Como todas las tarjetas ethernet ofrecidas por IBM, tiene funciones de auto-crossover, es decir que detecta y selecciona automáticamente la polaridad de la señal del medio, así como la velocidad y el modo duplex/simplex. Opciones de red ethernet adicionales, como tarjetas con soporte sólo a 10/100 Mb/s o con soporte a 10000 Mb/s. Opciones para la descarga de la funcionalidad de chequeo de paquetes IP, de esta forma se elimina la tarea a la pila IP de sistema operativo esta tarea, aliviando la carga a el(los) procesador(es). Tarjetas adaptadoras de red con la funcionalidad de IPSEC integrada, para eliminar esta tarea –igual que en el caso anterior- a la pila IP del sistema operativo. Opciones de redes adicionales, como Token Ring, FDDI y ATM. Adicionalmente, soportan “encendido a través de la red” (wake-up on lan). El substrato electrónico Las “tarjetas principales” (system planars o io planars en la documentación de IBM) de los servidores p5 son fabricados con tecnología de ocho capas. Esto permite más planos para la implementación de líneas de comunicaciones entre dispositivos. No es por capricho, es una decisión consciente, necesaria para la implementación de los canales de comunicaciones por donde se hace la detección, configuración, manejo del poder y de la temperatura de todos, AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 19 los dispositivos agregados. Note que la mayoría de los ofrecimientos de otros proveedores son creados con tecnología de cuatro o cinco capas, lo que dificulta la implementación de este tipo de esquemas en los ofrecimientos de la competencia. El sistema de manejo de los recursos de hardware Mientras que los ofrecimientos de terceros en este rango de mercado incluyen soporte a funcionalidad de manejo de los recursos de hardware, y de las fallas de los mismos, los servidores p5 de IBM van mucho más allá: incluyen un procesador POWER (específicamente PowerPC 405GT) corriendo de líneas de poder y software independientes, y con comunicaciones independientes con el mundo exterior. Este procesador, y otros chips adicionales de soporte se engloban en una funcionalidad denominada “procesador de servicio” (service processor, SP), el que tiene las funciones de: Manejar el poder, es decir implementar las funciones de encendido y apagado del servidor, sus subsistemas y componentes. El procesador de servicio implementa la manera de “desconectar” buses PCI, para poder hacer la remoción y conexión sin riesgos de tarjetas adaptadoras en caliente. Manejar la temperatura, es decir implementar los esquemas de revolución dinámica de los ventiladores internos. El procesador de servicio monitorea la temperatura interna y externa, y aumenta las revoluciones de los ventiladores cuando la temperatura interna aumenta, como cuando la carga en los subsistemas es alta o cuando alguno(s) de los ventiladores falla y hay que suplir su función. Manejar los errores, es decir, monitorear los subsistemas y los componentes, aislar y desactivar los componentes fallidos, reportar los mismos al software que ejecuta “arriba”. El procesador de servicio implementa la función que desactiva automáticamente un componente (así sea un procesador) cuando el mismo falla de manera grave. El procesador de servicio publica unas interfaces de diagnóstico genéricas, que permiten usar herramientas aún cuando el sistema esté en funcionamiento pleno. El procesador de servicio inicializa el hardware, y mientras lo hace reporta sus avances en una pantalla LCD disponible en todos los servidores llamada “panel de operador” (operator panel). La lista de los códigos relevantes al progreso, y a los errores, para cada modelo de servidor se incluye en los manuales anexados a cada sistema cuando se envía al cliente y también disponible en línea en la página de IBM relevante a este hardware. Contínuamente el procesador de servicio monitorea todos los componentes del sistema, pudiendo, según el modelo de máquina, captar información de hasta tres cientos (300) puntos simultáneamente. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 20 Finalmente, el procesador de servicio, junto con unos chips de apoyo implementa las funciones del “hipervisor” (hypervisor). El hipervisor implementa las funciones de “Micro Particionamiento Lógico Dinámico con Virtualización Avanzada POWER” (Dynamic Logical Micro Partitioning with Advanced Power Virtualization). Esta funcionalidad permite hacer, en un solo servidor físico la consolidación de múltiples servidores independientes, y que a pesar de ello sigan siendo “semi-independientes”: Un servidor p5 puede dividirse en un cierto número –según el modelo- de servidores independientes, cada uno con sus “propios” procesadores, tarjetas controladoras de almacenamiento, tarjetas de comunicaciones La de red y memoria RAM, además de su propia copia de sistema Micsrofupancrtitiio ne s de Lo gi ca l oning enteramente de dependen operativo y demás software. l hardwar Cada división, llamada “partición lógica dinámica” o LPAR, puede tener procesadores propios o porciones de procesadores de un pool de procesadores compartidos. e, pero la Advanc ed Dynamic POWER Virt ua dependen de lization adicional licencia s o f t w a r e do de IBM. Cada LPAR tiene una cierta cantidad de memoria RAM asignada. Cada división puede tener tarjetas adaptadoras controladoras propias, reales asignadas y no compartidas, o puede usar una representación en software de una o más de las mismas. La mencionada representación, llamada “tarjeta controladora SCSI virtual cliente” es el resultado de compartir una “tarjeta controladora virtualizada servidor” real, asignada, de otra LPAR. Cada división puede tener tarjetas adaptadoras de red propias, asignadas y no compartidas, o puede usar una representación de software de una o más de las mismas. Puede también usar una “tarjeta controladora de red virtual cliente” que es el resultado de compartir una “tarjeta de red virtualizada servidor” real, asignada de otra LPAR. Cada LPAR puede trabajar sus recursos según uno de varios “perfiles de recursos” definidos con anterioridad. Es posible cambiar en un momento cualquiera la definición de la cantidad y cuáles son los recursos, esta característica es la que le da la connotación de “particionamiento dinámico”. Lo que significa que sin destruir o apagar las LPARs, pueden cambiarse sus asignaciones de procesador, RAM, y tarjetas. Cuán inmediatamente toman los cambios los sistemas operativos que corren en las particiones varía, dependiendo de cuál sistema operativo sea, y de cuál sea la versión. Note que para funcionar, un servidor microparticionado o virtualizado es autocontenido, es decir no depende de adiciones externas, pero, para definir la configuración, es necesario un hardware y software adicional, adquirible como opción única llamada “Consola de Manejo de AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 21 Hardware” (Hardware Management Console). Esta consola se conecta a unos puertos ethernet propios e independientes del procesador de servicio para definir y guardar la configuración de particionamiento y virtualización. Como se habrá observado y notado, en conjunto, las carácterísticas avanzadas de estos servidores p5 hacen un ofrecimiento al que difícilmente se acercan los productos y paquetes de la competencia en este segmento, mucho menos en el mismo rango de precios y con una integración tan completa. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 22 Capacidades del software En 1985, IBM adquirió acceso a, y derechos sobre el código fuente de UNIX, directamente del propietario original, es decir los laboratorios Bell de AT&T (American Telephone & Telegraph). A partir del mismo creó una versión que corriese sobre un hardware que planeaba lanzar al mercado. Posteriormente adquirió el acceso a software originado en la Universidad de California, Capítulo Berkeley (UCB), el software en mención, llamado “Distribución de Software de Berkeley” (BSD) era una variante de UNIX con Esta breve histor características interesantes, entre ellas la integración con redes IP. Al ia de AIX invalida cu del origen integrar los dos, y derivar la versión para el hardware POWER, IBM logró legal alquier que le pueda ge duda nerar al su excelente variante de UNIX denominada Advanced Interactive cliente el usar este sistema operativo. Executive o AIX. Este sistema operativo ha ido evolucionando con el hardware de los servidores POWER, en sus variantes a través del tiempo (RS/6000, pSeries y ahora p5), y con ello a expandido su funcionalidad para hacer uso integral de las capacidades del hardware IBM. Capacidades base (por ser UNIX) AIX es una variante específica y de código cerrado de UNIX, y como tal ofrece: Capacidades multitarea y multi-hilo, con manejo preferencial dinámico de las prioridades. Capacidades integrales multiusuario. Capacidades de manejo en tiempo real de las prioridades. Confiable, administrable, servible Estable, seguro –hasta cierto punto-. Expansible –muchísimo-. Por otro lado, dependiente en su totalidad de lo que IBM ofrece. Capacidades logradas debido al hardware que soporta Adicionalmente a lo que un UNIX tradicional ofrece, AIX agrega: Soportar todo el hardware que IBM suministra para este segmento de mercado (a excepción de los servidores OpenPower, de procesador POWER 5, pero artificialmente limitados a soportar sólo Linux). Detección y configuración automática de todo el hardware soportado, incluyendo el soporte al hardware virtual representado en las controladoras y tarjetas de comunicaciones cliente de virtualización. Adicionalmente el soporte a discos AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 23 duros virtuales, que son sólo la representación de porciones compartidas de discos duros reales. Uso específico de las funciones de los procesadores. En especial AIX en p5 reconoce las funciones avanzadas de los procesadores, como la función SMT (Symmetrical Multi Threading), para, uno, activar el SMT desde el mismo inicio, dos, despachar eficientemente las tareas de manera que se puedan ejecutar en paralelo. Adicionalmente, cuando AIX ve que las tareas que constituyen las cargas son pocas despacha las mismas al mismo procesador, de manera que los demás no trabajen y así el sistema de manejo y ahorro de energía pueda ponerlos en suspenso (standby) para un real ahorro de energía y una disminución significativa en la disipación de calor –y menos ruido porque las revoluciones de los ventiladores también bajan-. Detección y autoconfiguración según las porciones de máquina asignadas a la LPAR en la que está instalado y corriendo. Este decir que AIX asumirá, en caliente los cambios dinámicos en las asignaciones de CPU, de RAM, de ranuras PCI con tarjetas tan pronto como se hagan, sin necesidad de reinicios. Además de esto, puede ejecutar comandos que hagan, entre otras cosas cambios en la configuración del software que se ejecuta “encima” de AIX, para que el mismo también asuma los cambios. Capacidades únicas Manejo declarativo de las asignaciones de recursos por carga, a través de los servicios incluidos del “Manejador de Carga de Trabajo” (Workload Manager). Con este software se clasifican dinámicamente los procesos en clases, y según la clase se pueden imponer límites mínimos y máximos de asignación de CPU, de RAM y de ancho de banda de I/O. Con el WLM se puede hacer que ciertos servicios siempre tengan una preferencia, o que obtengan siempre una porción suficiente de los recursos que necesitan. Manejo avanzado de las situaciones de software, a través del sistema “Manejo y Control de los Recursos” (Resource Management and Control). Con este software se puede preprogramar, para que cuando se de una situación, como un consumo en demasía de un sistema de archivos, el sistema ejecute automáticamente una respuesta, un comando predeterminado. Manejo avanzado de las situaciones de hardware, en especial de los errores. El núcleo del sistema operativo recibe mensajes del sistema de manejo de errores del hardware y reacciona inmediatamente, al menos para reportarlo. El sistema operativo puede notar que un procesador está “fallando mucho” y no volverá a despachar tareas al mismo. Puede activarse la función de “revisado permanente AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 24 de la RAM” (memory scrubbing), y si algo de la misma está “fallando mucho” no volverá a usar las páginas de RAM relacionadas. El sistema operativo puede notar que un disco tiene problemas para escribir uno o más sectores de disco y puede reubicar los datos en otro lugar, predeterminado como reemplazo para salvar el dato antes de que se pierda definitivamente. Si el sistema operativo tiene configuradas “Direcciones IP Virtuales” (Virtual IP Addressing, VIPA), tendrá asociadas más de una tarjeta de red con una sola dirección IP; con una de las tarjetas “activa” y otra “en espera”. Si la tarjeta de red activa falla, se activará la tarjeta en espera, con la dirección IP y la dirección física asociadas –MAC addresscon la VIPA. Si el sistema operativo tiene configurados “Canales Ethernet” (EtherChannels), tendrá asociadas más de una tarjeta de red con una sola dirección IP y con una sola dirección física, y todas las tarjetas de red activas, siendo “agregadas”. Cuando hay fallas en las tarjetas, el canal ethernet agregado sigue funcionando, como si estuviese completo. En AIX se puede activar “Descubrimiento Automático del mejor MTU para una Ruta” (Automatic Path MTU Discovery), en donde, usando paquetes ICMP de tipo echo –pings-, AIX activamente analiza las rutas hasta todos sus clientes remotos, para descubrir el mejor MTU en esa ruta. El mejor MTU en este caso es el tamaño mayor de paquete en el que contínuamente no se pierden los mismos. En AIX se pueden activar múltiples enrutadores predeterminados para: (i) si uno de los enrutadores predeterminados tiene menor “costo” siempre usarlo, a menos que se pierda la comunicación con el mismo por un tiempo. Cuando se deja de usar uno de los enrutadores predeterminados comenzará a comunicarse usando otro de los enrutadores predeterminados, que le siga en “costo”. Después de un tiempo, AIX intentará revisar si el enrutador de menor “costo” responde nuevamente –usando ecos ICMP, ping - y, si lo hace, volverá a trabajar permanentemente con el mismo. (ii) Usar OSPF (Open Shortest Path First, protocolo de enrutamiento avanzado inventado por Cisco), y con el mismo determinará cómo balancear la carga en las comunicaciones por múltiples rutas, para no usar solamente una ruta o enrutador “preferido”. En AIX están incluidos o se pueden usar (por ejemplo implementaciones descargables de Internet) los protocolos de comunicaciones y de seguridad que la industria ha preferido o estandarizado, para que el sistema se No se esper a que un pueda considerar “realmente abierto”: IPv4, IPv6, ARP, RARP, EtherChannel sig a funcionando TCP, UDP, ICMP, IGMP, RIP, OSPF, BGP, EGP, SMB, CIFS, SSL, cuando todas las tarjetas que lo componen deja de funcionar al SSH, Kerberos, LDAP, DHCP, DDNS, NFS v2/v3/v4, NIS, NIS+, tie mpo. SLIP, PPP, IPX/SPX, ATM, X.25, Frame Relay, y otros. Con AIX se incluyen muchos paquetes de software de código AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 25 abierto, siendo IBM patrocinador de tanto Linux como de paquetes base de la Internet actual, tales como Sendmail, Bind, RouteD, GateD, ISC DHCP, OpenSSL, OpenSSH, Samba, Apache. AIX tiene uno de los mejores esquemas de manejo de inventario de paquetes de software que se puedan encontrar en cualquier tipo de plataforma, no sólo en UNIX. AIX tiene integrado el software “Manejador de Volúmenes EtherChannel es Lógicos” (Logical Volume Manager, LVM), hace más de una el nombre co m er ci al qu e us a Ci sc o, década. Con el LVM se hace el manejo del espacio en discos de empresa qu e se función. En otro inventó la manera flexible, poderosa, pero sobre todo, totalmente s ambientes hacer lo mismo se denomina dinámico, y en donde casi todo se hace “en caliente”. Este ethernet bondin g o channel agregation software es tan reconocido que versiones anteriores son la base para los manejadores de espacio de otros sistemas operativos UNIX como Digital OSF/1 y HP-UX. IBM en 2000 regaló código fuente para que en Linux se pudiera implementar un LVM usable y funcional. AIX puede usar (i) el software incluido IPSEC, para la seguridad IP. O (ii) se pueden definir reglas locales de cortafuegos (firewall) para que se controlen los protocolos que entran, salen, o se enrutan a través de la máquina. Por último, AIX puede ser administrado por comandos de línea, por menús validados, por interfaz gráfica o por una página web, o a través de un cliente gráfico cliente/servidor instalable en Windows o Linux x86. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 26 Sistemas Operativos UNIX Historia, Terminología Definiciones 1970 1980 1990 2000 2010 8.1 FreeBSD NetBSD 4.4 OpenBSD 4.6 BSD (Berkeley Software Distribution) Bill Joy SunOS (Stanford University) 11.0 Solaris (Sun Microsystems) NextStep Darwin 3.2 Mac OS X Xenix 6.4 Apple SCO - Microsoft GNU/Hurd GNU Richard Stallman 2.6.26 Linux Linus Torvalds Minix 3.0 Andrew S. Tanenbaum Unix Time Sharing System (Bell Labs) 10 Ken Thompson - Dennis Ritchie HP-UX (Hewlett-Packard) 11 6.1 AIX (IBM) UnixWare (Novell/Univel/SCO) Irix (Silicon Graphics) 7.1 6.5 Los sistemas UNIX (oficialmente UNIX®) tienen una muy larga historia, siendo desarrollados inicialmente en las décadas de 1960s y 1970s, por un grupo de empleados de la compañía norteamericana AT&T, entre los que se destacan Ken Thompson, Dennis El lenguaje C fue desarrollado C. Ritchie y Douglas McIlroy. Los sistemas UNIX se han ido derivando en po r B ri an K er ni gh an y Dennis C. Ritchi diversas ramas, desarrolladas a través del tiempo tanto por AT&T como e. UNIX fue desarrol El sistema lado por Ken por numerosas otras compañías comerciales. Desde comienzos de la Th om ps on y década de 1990, también se han desarrollado variantes libres, creadas por Ritchie. El mismo!D en ni s C . grupos no muy unidos de desarrolladores diseminados a lo ancho del planeta. Durante los finales de la década de 1970 y durante la década de 1980, la influencia de UNIX en los ámbitos académicos llevó a una la adopción en gran escala de UNIX en empresas incipientes (en especial de la variante BSD originada en la Universidad de California, sede AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 27 Berkeley), de las cuales la más notable es Sun Microsystems. Hoy en día, adicionalmente a las variantes comerciales certificadas de UNIX (como IBM AIX) se han popularizado ambientes estilo UNIX como Linux y las versiones BSD libres. Los sistemas UNIX son ampliamente usados como estaciones de trabajo y como servidores (especialmente con la reciente popularidad de los sistemas Linux). El ambiente UNIX y el modelo de programas cliente servidor fueron elementos esenciales en el desarrollo de la Internet y en la reforma de la computación centrada en las redes en vez de estar centrada en los sistemas de computadoras individuales. Ambos, UNIX y el lenguaje C de programación fueron desarrollados en AT&T y distribuidos a numerosas organizaciones gubernamentales y académicas, causando que ambos fuesen portados a numerosas familias de sistemas, mucho más que otros sistemas La propiedad inte lectual de los operativos. Como resultado, UNIX se volvió sinónimo de “sistema abierto”. códigos fuentes UNIX fue diseñado para ser portable, multi-tarea y multi-usuario, en una configuración de “ejecución por tiempo compartido”. Los sistemas UNIX se caracterizan por varios conceptos: el uso de archivos de texto para almacenar datos; un sistema de archivado jerárquico; tratar los dispositivos y ciertos esquemas de comunicación entre procesos como archivos; y por el uso de una gran cantidad de programas pequeños que pueden encadenarse muy fácilmente a través de “tuberías” en un intérprete de comandos, en vez de tenerse programas grandes, poderosos, complejos y monolíticos que realicen de todo. Todo esto junto se denomina “la filosofía UNIX”. originales de UNIX estuvieron en entredicho a principios de l debido a los ale siglo XXI, gatos de la compañía The SCO Group. Af or tu na da m en te en lo s estrados judiciale s se resolvió el asunto a favor de en la segunda Novell Inc. se agosto de 2007 mana de . Todos los derechos in tel relacionados co e c t u a l e s n original de UNIX so el código n de Novell, compa propiedad ñía que ha asegurado pública m no va a demanda ente que r a nadie – nadie diferente de SCO Groupdebido a su propiedad intelectual. Actualmente, una compañía o grupo de desarrolladores que deseen usar el nombre UNIX debería certificar su producto, que le da derecho –entre otras cosas- a usar el nombre UNIX. Qué compone a un UNIX, cómo se comporta y cómo funciona está estandarizado, según unos documentos actualmente llamados Single Unix Specification v3, o UNIX 03 para acortar. Este mismo estándar también es el estándar IEEE POSIX 1003.1 e ISO/IEC 9945. Es decir que usar UNIX no vuelve a la compañía o individuo totalmente dependiente de los caprichos y conveniencia de una compañía o grupo de desarrolladores. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 28 Componentes de un Sistema UNIX Applicacio nes Shells GUIs Sistema de Archivado Núcleo Hardware driver Tarj Los sistemas UNIX modernos son muy modulares, permitiendo combinarse, descombinarse o recombinarse los módulos según sean las necesidades de la implementación. La mayoría consta de los siguientes módulos: Núcleo del sistema o kernel Sistema de archivado o file system Intérprete de comandos o shell Ambiente gráfico de escritorio o GUI Editores de texto Lenguajes de programación Sistemas de control Numerosas utilidades Teniendo esta mentalidad, por ejemplo, la empresa canadiense QNX ofrece y vende una solución para instalar en sistemas de control de automóviles que es una versión de UNIX sin intérprete de comandos ni ambientes de escritorio, constando sólo del núcleo del sistema, del sistema de archivado y los sistemas de control; pero también vende una solución del mismo UNIX que incluye el resto de los módulos aquí mencionados, ofrecido como una solución integral para estaciones de desarrollo; y además vende otra solución del mismo que AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 29 incluye un ambiente gráfico como sistema de consola de conductor para vehículos modernos de lujo. La mayoría de los UNIX están hechos de manera que algunos de los módulos pueden ser reemplazados por otros sin cambio fundamental en la funcionalidad, por ejemplo IBM AIX puede instalarse en sistemas de archivo JFS o JFS2; Solaris puede instalarse con ambiente gráfico Motif® o con ambiente gráfico Gnome; y Linux puede instalarse en PCs modernos con kernel de 32 o kernel de 64 bits. En los siguientes apartes se describen y se explican con mayor detalle la función y particularidad de los módulos que componen a un sistema operativo típico UNIX, y cómo se relacionan entre sí. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 30 El Kernel o Núcleo del Sistema Operativo Applicacio nes Shells GUIs Sistema de Archivado Núcleo driver Hardware tarjeta Las principales tareas de un sistema operativo avanzado son: Administración de la memoria Control de los procesos Administración de los sistemas de archivado Control de la entrada y salida (I/O) Estas tareas son llevadas a cabo a través de un conjunto de instrucciones dado por el sistema operaciones. Estas instrucciones son denominadas “llamados al sistema” (system calls), que son responsables de funcionar como interfaz para los programas de los usuarios y forman – en conjunto- lo que es conocido como el “núcleo” (kernel) del sistema operativo. Mirándolo de esta manera, los sistemas operativos estilo UNIX no “corren”, si no que el conjunto de funciones que lo forman es usado o invocado por las aplicaciones que ejecutan “arriba”. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 31 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 32 Sistemas de Archivos/de Archivado Shells Applicacio nes GUIs Sistema de Archivado Núcleo Hardware driver tarjeta UNIX en un sistema operativo en el que, al igual que en DOS y MS Windows, la organización de los datos usables es en una estructura jerárquica de archivos, organizada en directorios, presentando una estructura de árbol invertido a los usuarios, en donde los directorios son ramas y los archivos son hojas. A diferencia que en DOS y MS Windows, en los UNIX en un momento dado hay sólo un árbol, sin importar cuántos discos y unidades haya en el sistema, y de ése único árbol dependen toas las ramas-directorios. En principio se puede suponer que no existe una limitación en cuanto a amplitud y profundidad del árbol, pero en la práctica sí existen límites; límites que dependen de la clase de UNIX, de la versión, del espacio disponible, del formato, etc. En la práctica, en todos los UNIX modernos los limites son suficientemente grandes como para que el trabajo de todos los días pueda realizarse sin estar teniéndolos en cuenta. Nomenclatura de archivos En todo UNIX el concepto de archivo es básico. Toda la información del sistema está almacenada de alguna manera en archivos, donde cada uno tiene un apuntador único que usa el sistema operativo para llegar a los datos contenidos y al menos un nombre, que usan los usuarios para indicar al sistema operativo cual apuntador usar. Es clave reconocer que en un mismo sitio no pueden haber dos archivos con el mismo nombre, ni tampoco dos archivos diferentes con el mismo apuntador. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 33 Conceptos: Directorios En UNIX un directorio es un archivo con un formato interno especial que usa el sistema operativo como catálogo parcial de unos contenidos. Como dentro de un directorio pueden haber otros directorios y archivos, con éstos se arma la estructura que los usuarios ven como jerárquica. Como los directorios son archivos especiales todas las reglas que aplican para los archivos también aplican para los directorios. Note que en UNIX, los archivos sí ocupan espacio en disco. Conceptos: Archivos En UNIX un archivo es una entrada en un catálogo que se usa a través de un nombre. Dicha entrada le sirve al sistema para acceder a un apuntador, y con dicho apuntador las aplicaciones de los usuarios pueden acceder a la información –en bytes- que les interesa a los usuarios guardar o leer. Los archivos que los usuarios normalmente usan en UNIX se llaman “archivos corrientes”, ya que hay otros –como los directorios- que no se usan como archivo, pero que realmente lo son. Toda la información en UNIX está guardada en archivos, y toda información puede manipularse manipulando archivos. En UNIX los archivos comunes son considerados por el sistema operativo como sin estructura, son los programas los que los interpretan con una estructura. La idea de Este concepto es muy poderoso, por lo que -al menos en teoría- todo archivos y directorios “den tro” de otros programa puede abrir y manipular cualquier archivo. Como para el directorios en W indows viene de DOS, y en DO sistema operativo los archivos no tienen una estructura implícita, el S viene de CP/ M , qu e co pi ó di nombre del archivo no tiene ninguna relación forzosa con sus parcialmente de ch a id ea UNIX –pero basándose más en contenidos, ni los contenidos con el nombre. Qué implica esto último? VAX-. Que una foto no tiene porqué tener nombre terminado en .JPG o un archivo cuyo nombre contiene MP3 no tiene porqué ser de música. Adicionalmente, en todo UNIX los archivos tienen “dos partes”. Una parte es la que más les interesa a los usuarios, y es lo que comúnmente llamamos datos. Otra parte más le interesa al sistema, y es lo que comúnmente llamamos metadatos. Todos los archivos tienen metadatos, aún si se ven vacíos y no contienen datos, así que si un archivo existe ocupará por lo menos el espacio que ocupan sus metadatos básicos. Conceptos: Archivos especiales nodo Los sistemas operativos UNIX necesitan acceso a cierta información clave e importante para funcionar, información que no se almacena típicamente en disco, o que no está almacenada si no que es generada “en caliente”, dinámicamente. Y, como se supone que toda la información está en archivos, a los creadores de UNIX se les ocurrió que dicha información se accediera también usando archivos. Por lo anterior en UNIX existen unos archivos de los que AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 34 lo único que importa son los metadatos, y por ello no tienen espacio en disco –ni reservado ni usable- para la parte de datos, sólo para los metadatos. Estos archivos especiales están marcados particularmente en su área de metadatos –específicamente en su apuntador único- y hay de varios tipos según el fin. Existen: Archivos especiales nodo para acceder al hardware del sistema como un archivo. Los usuarios acos tu trabajar en ento mbrados a rn reconocerán lo qu o gráfico e se conoce como “propiedad es” metadatos. En U como los NIX hay más metadatos que las pr fácilmente visible opiedades s. Archivos especiales de nodo para leer información dinámica del sistema como si ésta estuviera en archivos estáticos. Archivos especiales del sistema para trabajar conexiones de red como si fueran archivos. Archivos especiales del sistema para pasar información rápidamente entre programas locales, como si un programa guardara información y otro la leyera, pero ambos trabajando prácticamente al tiempo. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 35 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 36 Intérfaces de Usuario: Intérprete de Comandos (Shell) Shells Applicacio nes GUIs Sistema de Archivado Núcleo Hardware driver tarjeta Un intérprete de comandos es una aplicación que ejecuta como cualquier otra en el sistema operativo, pero que tiene una finalidad: presenta un indicador donde los usuarios pueden escribir instrucciones para que el sistema las ejecute. Lo especial del intérprete de comandos de UNIX es que desde siempre (casi cuarenta años) ha sido programada por desarrolladores para programadores, por lo que siempre se ha contado en UNIX con un método de programación fácil. De hecho todos los intérpretes de comandos de UNIX disponibles son e implementan un lenguaje de programación bastante completo todo el tiempo. Como cada uno de los intérpretes de comandos de UNIX implementa un lenguaje –y como lo dice el nombre interpretado, no compilado- pueden en todo momento hacerse programas, aún si no se guardan en un archivo si no que se digitan directamente en el indicador. Intérprete de comandos original: sh El intérprete de comandos estándar original de UNIX fue desarrollado por El “indicador de manda tos” de DOS (y de MS W Stephen Bourne, un empleado de AT&T en 1977. Este intérprete de indows) está ligeramente comandos no es muy cómodo de trabajar de manera interactiva porque no parecido a los intém o d e l a d o comandos de U rpretes de tiene manejo avanzado del teclado (menos de las teclas de cursor) y un NIX lenguajes de prog , pero los manejo difícil del histórico de comandos previos. Sin embargo, como se los intérpretes ramación de de completos, a di UNIX son desarrolló pensando en que fuera una herramienta de programación fe lenguaje disponib rencia del le en DOS. tiene muy buenas facilidades en su lenguaje, como variables, redirección, estructuras de control, funciones, y manejo de cadenas de texto sólo limitadas por la memoria. Este intérprete de comandos es tan funcional que fue AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 37 estandarizado completamente en POSIX y por ello debe incluirse obligatoriamente en todo UNIX certificado. IBM AIX y Sun Solaris incluyen Bourne Shell por si se necesita. Intérprete de comandos de la Universidad de Berkeley: csh A comienzos de la década de 1980 Bill Joy desarrolló un intérprete de comandos para la nueva variante de UNIX BSD. Como en UNIX normalmente se desarrollan las aplicaciones en lenguaje C Bill Joy hizo que el nuevo intérprete trabajara la programación Tom Christia con un lenguaje siguiera la sintaxis de este lenguaje de manera muy cerca, hacker Perlnsmenás, el segundo escribió un docu conocido pero que al mismo tiempo no presentara problemas para el operador m f a m o s o t i t u ento muy l ado “La acostumbrado a operar interactivamente con sh. Programación Cs h Co Dañina” (Csh Pr nsiderada ogramming Considered Harm ful). Aunque este intérprete de comandos es más avanzado que el anterior sh, al no estar especificadas todas las construcciones de lenguaje, algunas sentencias se prestan para ser comprendidas por los programadores de manera diferente a como las interpreta el shell, por ello muchos desarrolladores evitan activamente el contacto con C Shell (algunos desarrolladores famosos han hecho “política” activa en contra del intérprete C). IBM AIX incluye C Shell (/usr/bin/csh) por si se necesita. Sun Solaris incluye C Shell y es el intérprete predeterminado del usuario root pero no de los otros usuarios. Intérprete de comandos comercial AT&T: ksh El intérprete de comandos Korn Shell fue desarrollado por David Korn, un empleado de AT&T para ser usado como intérprete estandar de AT&T UNIX. Este software fue propietario y comercial pero estandarizado en 1988. La idea principal de este intérprete fue hacerlo totalmente compatible con los scripts desarrollados para Bourne Shell, y al mismo tiempo lograr que tanto el trabajo interactivo como las facilidades de programación aumentaran totalmente. Es de notar que David Korn logró las tres metas simultáneamente. La versión más común es ksh88, pero algunos UNIX incluyen también ksh93. Ambas versiones cumplen a cabalidad el estandar POSIX. AT&T convirtió al Korn Shell en un proyecto de código fuente abierto en 2000. IBM AIX incluye Korn Shell 88, y es el intérprete predeterminado para todos los usuarios; incluye Korn Shell 93 como /usr/bin/ksh93. Sun Solaris incluye Korn Shell 88 como /usr/ bin/ksh88; incluye Korn Shell 93 y es el intérprete predeterminado para todos los usuarios diferentes de root. Intérprete de comandos de código abierto: bash El intérprete de comandos Bourne Again Shell es un proyecto de código fuente abierto creado como una mejora de las funcionalidades disponibles en Bourne Shell, C Shell y Korn AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 38 Shell. Este proyecto nació en 1987 y se ha popularizado mucho, tanto que es el intérprete predeterminado en los Linux y en Mac OS X. Desde el principio se planeó que fuera completamente compatible con Bourne Shell (el intérprete original) pero que al mismo tiempo sirviese para programar y fuese mucho más fácil de usar interactivamente que los anteriores. Bourne Again Shell (bash) es compatible con Bourne Shell, cumple el estándar POSIX y puede hacerse que funcione totalmente como Bourne Shell. La gran diferencia de Bourne Shell con los otros intérpretes es el uso interactivo del teclado y las facilidades para completar comandos y nombres de archivos, directorios, máquinas y usuarios. Bourne Again Shell se incluye como extra en Sun Solaris. Se incluye en el CD BonusPak de AIX; es el intérprete predeterminado en Linux y en Mac OS X. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 39 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 40 Interfaces de Usuario: Ambientes de Escritorio Gráfico Shells Applicacio nes GUIs Sistema de Archivado Núcleo Hardware driver tarjeta Los UNIX modernos pueden usarse interactiva y gráficamente, es más, unos de los primeros sistemas operativos en contar con una interfaz gráfica fueron los UNIX, con la aparición del sistema X Window System, desarrollado en el MIT (Massachussets Institute of Technology) en 1984; y una variante, NeXTSTEP fue completamente gráfica desde el lanzamiento en 1989 (realmente desde las vistas previas en 1986). El esquema y protocolo actual llamado X11 es la base de los entornos gráficos de casi todos los UNIX (hay otros, como Photon en QNX Neutrino y Aqua en Mac OS X, pero ambos incluyen y soportan también X11). Ahora, X11 no implementa un ambiente gráfico si no un esquema para la especificación de pixeles, coordenadas, colores, y eventos de teclado y Mouse entre otros, por lo que “encima” de X11 se desarrollan los verdaderos ambientes de escritorio gráfico. Ahora, como X11 es también un protocolo de red, las aplicaciones gráficos desarrolladas con base en X11 pueden y de hecho funcionan a través de una red. Con base en X11 se han desarrollado múltiples ambientes de escritorio gráfico, siendo los más conocidos: AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 41 Gnome (GNU Network Object Model Environment) Gnome es un proyecto internacional de código fuente abierto que produce dos ambientes: el ambiente de escritorio gráfico Gnome y el ambiente de desarrollo Gnome. La idea del ambiente gráfico Gnome es la de implementar un ambiente de escritorio gráfico con ideas comunes a los otros ambientes populares, que sea fácil de usar, que sea completo y que se pueda traducir a todos los idiomas necesarios. El proyecto Gnome fue iniciado por Miguel de Icaza y Federico Mena en agosto de 1997. Gnome es actualmente el ambiente gráfico predeterminado de las distribuciones de Linux más conocidas (Red Hat Enterprise Linux y Ubuntu Linux) y de Sun Solaris 10. Está disponible en diversas plataformas de código abierto y comerciales como OpenBSD, FreeBSD, numerosos Linux, IBM AIX y hasta Apple Mac OS X. El patrocinador principal de Gnome es la compañía Red Hat. En AIX está incluido en el CD BonusPak, en Solaris el ambiente gráfico predeterminado (Sun Java Desktop) es una variante de Gnome. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 42 KDE (K Desktop Environment) KDE es un proyecto internacional iniciado en 1996 por Matthias Ettrich para hacer un ambiente de escritorio gráfico basado en tecnologías de código abierto. KDE está basado en un juego de bibliotecas de funciones que a su vez se basan en Qt, un juego de bibliotecas de funciones desarrolladas en C++ por la compañía noruega Trolltech. KDE incluye además del ambiente de escritorio gráfico un juego de funcionalidades que permiten incluir numerosas aplicaciones en el proyecto: aplicaciones de ofimática, de multimedia, científicas y demás. KDE se centra todo alrededor de la integración de objetos, y así funciona muy bien: integrado. KDE es además transparente a la red, permitiendo que las aplicaciones hechas con KDE trabajen archivos locales y remotos que se acceden a través de los protocolos que el escritorio actual implementa, siendo típicamente más de una docena. KDE tuvo un inicio muy lento, los desarrolladores iniciales se centraron en crear las bibliotecas de objetos y de funciones más necesarias y últimamente se han concentrado más en las aplicaciones. Con esto último, el desarrollo de todo el ambiente se ha acelerado y han logrado más y mejor compatibilidad y desempeño óptimo en más ambientes. Las ideas de KDE hacen que, con el reuso de clases y objetos el ambiente como un todo consuma menos recursos. KDE es actualmente el entorno gráfico predeterminado de las distribuciones de Linux más conocidas en Europa (SuSE Linux y Mandriva). Está disponible en numerosas plataformas de código abierto y comerciales como OpenBSD, FreeBSD, numerosos Linux, IBM AIX y hasta Apple Mac OS X. El patrocinador principal de KDE es la compañía SuSE. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 43 En AIX está incluido en el CD BonusPak, para Solaris es descargable de la página oficial de KDE. La nueva versión 4 próxima a salir este año será lanzada simultáneamente para UNIX/Linux, Windows y Mac OS X sin necesidad de X11. CDE (Common Desktop Environment) CDE es un ambiente de escritorio gráfico propietario y comercial basado parcialmente en un juego de bibliotecas de funciones llamado Motif™. CDE salió de la “Iniciativa de Software Abierto Común” (COSE), un proyecto en conjunto de Hewlett-Packard, IBM, Novell y Sun Microsystems, iniciado en 1993. Para el 2000, CDE era considerado el estándar de hecho para las interfaces gráficas de los ambientes UNIX. En 2001, tanto HP como Sun decidieron cambiarse de CDE a Gnome como base del ambiente gráfico para HP-UX como para Sun Solaris, sin embargo, en 2003, HP decidió devolver HP-UX al ambiente CDE por considerar que Gnome no cumplía con los estándares de estabilidad y confiabilidad que necesitaba HPUX. Sun Microsystems continúa usando Gnome como base de Java Desktop System, el ambiente gráfico de Solaris, pero tanto como HP-UX y AIX centran sus ambientes gráficos predefinidos en CDE. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 44 Aplicaciones generales en UNIX: Editores de Texto Shells Applicacio nes GUIs Sistema de Archivado Núcleo Hardware driver tarjeta Originalmente UNIX fue creado para desarrollar manuales técnicos –es decir texto-, y como el sistema apenas se estaba creando, había de desarrollar y programar las utilidades, a partir de código fuente para compilar –es decir texto-; por todo ello, las herramientas más centrales de los sistemas UNIX son las que procesan texto puro, y de ellas las más importantes son los editores de texto (a diferencia de otras plataformas donde el editor de texto es algo muy básico y casi despreciable). En UNIX siempre ha habido al menos un editor de texto poderoso, pero obvio, esto como todo ha ido evolucionando con el tiempo. En un sistema UNIX moderno pueden encontrarse hoy en día editores de texto como: ed ex vi Emacs inED nano Gedit Kate Como muchas cosas en UNIX, algunos de los editores arriba mencionados son estándares y otros no. En especial, de arriba, ed, ex, vi están estandarizados (en POSIX), y además son requeridos para que un UNIX pueda llamarse UNIX. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 45 Editor ed El editor ed es uno de los originales en UNIX, es una aplicación de desarrollo muy sencillo (pero no de uso muy sencillo), rápida y liviana. Es un programa editor de texto por comandos de línea, cómo se muestra en el ejemplo siguiente: $ ed prog.c ? prog.c a int main() { printf( “Hola mundo!\n” ); return 0; } . w q $ Esta secuencia de teclas crea el siguiente archivo: int main() { printf( “Hola mundo!\n” ); return 0; } guardándolo en prog.c, donde el primer comando confirma que se creará el nuevo archivo “prog.c”, y que se le agregará texto con el comando a (append), se termina de entrar texto en el comando a con un punto solo en una línea, se guarda el archivo con el comando w (write) y se sale del editor con el comando q (quit). Aunque es muy útil, y se pueden hacer macros con ed, ya no es muy usado, estando los usuarios más acostumbrados a trabajar con editores de texto que tienen no comandos, si no interfaces. Pero, ed sigue siendo útil para desarrollar macros. Editor vi El editor vi (se supone que es Visual Editor) es un editor de texto modal estandarizado completamente en POSIX, incluido en IEEE Spec 1170. Es un editor de Aprenderemos a texto muy poderoso, pero por ser modal es un poco difícil de usar en us todo un capítulo ar vi en dedicado al un comienzo, pero dar los primeros pasos en él no es demasiado mismo complicado. Aunque haya disponibles en todos los UNIX más editores de texto (tal vez de modo gráfico como dtpad, gedit, kate y más), este editor está incluido en el estándar UNIX’03 como obligatorio, por lo que todos los UNIX lo incluyen y vale la pena aprender a usarlo. vi es usable en los ambientes más inhóspitos (editar un archivo de configuración no es fácil a través de un acceso remoto de comandos a 9600bps). Los sistemas UNIX tienen vi disponible hasta en el modo de recuperación cuando el sistema no sube completo. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 46 Nota: Cuando se habla de modal se habla de la característica que tiene vi –así como otras aplicaciones de la época- de que las teclas funcionan y tienen significado según el modo en el que la aplicación esté. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 47 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 48 Aplicaciones generales en UNIX: Ambientes de Desarrollo Shells Applicacio nes GUIs Sistema de Archivado Núcleo Hardware driver tarjeta Como el diseño original del sistema UNIX en AT&T se debió a la necesidad de que unos desarrolladores desarrollaran documentación técnica (realmente manuales de desarrollo) que no había como imprimir adecuadamente en el momento, el sistema UNIX original incluía las herramientas de desarrollo de manera estándar. También, cuando comenzó a popularizarse más UNIX fue cuando entró en la academia, donde la Universidad de California sede Berkeley (UCB) mejoró aún más las facilidades para los desarrolladores. Por todo ello, UNIX tradicionalmente ha sido un ambiente “de programadores para programadores”, por lo que ha habido la fácil manera de hacer desarrollo en estos sistemas. Mientras un UNIX de código libre (open source) incluye todas las herramientas de desarrollo en los medios de instalación, es común que un UNIX comercial típico (como Sun Solaris o IBM AIX) NO incluya el ambiente de desarrollo para los lenguajes C y C++. De todas maneras lo común para el desarrollo en UNIX es: Editor de texto sensible al contexto de desarrollo (o que al menos maneja la sintaxis). FreeBSD y OpenBSD ponen a disposición del administrador ambientes completos de desarrollo de código abierto como KDevelop. Apple incluye XCode en los medios originales de instalación, siendo éste es el ambiente integrado de desarrollo basado en GCC con el que se desarrolla todo el sistema operativo al interior de dicha compañía. Facilidades para el manejo de versiones de código: CVS o al menos RCS. CVS es Concurrent Versions System y RCS es Revisions Control System. Es de notar que AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 49 otros ambientes de manejo de versiones están disponibles para UNIX, algunos gratis y de código abierto. Compiladores e intérpretes: Todos los UNIX deben incluir algunos intérpretes de lenguajes porque están estandarizados por POSIX. Lo básico son los shells, que además de interpretar interactivamente los comandos también son intérpretes de lenguajes bastante completos –existen hasta librerías para desarrollo gráfico en ksh-. Adicionalmente los UNIX incluyen sed, awk, Perl y muchas veces Python. Los UNIX modernos incluyen también un ambiente de Máquina Virtual de Java (aquí se incluyen Mac OS X, AIX y Solaris). Algunos UNIX incluyen GCC, The GNU Compiler Collection en los medios originales, aunque no se instale de manera predeterminada (aquí se incluyen AIX y Mac OS X). Adicionalmente, aunque cada compañía que produce un ambiente UNIX comercial –excepto Apple- tiene y vende su propio ambiente integrado de desarrollo, es posible conseguir y descargar GCC (The GNU Compiller Collection) para cada hardware y versión de UNIX específica. IBM ofrece los ambientes de desarrollo XL (XL C, XL C++, XL Cobol, XL PL1, XL Fortran). IBM ofrece además la familia de soluciones Rational Rose, para modelado y desarrollo en Windows, Linux, AIX, Sun Solaris y HP-UX; con los ambientes IBM Rational Rose se puede modelar y desarrollar en C, C++, Java, ADA y Corba. Del editor/modelador original IBM Racional salió una herramienta de desarrollo de código abierto muy conocida llamada Eclipse. Sun ofrece Sun Studio (para desarrollo C, C++ y Fortran), y Java Studio Creator y Java Studio Enterprise (para desarrollo Java obviamente). Java al fin y al cabo es un producto Sun. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 50 Perfiles de Usuarios y de Grupos de Usuario Los sistemas UNIX han sido casi desde el comienzo sistemas multiusuario, por lo que para trabajar con ellos no se necesita únicamente el hardware y el software, si no además un perfil de usuario. Un perfil de usuario –más comúnmente llamada una cuenta de usuario- es una definición junto con un nombre y un método de acceso –y de control de acceso- que permiten conectarse, identificarse y autenticarse con un sistema UNIX para iniciar y ejecutar tareas y aplicaciones. Cuando se hace la instalación predeterminada están creados en un sistema UNIX numerosos perfiles de usuario y perfiles de grupos de usuario, pero la mayoría de estas cuentas de usuario son para uso interno de los procesos del sistema operativo, no para el uso interactivo de los usuarios. En un sistema UNIX tradicional sólo una cuenta de usuario permite el uso interactivo, y esta cuenta lleva por nombre “usuario root”. Como esta cuenta de usuario trabaja con el identificador interno número cero (0) el sistema operativo no le forza controles de seguridad, por lo que típicamente puede ejecutar toda tarea sin limitaciones por permisos o controles de seguridad. Los sistemas UNIX más modernos –en especial los basados en código fuente abiertoadicionalmente solicitan la creación de al menos un perfil de usuario adicional para bloquear el acceso directo a la cuenta de usuario ilimitada root –entre estos tenemos FreeBSD y Mac OS X-. Como cualquiera que sepa cómo es el nombre de la cuenta podría usarla –en especial root siempre existe y está disponible en algunas variantes de UNIX como Solaris y AIX-, los sistemas multiusuario implementan alguna manera de autenticación, siendo la típica una contraseña. Teniendo ambos, el nombre de la cuenta y la contraseña correspondiente, hay ya como conectarse y trabajar con UNIX. Una manera típica si el ambiente es pequeño –estación de trabajo- es directamente en la consola, que comúnmente muestra un ambiente gráfico de entrada –XDM en AIX, GDM en Solaris y window_login en Mac OS X-. La otra manera típica si el ambiente es grande –servidor- es conectarse desde un cliente usando TELNET –en AIX y Solaris- o SSH –en OpenBSD, FreeBSD y Mac OS X-. Como este curso está orientado al uso remoto de servidores, el estudiante debe buscar la manera de obtener acceso a un indicador de comandos, que se obtiene localmente ejecutando la aplicación Terminal en Mac OS X, Gnome Terminal en Solaris y DtTerm en AIX. Note que aunque Solaris, AIX y OpenBSD no obliguen a crear una cuenta de usuario noroot para el trabajo diario, es mejor crear una lo más pronto y trabajar directamente con ésta siempre. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 51 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 52 Comandos Básicos de UNIX Comandos Básicos de Sesión de Usuario Como se mencionó antes, las primeras acciones de un usuario UNIX para trabajar en un sistema son conectarse, identificarse y autenticarse. Además debería conocer unos comandos mínimos, comandos que conoceremos a continuación. Entrar al sistema Para entrar al sistema primero hay que conectarse, comúnmente usando TELNET o SSH. El sistema preguntará un nombre de cuenta de usuario y luego de entrarse (y presionando ENTER) preguntará comúnmente una contraseña. Esto se llama identificarse (informar quién soy) y autenticarse (demostrar que sí soy). Note que es muy común que al escribir la contraseña no se vea nada: Quién soy (qué usuario soy): whoami Un comando básico que permite saber en qué cuenta (o bajo qué identidad de usuario) está trabajando un intérprete de comandos es whoami: [YOU HAVE NEW MAIL] e@abe:e/> whoami e e@abe:e/> Como se observa, sólo informa el nombre de la cuenta. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 53 Quienes están en el sistema (qué usuarios están conectados): who Para saber con quienes se comparte el trabajo interactivo con el mismo sistema existe estándar en UNIX el comando who: e@abe:e/> who root pts/0 e pts/1 root pts/2 e@abe:e/> Aug 07 18:18 Aug 07 18:24 Aug 07 18:27 (Moe.lan) (Moe.lan) Hay dos usuarios conectados, pero un usuario (root) tiene dos sesiones. Como se observa el comando muestra: El nombre de cada usuario por sesión. En este caso son root y e. Cómo se llama el archivo que representa la ventana o conexión. En este caso son pts/X. Cuándo inició la sesión. Muestra la fecha y la hora. Desde dónde se inició la sesión. Si no muestra, típicamente es la consola gráfica de la máquina. Si muestra algo entre paréntesis es el nombre de red o dirección de red de la máquina cliente desde donde se inició la sesión. A qué grupos pertenezco: groups Como cada perfil de usuario está incluido o asociado a al menos un grupo –de usuariosexiste el comando groups, con el que se puede conocer a cuáles grupos pertenece la cuenta de usuario actual: e@abe:e/> groups system staff adm security cron printq audit perf shutdown e@abe:e/> El usuario del ejemplo pertenece a bastantes (9) grupos simultáneamente! Cambiar mi contraseña: passwd Cuando un administrador del sistema crea una nueva cuenta/perfil de usuario le asigna una primera contraseña. Como esta contraseña se la informa al nuevo propietario de la cuenta para que pueda conectarse, son dos personas las que conocen dicha contraseña, y como un secreto que conocen dos personas ya no es secreto, una de las primeras acciones que debería realizar un usuario después de conectarse la primera vez es cambiar la contraseña de su cuenta a algo que sólo el usuario conozca. Para cambiar la propia contraseña se usa el comando passwd: e@abe:e/> passwd Changing password for "e" e's Old password: e's New password: AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 54 Enter the new password again: e@abe:e/> Salir y desconectarse de la sesión: logout Todo lo que se haga o se ejecute desde una cuenta de usuario se reconoce en el sistema como viniendo de dicho usuario. Si un usuario deja una sesión abierta y se realizan operaciones negativas, perjudiciales o dañinas lo más seguro es que se responsabilice al usuario, por ello, debería cerrar su sesión apenas termine de trabajar con la misma. Hay varias maneras de cerrar la sesión. Con el comando simple logout, con el comando simple exit o con la combinación de teclas ctrl d –estas dos últimas sólo funcionan si es la única instancia del intérprete de comandos que ha iniciado el usuario. Cuando un usuario entra a un UNIX, el subsistema de autenticación del sistema operativo le busca dos atributos –entre otros-, para llevar a cabo un par de cosas: Busca un atributo “directorio personal o inicial de la cuenta de usuario”. Si encuentra dicho atributo el sistema primero se para en tal directorio para continuar. Si el directorio no se encuentra típicamente al usuario se lo ubica en / usr/guest o en /. Es posible hacer que más de un usuario compartan un mismo directorio inicial –ya no directorio personal-, pero esta práctica no es muy común. Busca un atributo “programa inicial de la cuenta de usuario”. Si encuentra dicho atributo el sistema ejecuta al programa inicial como si fuera el usuario. Si el programa inicial no se encuentra, el usuario es expulsado inmediatamente entre correctamente su contraseña. Es común que sistemas sin mucha personalización “dejen” a los usuarios en algún ambiente intérprete de comandos, ya que es la configuración básica y predeterminada de los sistemas. preconfigura a los usuarios para que inicien con /usr/bin/ksh (el ‣ AIX Korn Shell 88), incluso al usuario root. preconfigura a los usuarios para que inicien con /usr/bin/ksh (el ‣ Solaris Korn Shell 93), pero con /usr/bin/csh (el C Shell) para el usuario root. ‣ Mac OS X preconfigura a los usuarios para que sus sesiones de texto sean con /usr/bin/bash (el Bourne Again Shell), y no permite el acceso al usuario root –el usuario root ni siquiera tiene contraseña para acceder-. ‣ FreeBSD preconfigura a los usuarios para que sus sesiones de texto sean con /usr/bin/bash (el Bourne Again Shell), y /usr/bin/sh (Bourne Shell original) para el usuario root. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 55 ‣ OpenBSD preconfigura a los usuarios para que inicien con /usr/bin/ksh (el Korn Shell 93), incluso para el usuario root. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 56 Los UNIX no tiene n un estándar de todos los com andos, pero sí cumplen obligat oriamente un estándar com a comando para la n d o p o r mayoría de los comandos. En este punto es do diferencia Apple nde más se Mac OS X de los otros Unix. El formato predeterminado de disco de Mac OS X no es sens m ay ús cu la s, en ible a las to nombres de lo nc es lo s s comandos tampoco. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 57 Estructura “estandar” de los comandos Aunque los UNIX no tienen un estándar que deban seguir todos los comandos, sí hay un “estándar de hecho” que siguen casi todos los comandos: comando –opciones argumentos Básicamente lo que hay que observar es que primero se escribe el comando, segundo – posiblemente- se escriben las opciones, y de último los argumentos. Acerca de los comandos La mayoría de los comandos en UNIX son programas-archivo ejecutables, que el sistema operativo busca por nombre en unas ubicaciones estandarizadas pero configurables en disco. Como la mayoría de formatos de disco de la mayoría de los UNIX diferencian entre mayúsculas y minúsculas en los nombres, entonces los comandos se diferencian entre mayúsculas y minúsculas. Unos comandos son internos de cada intérprete de comandos (aquí se llaman builtins), y en este caso también cumplen con el formato y la sensibilidad a las mayúsculas, incluso en sistemas como Apple Mac OS X que no es sensible por lo general. Note que los comandos son en inglés o abreviaturas del inglés sin importar como esté configurado un sistema UNIX –realmente un sistema UNIX no está instalado en un idioma, está configurado con al menos un idioma-. Siguiendo una “antigua tradición” los comandos en los sistemas UNIX son abreviaturas muy cortas de nombres obvios de operaciones (por ejemplo para copiar archivos se usa cp, abreviatura de la operación copy en inglés!). Acerca de las opciones Las opciones son switches que cambian “algo” en el funcionamiento de un comando, y, como no siempre se quiere cambiar el funcionamiento básico de un comando, son pues, opcionales. La mayoría de las veces las opciones son letras individuales que casi siempre deben llevar un prefijo – cuando se escriben “sueltas” y que no llevan un prefijo – cuando no se escriben sueltas. Un ejemplo: el comando cp puede preguntar si se copia archivo por archivo cuando se le especifican varios, pero normalmente no lo hace, a menos que se incluya la opción i, y normalmente no quiere destruir archivos si se pudiese pero los permisos dicen que no, pero se le puede dar la opción f. Si se quieren usar ambas opciones se puede usar cp –i –f … o se puede usar cp –if … Nótese también que casi nunca el órden de las opciones afecta, pero sí la diferenciación entre mayúsculas y minúsculas. Se verá comando por comando conforme sea el caso. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 58 Las primeras máq uinas donde se usaron los conceptos de “s er vi do r” y de “c lie nt e/ servidor ” fueron UNIX. Nótese ta m bi én qu e TC P/ IP fu e desarrollado en los UNIX de la familia ambientes BSD. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 59 Comandos relacionados con la fecha y la hora El tiempo (la fecha y la hora) es un ítem muy importante en un servidor, en especial notando que muchos usuarios acceden a los servicios del servidor al mismo tiempo, y que UNIX está muy asociado con el concepto de “servidor”. Note esLa suigma de user mas sys no ual a real que los sistemas UNIX siempre están anotando ciertos eventos en algún sistema es multit porque el area, así qu tipo de registro cronológico de eventos –casi siempre un simple archivo taapmar te de nu es tr a ta re ae bién hace otras ta reas. de texto-. Como los sistemas UNIX tienen muy buenas capacidades de trabajo para el acceso remoto, y que a muchos de estos sistema se ingresa desde múltiples países/husos horarios, cuál será la hora que aplica para los eventos? Pues la hora en el servidor! Qué fecha y hora es en el servidor: date El comando date sin parámetros muestra la hora del servidor, en un formato estandarizado y teniendo en cuenta la ubicación geográfica y de horario de verano. Adicionalmente tiene unas opciones que permiten seleccionar cómo quiere que se muestra la fecha y o la hora. Lo más sencillo, sin opciones: e@abe:e/> who am i root pts/0 Aug 13 20:11 e@abe:e/> date Mon Aug 13 21:06:42 EST 2007 e@abe:e/> (moe.lan) Y ahora, con opciones: e@abe:e/> date Mon Aug 13 21:07:21 EST 2007 e@abe:e/> date +"%Y-%m-%d %H:%M:%S" 2007-08-13 21:07:38 e@abe:e/> date +"%Y-%m-%d %H:%M:%S" 2007-08-13 21:07:46 e@abe:e/> Note que los sistemas UNIX son muy precisos en llevar la hora exacta, pero sólo si se mantienen encendidos, y que, adicionalmente, en UNIX se “inventaron” un protocolo para el mantenimiento de una hora sincronizada con una central a través de la red hace un par de décadas. Cuánto se demora una tarea: time Muchas veces es necesario conocer cuánto se demora una tarea o comando. En los sistemas UNIX no hay que buscar un cronómetro y esforzar el pulso, sólo hay que conocer el comando adecuado: time. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 60 Cuando se antepone el comando time a un comando o juego de comandos, el sistema ejecuta el comando o juego de comandos, y al final reporta tres contadores: Cuánto se demoró el comando ejecutando instrucciones dentro del núcleo del sistema –en UNIX se llama tiempo de kernel o sys time-, cuánto se demoró el comando ejecutando instrucciones dentro del propio programa o comando –en UNIX se llama tiempo unprivileged o user time-, cuánto se demoró el comando ejecutando para el usuario, o “tiempo de reloj de pared” –en UNIX se llama wall clock time o real time-. Un ejemplo: e@abe:e/> time nslookup www.interfacelift.com Server: dsldevice.lan Address: 192.168.1.254 Non-authoritative answer: Name: www.interfacelift.com Address: 209.85.64.50 real 0m0.21s user 0m0.01s sys 0m0.01s e@abe:e/> Calendario: cal Como los seres humanos contamos más los días, las semanas y los meses que los minutos y los segundos, todos los sistemas UNIX incluyen el comando cal, que sirve para ver o revisar de manera sencilla un calendario. El comando tiene tres posibles maneras de uso: El comando sólo, sin opciones ni argumentos, El comando con un único número, El comando con dos números. Cuando se usa el comando sólo, cal muestra un calendario representando el mes actual real: e@abe:e/> cal August 2007 Sun Mon Tue Wed Thu 1 2 5 6 7 8 9 12 13 14 15 16 19 20 21 22 23 26 27 28 29 30 Fri 3 10 17 24 31 Sat 4 11 18 25 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 61 Cuando se usa cal con un único número, muestra el calendario del año dado el número, sin hacer ningún tipo de corrección de siglo, es decir ni 7 ni 07 representan 2007, 7 indica el año séptimo a partir de Cristo!. e@abe:e/> cal 2007 2007 January Sun Mon Tue Wed Thu 1 2 3 4 7 8 9 10 11 14 15 16 17 18 … … 23 24 25 26 27 30 November Sun Mon Tue Wed Thu 1 4 5 6 7 8 11 12 13 14 15 18 19 20 21 22 25 26 27 28 29 Fri Sat 5 6 12 13 19 20 February Sun Mon Tue Wed Thu Fri Sat 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 28 29 28 Fri 2 9 16 23 30 Sat 3 10 17 24 29 30 31 December Sun Mon Tue Wed Thu Fri Sat 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Cuando se usa el comando cal con dos números, el comando muestra un calendario del mes del primer número en el año segundo número: e@abe:e/> cal 5 1974 May 1974 Sun Mon Tue Wed Thu Fri 1 2 3 5 6 7 8 9 10 12 13 14 15 16 17 19 20 21 22 23 24 26 27 28 29 30 31 Sat 4 11 18 25 Trivia: Quién sabe qué pasa con el calendario de 1752? AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 62 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 63 Comunicación con otros usuarios UNIX y las comunicaciones Desde los meros comienzos –no exactamente desde el inicio, la verdad- UNIX ha sido multiusuario, por lo que ha tenido buenas facilidades de comunicación con otros usuarios del mismo o de diferente sistema. Mientras en otros sistemas han ido evolucionando, muchas de las cosas que han sido novedad en los últimos años, los usuarios de UNIX las dan por sentado porque las han tenido de alguna manera por décadas. En UNIX es muy fácil cuando se conoce que TCP/IP nació en UNIX, siendo BSD el primer ambiente con una implementación funcionando, y siendo las ideas de sockets de TCP/IP desarrolladas para BSD el estándar de hecho como se programan todas las implementaciones de TCP/IP en todos los otros sistemas en la actualidad. En UNIX siempre ha habido correo, en UNIX nació TCP, nació TCP/IP, nació TELNET, FTP, SMTP, POP, IMAP, y muchísimos protocolos más. En NeXTSTEP -un UNIX - se inventaron HTTP y se hizo la primera implementación de un navegador (browser) y de un servidor de páginas, y en el mismo sistema operativo se implementó HTML!. En UNIX se inventaron CGI y JavaScript. En UNIX se inventaron las direcciones de correo buzón@dominio, y en UNIX se inventaron el chat centralizado y el distribuido por TCP/IP. Sin UNIX no existiría la Internet global como existe hoy en día. Por algo Sun Microsystems en el más grande auge de sus máquinas con Solaris acuñó “The network Is the computer”. Tan importante es UNIX en la Internet, que el modo de transmisión de datos “nativo de la red” es el modo como escribe UNIX texto dentro de un socket. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 64 El usuario debe finalizar el mensaje presiona ndo ctrl d AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 65 Mensajes directos a la sesión: write Una manera sencilla de comunicarse con otro usuario actualmente presente en el sistema es usando mensajes directos escritos con el comando write. La sintaxis básica es muy sencilla: write nombreUsuario. Como este comando sólo envía mensajes directos a la ventana de sesión –a la terminal realmente-, el que escribe/envía debería verificar primero que el usuario al que le va a enviar el mensaje está conectado en el sistema –y que tiene una sesión interactiva de sistema operativo. Ejemplo: Un usuario en su sesión: 0 root@abe:/> who root pts/0 e pts/1 0 root@abe:/> write e Hola usuario! 0 root@abe:/> Aug 14 19:18 Aug 14 19:36 (moe.lan) (moe.lan) y el otro usuario en su sesión: e@abe:e/> Message from root on abe (pts/0) [Tue Aug 14 19:37:50 EST 2007] ... Hola usuario! <EOT> Como puede observarse, el comando write no muestra un indicador al usuario que lo usa para mostrarle que ya puede escribir, pero de hecho, sí le recibe al usuario y sí envía el mensaje. El usuario al que le envían un mensaje no tiene una manera para responder el mensaje según la herramienta, es decir, esta no es una herramienta interactiva. Si el usuario que recibe un mensaje quiere responder debería usar lo mismo: write otroUsuario. Los mensajes que se envían usando write aparecen “encima” del texto que esté observando en su sesión el usuario destinatario, así que dicho texto no tiene nada que ver con el texto del archivo si el destinatario está trabajando un archivo en un editor de texto. Ahora, como puede ser incómodo, el usuario puede controlar si recibe o no los mensajes de otros usuarios, usando el comando mesg, pero, estos controles no funcionan si quien envía es el usuario todopoderoso root. Ejemplo: Un usuario se “bloquea”: 2 root@abe:/> mesg n 1 root@abe:/> El otro usuario intenta comunicarse: e@abe:e/> write root write: 0803-031 Permission denied. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 66 Y si el usuario no puso “bloqueos”: 1 root@abe:/> mesg y 0 root@abe:/> El otro usuario puede enviar: e@abe:e/> write root Hola super usuario! Soy e Al otro usuario le aparece: 0 root@abe:/> Message from e on abe (pts/1) [Tue Aug 14 19:52:04 EST 2007] ... Hola super usuario! Soy e <EOT> El comando write puede usarse también para comunicarse instantáneamente con otros usuarios en otros sistemas si en ambos sistemas está corriendo el servicio writesrv –o equivalente-. Es muy raro hoy en día encontrar sistemas de éstos. Si se tienen disponibles se usaría write usuario@sistema, donde aplica la misma regla, el usuario debe estar conectado en ése momento y no debe haber bloqueado la recepción de mensajes. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 67 Coversación (Chat) con otros usuarios: talk Xxx AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 68 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 69 Mensajes a todo el mundo: wall Como el comando write es específico, envía mensajes a un único usuario que debe estar conectado a la máquina en el momento del envío de los mensajes, no es muy práctico para “hacer anuncios”. Afortunadamente los sistemas UNIX incluyen un comando para “hacer anuncios”, este comando es wall (write all), que envía un –mismo- mensaje a todos los usuarios que en el momento estén conectados con una sesión interactiva. El uso del comando wall es muy sencillo: se usa wall, sin parámetros, y en la nueva línea que aparece se escribe el texto a “anunciar”, la cantidad de líneas que sean necesarias, y se finaliza con ctrl d, solo, en una línea. El mensaje será recibido por todos los usuarios conectados interactivamente que no hayan bloqueado la recepción de los mensajes –al igual que write, los mensajes que root envía no se pueden bloquear-. Ejemplo: El usuario que envía, e@abe:e/> wall Esta alguien ahi??? ^D Broadcast message from e@abe (pts/1) at 21:15:30 ... Esta alguien ahi??? y uno de tantos posibles usuarios, 1 root@abe:/> Broadcast message from e@abe (pts/1) at 21:15:30 ... Esta alguien ahi??? La verdad, es muy sencillo. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 70 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 71 Correo electrónico: mail El concepto de correo electrónico, como lo conocemos en Internet es el mismo de los sistemas UNIX, ya que el correo de Internet –básicamente SMTP- es el correo inter-sistemas como se lo inventaron en UNIX. Ahora, antes del correo inter-sistemas, UNIX tuvo y tiene correo intra-sistema, para la comunicación entre los usuarios de un mismo sistema, y para la comunicación del sistema operativo y las aplicaciones que ejecuta con los usuarios en el mismo servidor. Para ambos usos se usa el mismo comando: mail –también hay otros comandos-. Modo interactivo y lectura del correo electrónico El primer modo se usa para leer el correo en el buzón de entrada, para ello simplemente se ejecuta el comando mail sin parámetros u opciones. Ejemplo: e@abe:e/> mail Mail [5.2 UCB] [AIX 5.X] Type ? for help. "/var/spool/mail/e": 1 message 1 new >N 1 root Fri Jun 8 18:38 23/822 ? "diagela message from abe" Cuando así se ejecuta el comando muestra el buzón de entrada del usuario actual (normalmente es /var/spool/mail/nombreUsuario, pero realmente no es importante). Luego de mostrar encabezados de correos suficientes para llenar la pantalla, el programa mail muestra un indicador, a la espera de comandos. La “pantalla” inicial del programa mail muestra: La versión del programa y del sistema operativo El nombre del buzón de entrada, cuántos mensajes tiene y cuántos sin leer. La lista de los mensajes en el buzón, así: o El “mensaje actual” se indica con un símbolo > o El estado del mensaje o El número ordinal del mensaje de correo en el buzón o El remitente del mensaje de correo o La fecha de recepción del mensaje o El número de líneas/el número de caracteres en el mensaje. Estos contadores incluyen los encabezados de correo. o El título o “asunto” del correo. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 72 El indicador de comandos del programa mail, ? Dentro de los “estados” de mensaje se encuentran: N Un mensaje nuevo P Un mensaje preservado en un buzón de sistema U * Un mensaje sin símbolo de estado es un mensaje que ya ha sido leido pero que no ha sido guardado. Mensaje sin leer, es decir un mensaje que no se leyó en las anteriores invocaciones del programa mail, y que tampoco se ha leído en esta. Un mensaje guardado en un archivo o buzón Dentro de los comandos posibles –hay muchos- están: ‣ delete listaMensajes (d) Marca el mensaje actual o los de la lista de mensajes para que sean borrados cuando se salga del buzón actual. Pueden desmarcarse para borrado mientras no se salga de la sesión o el buzón actual. Marca para borrar el mensaje actual y muestra el siguiente mensaje. ‣ dt (ex o x) Sale de mail sin cambiar los contenidos originales del buzón de ‣ exit correo. (folder) Se cambia a un nuevo buzón de correo. Todos los ‣ file nuevoBuzón cambios en el buzón de correo actual son aplicados. Debe darse el nombre completo del nuevo buzón o alguna de las abreviaturas: o # Buzón previo o % Buzón del sistema (normalmente /var/spool/mail/nombreUsuario) o & Buzón personal (normalmente /home/nombreUsuario/mbox) o +Nombre Un archivo dentro del directorio de buzones ‣ folders Listar buzones en su directorio de buzones ‣ headers listaMensajes (h) Lista los encabezados del grupo de mensajes actual del buzón de correo o de la lista de mensajes especificada. ‣ hold listaMensajes (ho) Marca el mensaje actual o los dados por la lista de mensajes para que sean mantenidos en el buzón de sistema (normalmente /var/ spool/mail/nombreUsuario). ‣ mail listaDirecciones (m) Abre el editor para crear un nuevo mensaje para enviar a los destinos dados por la lista de direcciones. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 73 ‣ mbox listaMensajes Marca el mensaje actual o los dados por la lista de mensajes para que sean movidos al buzón personal (normalmente /home/nombreUsuario/ mbox). ‣ new listaMensajes Marca el mensaje actual o los dados por la lista de mensajes como “no leídos”. ‣ next (n) Muestra el siguiente mensaje, seleccionándolo como “mensaje actual” (q) Deja el buzón actual y se sale del programa mail. Todos los cambios ‣ quit pendientes al buzón son aplicados: Los mensajes leídos pero no borrados ni grabados son movidos al buzón personal, los mensajes marcados para eliminación son perdidos definitivamente, los mensajes marcados con hold son mantenidos en el buzón de sistema. ‣ reply mensaje (r) Permite responder al remitente y a todos los destinatarios del correo actual, o al mensaje dado. ‣ Reply mensaje (R) Permite responder al remitente del mensaje actual o al del mensaje dado. (u) Marca el mensaje actual, o los especificados, ‣ undelete listaMensajes como “no borrados” para que no se pierdan al salir del buzón actual. ‣ unread listaMensajes (U) Marca el mensaje actual, o los especificados, como “no leídos”. ‣ z+ (z) Muestra el siguiente grupo de encabezados de mensajes. ‣ z- Muestra el anterior grupo de encabezados de mensajes. Modo directo y envío de nuevos mensajes de correo electrónico El segundo modo se usa únicamente para enviar correos, este modo invoca usando el comando mail con argumentos –posiblemente con opciones también-, en donde el comando mail asume que los argumentos son buzones destinatarios de correo. Ejemplo: e@abe:e/> mail -s "Mensaje prueba Nro 1" ElgisRamon@gmail.com Este es un mensaje de prueba que muestra que el correo de UNIX es el mismo correo de Internet. Este correo sólo contiene texto. No es más. . Cc: e@abe:e/> AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 74 Como se observa, puede incluirse la opción s con un texto entre comillas para darle un título o asunto al mensaje de correo. Cuando inicia en este modo el programa mail entra inmediata y automáticamente en modo “redacción de correo” que finaliza cuando se escribe un carácter punto (.) sólo en una línea. Al final del mensaje el programa mail solicita unos destinatarios de copia opcionales y luego de poner el mensaje en el “buzón de salida” termina la ejecución. En DOS/Windows el separador de nombres de directorios es \, en el antig uo Mac pero en UNIX (inclu OS era :, so el nuevo Mac OS X) es /. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 75 Archivos y Directorios: Manejo de Directorios El concepto de directorio es muy importante, tan importante que es algo con lo que se relacionan los usuarios de las computadoras típicas desde los primeros días: los que en UNIX llamamos “directorio” en otros ambientes se llama “carpeta”. En los ambientes de computadoras más populares (es decir Microsoft Windows y Apple Mac OS X) se usa el término “carpeta” cuando se habla de operaciones en ambiente gráfico, y se usa el término “directorio” cuando se habla de operaciones en ambiente de comandos. Los directorios en Mac OS X son los directorios de los que se hablará en este apartado ya que Mac OS X es un UNIX. Los directorios en Windows son básicamente los que se mencionarán aquí porque son los que ha usado Windows heredado de DOS, y DOS los heredó de CP/M y CP/M los heredó de UNIX, con un toque de VAX/VMS. La diferencia fundamental para un usuario que viene del ambiente de MS Windows, es que en esos ambientes y todos los relacionados hay un árbol de directorios que inicia en “una raíz” por cada unidad de disco –siendo unidad básicamente un dispositivo físico de almacenamiento de acceso directo-. En UNIX hay un único directorio raíz de donde lógicamente –no físicamente- se desprende toda una jerarquía de directorios, unos “contenidos” dentro de otros. Directorios Los directorios son archivos especiales en UNIX. Realmente son archivos –dentro de las estructuras grabadas en disco- pero tienen una finalidad especial en el sistema: con los directorios se arma el concepto de árbol jerárquico de contenidos a los que estamos acostumbrados en muchas plataformas –además de los UNIX -. Los directorios en UNIX realmente son archivos especiales catálogo que contienen/son una tabla de nombres y números de índice de lo que está “contenido dentro de” el directorio. Como son especiales los directorios se trabajan con unos comandos diferentes de los que se permiten para los “archivos comunes”. Los directorios son tan archivos en UNIX que cumplen las mismas reglas que cumplen los archivos: Los directorios pueden tener casi cualquier nombre de entre uno (1) y dos cientos cincuenta y cinco caracteres (255), en un UNIX moderno. El único carácter que no se permite en los nombres es / Dos directorios o dos archivos o un directorio y un archivo no pueden tener el mismo nombre completo. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 76 Los directorios tienen la misma estructura de índice que tiene todo archivo, sólo que están marcados con una d, para reconocerlos como directorio. Como la estructura de índice de archivos incluye dueño, permisos y fechas y horas, los directorios también tienen estos atributos. Los directorios ocupan espacio, que mínimo es lo que ocupa la tabla que lista sus “contenidos”. En un UNIX moderno el tamaño de un directorios es un múltiplo exacto de una unidad de espacio de disco y nunca es cero. Nótese que en UNIX los programas –todos- ejecutan bajo el concepto de directorio actual, que es muy importante para el programa y para el sistema en sí. Es necesario que el usuario sepa cuál es el directorio actual, porque es dónde los programas típicamente buscan la información. Como muchas veces –así es la configuración predeterminadas- el usuario no sabe a simple vista en qué directorio “actual” está trabajando, los UNIX incluyen el comando pwd (print working directory), que simplemente muestra en cuál directorio estoy trabajando actualmente: e@abe:e/> pwd /home/e AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 77 Listar contenidos de directorio: ls Uso básico del comando “listar contenidos del directorio” Lo más básico que necesita uno conocer de los directorios –siendo básicamente una tabla de contenidos- es “qué contiene”. Esta lista de contenidos se obtiene usando el comando ls (list). Cuando se usa así, sin argumentos ni opciones muestra la lista de sólo nombres de lo contenidos en el directorio actual. El comando ls, a menos que se le indique (realmente casi todos los comandos) ignora y no lista los archivos –lo que incluye a los directorios- cuyos nombres comiencen por punto (.) –así en UNIX archivo oculto es aquel cuyo nombre comienza con punto-. Ejemplo: e@abe:e/> ls LitteFile MadRamon 1.png SubDir_2 fecha actual.txt smit.log smit.script smit.transaction subdir1 Como se observará, muestra los nombres de lo contenido en el directorio actual, sin diferenciar qué son, es más sin incluir más información aparte del nombre de cada ítem. Listar contenidos de “otro directorio” Si se necesita obtener la lista de lo contenido dentro de “otro directorio” diferente del directorio actual, y no queremos o no podemos movernos a dicho otro directorio se puede agregar como argumento al comando ls. Es más, puede indicarse que se listen los contenidos de varios directorios a la vez si se le dan como argumentos independientes al comando ls. Ejemplo: e@abe:e/> ls / WebSM.pref WebSM.pref_wsmmonitoring.data audit bin bosinst.data cdrom cluster dev etc getinfo.sh home image.data lib lost+found lpp mnt opt proc sbin smit.log smit.script smit.transact tftpboot tmp u unix usr var websm.script wsmcustomtool Como se observa, incluye sólo los nombres, pero mostró lo de otro directorio sin tener que irnos al mismo. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 78 Listar incluyendo los “archivos normalmente ocultos” Muchos directorios contienen archivos que normalmente están ocultos porque ls y muchos otros comandos los ignoran. Puede hacerse que ls incluya dichos archivos en sus listados si se agrega la opción A. Re cuerde: los dire UNIX sí ocupan es ctorios en pacio! Ejemplo: e@abe:e/> ls LitteFile MadRamon 1.png e@abe:e/> ls -A .Xauthority .profile .sh_history e@abe:e/> SubDir_2 fecha actual.txt smit.log smit.script smit.transaction subdir1 .ssh LitteFile MadRamon 1.png SubDir_2 fecha actual.txt smit.log smit.script smit.transaction subdir1 Si se observa detenidamente se notará que muchos ítems son los mismos, pero como en la segunda invocación se especificó que había que incluir los ocultos en los listados, pues, aparecen más, todos con nombres que inician con punto (.). Nota cuáles son? AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 79 Listar contenidos de directorio con detalles: ls –l Todos los archivos –incluso los directorios porque también son archivostienen unas propiedades –llamadas metadatos en UNIX -. Estas propiedades pueden revisarse muy fácilmente con el comando ls cuando se le agrega la opción l (long listing). Note que ls lista el nombre del item dado como argumento si es un archivo, pero lista los nombres de los cont el argumento es un enidos si directorio! Ejemplo: e@abe:e/> ls -l total 88 -rw-r--r-1 e system -rw-r--r-1 e system drwxr-xr-x 2 e system -rw-r--r-1 e system -rw-r--r-1 e system -rw-r--r-1 e system -rw-r--r-1 e system drwxr-xr-x 2 e system e@abe:e/> ls -l / total 856 -rw-r--r-1 root system -rw-r--r-1 root system WebSM.pref_wsmmonitoring.data drwxr-x--2 root audit lrwxrwxrwx 1 bin bin -rw-r--r-1 root system drwxr-xr-x 2 root system drwxr-xr-x 3 root system drwxrwxr-x 5 root system drwxr-xr-x 27 root system -rwxr-xr-x 1 root system drwxr-xr-x 7 bin bin -rw-r--r-1 root system lrwxrwxrwx 1 bin bin drwx-----2 root system drwxr-xr-x 45 bin bin drwxr-xr-x 2 bin bin drwxr-xr-x 11 root system dr-xr-xr-x 1 root system drwxr-xr-x 3 bin bin -rw-r--r-1 root system smit.log -rw-r--r-1 root system smit.script -rw-r--r-1 root system drwxrwxr-x 2 root system drwxrwxrwt 9 bin bin lrwxrwxrwx 1 bin bin lrwxrwxrwx 1 root system boot/unix_64 drwxr-xr-x 36 bin bin AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 0 17804 256 29 10181 544 291 256 Aug Aug Aug Aug Apr Apr Apr Aug 14 14 14 14 10 10 10 14 23:15 23:16 23:17 23:15 16:02 16:00 16:00 23:17 LitteFile MadRamon 1.png SubDir_2 fecha actual.txt smit.log smit.script smit.transaction subdir1 6892 Apr 16 13:14 WebSM.pref 84 Apr 16 13:11 256 8 5793 256 256 8192 8192 2287 256 8062 8 256 4096 256 4096 0 256 304408 Jan Apr Apr Apr Jul Aug Aug Jun Jun Apr Apr Apr Aug Jan Apr Aug Apr Aug 10 10 18 11 11 14 12 08 18 18 10 10 09 10 13 14 10 14 2006 07:57 22:01 12:43 23:39 15:00 13:48 18:43 21:57 22:02 07:57 07:57 22:13 2006 00:37 23:32 20:06 19:34 audit bin -> /usr/bin bosinst.data cdrom cluster dev etc getinfo.sh home image.data lib -> /usr/lib lost+found lpp mnt opt Los “enlaces sim proc ar ch iv os es bólicos” son pe ci al es qu e sbin apuntan a otro ítem parecido a un “a . Son algo cceso directo” de Windows o un “alias” de Mac. 11526 Aug 14 19:34 22352 256 8192 5 21 Aug Apr Aug Apr Apr 14 10 14 10 10 19:34 08:21 23:32 07:57 10:55 smit.transaction tftpboot tmp u -> /home UNIX -> /usr/lib/ 4096 Jun 18 21:43 usr 80 drwxr-xr-x -rw-r--r--rw-r--r-- 30 root 1 root 1 root system system system 4096 Aug 09 12:31 var 11806 Apr 16 13:13 websm.script 1152 Apr 16 13:12 wsmcustomtools.data Es un listado largo y complejo. Hay mucha información, a saber: El primer ejemplo muestra el uso de ls con la opción l, pero sin argumentos, es decir, un listado con detalles del directorio actual. El segundo ejemplo muestra el uso de ls con la opción l y con argumento, es decir, un listado con detalles de un directorio específico. Qué incluye el listado? Una primera columna con el tipo y los permisos de cada uno de los ítems. De los permisos se hablará más adelante. En UNIX . . es un subdirectorio que existe dentro de cada direct or m ág ic am en te io y que ap un ta al directorio que contiene al presente! El número de nombres que tiene en total cada ítem –sí los archivos y directorios en UNIX pueden tener varios nombres simultáneamente-. El nombre o número interno del usuario dueño de cada ítem. El nombre o número interno del grupo de usuarios que tiene acceso a cada ítem. El tamaño en bytes de cada ítem. Ciertos ítems –archivos especiales- no tienen tamaño, para ellos el listado incluye otra información en esta columna. La fecha y hora de última modificación, de forma mes día hora si la última modificación sucedió hace máximo seis meses; de forma mes día año si la última modificación sucedió hace más de seis meses. El nombre del ítem. Si el ítem es un “enlace simbólico” muestra el nombre nombreDelItemApuntado. -> El tipo de un ítem archivo es un carácter o letra. Define qué puede contener y cómo lo interpreta el sistema operativo. Define también qué operaciones son válidas. Dentro de los tipos de archivos se encuentran: ‣ - Aparece un guión (-) en los archivos comunes. ‣ d Se muestra para los directorios únicamente. ‣ l ‣ b ‣ c Enlace simbólico. Tratar de usar un enlace simbólico (excepto por “eliminar” y “mover”) lleva a usar el archivo o ítem al que “apunta” el enlace simbólico. Especial. Es un ítem que existe para usar una pieza de hardware como archivo. Especial. Es un ítem que existe para usar una pieza de hardware o el resultado de una función de software como archivo. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 81 Y más! Moverse entre directorios: cd Como en un sistema UNIX típico hay muchísimos directorios (tal vez miles), una operación muy importante es moverse o cambiarse de directorio. Para cambiarse o moverse de directorio se usa el comando cd, que tiene cuatro modos de sintaxis diferentes: Si se le da un nombre de directorio el comando CD mira dos casos: si el nombre dado comienza con el símbolo / entonces el nombre es “absoluto” y el comando cd intenta buscar el directorio a partir de la raíz absoluta de la jerarquía de directorios; si el nombre dado comienza con otra cosa el comando cd intenta buscar el directorio destino a partir del directorio actual, como si fuera un subdirectorio de donde el usuario está ubicado presentemente. ‣ cd nombreDirectorio ‣ cd ~ ‣ cd - ‣ cd Si se le da como argumento el símbolo ~, el comando cd averigua cuál es el directorio inicial o personal del usuario que lo está invocando, e intenta moverse a dicho directorio personal. Si se le da el símbolo -, el comando cd averigua cuál fue el último directorio donde el usuario estaba antes de moverse al actual e intenta moverse a dicho directorio “previo”. Si se usa el comando cd sin argumentos, el comando asume que se invocó cd ~ y busca el directorio personal o inicial del usuario que lo está invocando, para intentar moverse allí. Ejemplos: e@abe:e/> pwd /home/e e@abe:e/> cd /home e@abe:home/> pwd /home e@abe:home/> cd .. e@abe:/> pwd / e@abe:/> cd usr e@abe:usr/> pwd /usr e@abe:usr/> cd /home/e e@abe:e/> pwd /home/e e@abe:e/> cd /usr e@abe:usr/> pwd /usr e@abe:usr/> cd (el usuario inicia en su directorio personal) (el usuario ahora está en un directorio que se buscó desde la raíz) (el usuario ahora está en un nivel superior) (el comando buscó a partir del directorio donde estaba ubicado) (el comando puede navegar varios niveles en un solo paso) (reporta a dónde llevará, como se verificará) (el comando cambió al usuario a donde estaba antes) AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 82 e@abe:e/> pwd /home/e (el comando solito lleva al directorio personal) Nota: Siendo un sistema multiusuario con una arquitectura de seguridad, los permisos de los directorios definen qué usuarios pueden “entrar” o “deambular” por cada uno. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 83 Crear directorios: mkdir Como cada usuario quiere organizar su información de la manera que más práctica le parece, existe el comando para crear nuevos directorios. Es un comando muy sencillo con el que se pueden crear directorios donde se tengan permisos, y en un UNIX típico no se manejan permisos “poder crear directorios”, sólo se manejan “poder escribir en un directorio”, con éste último es suficiente para poder crear directorios!. El comando es sencillo: mkdir nuevoDirectorio También se le puede decir que cree varios nuevos directorios: mkdir nuevoDirectorio1 nuevoDirectorio2 … Como todos los comandos, si el nombre del nuevo directorio no comienza con el símbolo / el comando intentará crear el nuevo como subdirectorio del directorio actual. Adicionalmente, con ésas sintaxis, si al comando se le da toda una ruta o camino jerárquico, sólo intentará crear como directorio el último elemento de toda la ruta, todo lo otro ya deberá existir. Ejemplo: e@abe:e/> ls LitteFile SubDir_2 MadRamon 1.png fecha actual.txt e@abe:e/> mkdir NuevoSubDir e@abe:e/> ls LitteFile SubDir_2 MadRamon 1.png fecha actual.txt NuevoSubDir smit.log e@abe:e/> ls -l total 88 -rw-r--r-1 e system -rw-r--r-1 e system drwxr-xr-x 2 e system drwxr-xr-x 2 e system -rw-r--r-1 e system -rw-r--r-1 e system -rw-r--r-1 e system -rw-r--r-1 e system drwxr-xr-x 2 e system e@abe:e/> smit.log smit.script smit.transaction subdir1 smit.script smit.transaction subdir1 0 17804 256 256 29 10181 544 291 256 Aug Aug Aug Aug Aug Apr Apr Apr Aug 14 14 15 14 14 10 10 10 14 23:15 23:16 21:05 23:17 23:15 16:02 16:00 16:00 23:17 LitteFile MadRamon 1.png NuevoSubDir SubDir_2 fecha actual.txt smit.log smit.script smit.transaction subdir1 Otro ejemplo más: e@abe:e/> mkdir /tmp/ejemplo/mi_dir mkdir: 0653-357 Cannot access directory /tmp/ejemplo. /tmp/ejemplo: A file or directory in the path name does not exist. e@abe:e/> mkdir /tmp/ejemplo /tmp/ejemplo/mi_dir e@abe:e/> ls -ld /tmp /tmp/ejemplo /tmp/ejemplo/mi_dir AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 84 drwxrwxrwt drwxr-xr-x drwxr-xr-x e@abe:e/> 10 bin 3 e 2 e bin system system 8192 Aug 15 21:08 /tmp 256 Aug 15 21:08 /tmp/ejemplo 256 Aug 15 21:08 /tmp/ejemplo/mi_dir El uso de la opción d del comando ls es nuevo en esta guía, no se había mencionado. Cuando se usa el comando ls con un directorio como argumento, el mismo no lista al directorio si no lo contenido en el directorio. Si se agrega la opción d al comando ls el mismo lista los directorios, no sus contenidos. Como se está usando también la opción l, entonces el comando muestra un listado completo de propiedades de los directorios, no de los contenidos de los directorios. Crear toda una estructura de directorios: mkdir –p Como se ve en el ejemplo, cuando al comando simple mkdir se le da toda una ruta de directorios asume sólo que se necesita crear el último elemento de la ruta (asi con mkdir / uno/dos/tres/cuatro asume que uno, dos y tres existen y que sólo hay que crear cuatro). Como muchas veces se necesita todo el camino, existe una variante de mkdir para que cree los elementos de una ruta que hagan falta: mkdir –p /undir/segdir/tercdir/cuartodir … Ejemplo: e@abe:e/> mkdir dirA/dirB/dirC mkdir: 0653-357 Cannot access directory dirA/dirB. dirA/dirB: A file or directory in the path name does not e@abe:e/> mkdir -p dirA/dirB/dirC e@abe:e/> ls -ld dirA dirA/dirB dirA/dirB/dirC drwxr-xr-x 3 e system 256 Aug 15 22:19 drwxr-xr-x 3 e system 256 Aug 15 22:19 drwxr-xr-x 2 e system 256 Aug 15 22:19 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow exist. dirA dirA/dirB dirA/dirB/dirC 85 Cambiar nombre de directorio (o mover): mv A veces no se tiene una estructura jerárquica de directorios y subdirectorios como se desearía. Si se necesita cambiar el nombre de un directorio (o de un archivo) se puede usar el comando “mover”, simplemente se usa un nuevo nombre que no exista. Si se necesita mover un directorio para que esté en otro sitio dentro del mismo sistema, sólo hay que usar también el comando “mover”, pero en este caso el nombre destino existe y es un directorio donde se pueda “meter” el directorio original. En resumen: Para renombrar, asumiendo que nuevoNombre no existe: mv elDirectorio nuevoNombre Para mover, asumiendo que nombreContenedor sí existe y sí es un directorio: mv elDirectorio nombreContenedor Como se observará, es el mismo comando con la misma sintaxis, la diferencia radica en si el segundo nombre dado como argumento existe y es directorio. Ejemplo: e@abe:e/> ls LitteFile SubDir_2 smit.script MadRamon 1.png fecha actual.txt smit.transaction NuevoSubDir smit.log subdir1 e@abe:e/> mv NuevoSubDir Antiguo_SubDir e@abe:e/> ls Antiguo_SubDir SubDir_2 smit.script LitteFile fecha actual.txt smit.transaction MadRamon 1.png smit.log subdir1 e@abe:e/> mv Antiguo_SubDir subdir1 e@abe:e/> ls LitteFile SubDir_2 smit.log MadRamon 1.png fecha actual.txt smit.script e@abe:e/> ls subdir1 Antiguo_SubDir e@abe:e/> AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow smit.transaction subdir1 86 En el comando, … qu que no sólo se pu iere decir ed dos nombres, si en escribir no cuántos nombres uno quiera o necesite. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 87 Remover directorios: rmdir Así como se crean nuevos directorios, pueden borrarse los que ya no se necesiten. Toca cumplir condiciones: deben tenerse los permisos suficientes, y además, el comando rmdir sólo sabe borrar directorios vacíos: rmdir directorioVacío … Ejemplo: e@abe:e/> rmdir dirA rmdir: 0653-611 Directory dirA is not empty. e@abe:e/> rmdir dirA/dirB/dirC e@abe:e/> ls -ld dirA dirA/dirB drwxr-xr-x 3 e system 256 Aug 15 22:19 dirA drwxr-xr-x 2 e system 256 Aug 15 22:23 dirA/dirB Remover una jerarquía de directorios: rmdir –p Así como puede crearse toda una jerarquía de directorios, unos dentro de otros, puede también borrarse toda una jerarquía de directorios si se usa la opción p del comando rmdir: rmdir –p /undir/segdir/tercdir/cuartodir … Ejemplo: e@abe:e/> ls -ld dirA dirA/dirB dirA/dirB/dirC drwxr-xr-x 3 e system 256 Aug 15 22:19 dirA drwxr-xr-x 3 e system 256 Aug 15 22:25 dirA/dirB drwxr-xr-x 2 e system 256 Aug 15 22:25 dirA/dirB/dirC e@abe:e/> rmdir -p dirA/dirB/dirC e@abe:e/> ls -ld dirA dirA/dirB dirA/dirB/dirC ls: 0653-341 The file dirA does not exist. ls: 0653-341 The file dirA/dirB does not exist. ls: 0653-341 The file dirA/dirB/dirC does not exist. e@abe:e/> AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 88 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 89 Archivos y Directorios: Manejo de Archivos Otro concepto que manejan los usuarios de otras plataformas como se maneja en UNIX es el concepto de “archivo”. En UNIX, parecido a lo que se maneja en otras plataformas un “archivo” es un conjunto de bytes que se usan a través de un nombre, que físicamente no necesariamente están contiguos, pero que lógicamente se usan como si estuvieran contiguos, uno seguido del otro. En UNIX es donde se comenzó a manejar el concepto de archivo como se maneja ahora en la mayoría de las plataformas, pero hay diferencias. Archivos En UNIX un archivo siempre se considera –desde el punto de vista del sistema operativocomo una secuencia de bytes sin estructura. En UNIX un archivo se encuentra y se accede a través de una estructura especial de disco por fuera del archivo que se llama “nodo índice” o más comúnmente inodo. En este inodo se encuentran los metadatos de cada archivo, así, en disco, para UNIX el inodo tiene una estructura pero el archivo no. Hay unas cosas que hacen especial el tratamiento de los archivos en UNIX: En cada inodo hay un marcador de tipo, lo que define tipos de archivo. Ya se ha mencionado, por ejemplo, que los directorios son un tipo de archivo. Un archivo está “atado” a su inodo, y para un dado archivo no cambia jamás, hasta que se elimine del todo el archivo. Un archivo tiene un único inodo y un inodo da acceso (podría decirse “apunta a”) un único archivo. El nombre de un archivo está registrado en alguna (o algunas) tablas directorio, donde hay una relación de algún inodo con algún nombre, para cada archivo “contenido en” el directorio. Un archivo puede tener –de hecho muchos tienen típicamente- más de un nombre, en un mismo o en más de un directorio. En cada inodo hay un contador de cuántos nombres tiene el archivo al que el inodo apunta, sin incluir o mencionar cuáles son esos nombres ni dónde están. Temporalmente un archivo puede existir sin nombre, pero no es usable por las aplicaciones mientras así esté. Existen archivos especiales en donde el inodo realmente se usa para apuntar y dar acceso a piezas de hardware y funciones de software, pero que no apuntan a archivos que guardan datos. Estos “archivos especiales” se usan exactamente como se usan otros archivos. Esta última particularidad es una característica única y muy poderosa de UNIX: los diseñadores originales intentaron que todo en el sistema pudiera accederse como se usan AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 90 los “archivos normales”. Así, en UNIX si se tienen los permisos se puede trabajar la memoria del sistema como un archivo, los discos, las cintas de copias de respaldo, los puertos, etc., como si fueran archivos comunes. Nombres de los archivos En general los sistemas UNIX son muy, muy liberales en cuanto a los nombres de los archivos. Hay pocas reglas: No pueden haber dos o más archivos con el mismo nombre en el mismo directorio, independientemente del tipo de los archivos. La mayoría de los UNIX soportan nombres de archivos –sin importar el tipo- muy largos, de al menos 255 caracteres UNICODE. La mayoría de las veces las restricciones existen en los formatos de disco que almacenan a los archivos. Todos los UNIX soportan nombres con casi cualquier carácter, lo único en común es que no puede incluirse el símbolo /. Tanto Mac OS X, como Solaris, como AIX soportan todo tipo de caracteres: espacios, símbolos, caracteres nacionales localizados (como á o ñ), puntos, etc. La mayoría de las restricciones a los nombres no las impone el sistema operativo en la mayoría de los UNIX, si no el formato de disco donde se almacenan los archivos –y sus nombres-. Por ejemplo, muchos UNIX entienden el formato de disco básico de Windows (FAT), en el que hay muchas más restricciones a los nombres de los archivos que las mencionadas aquí. Casi todos los formatos de disco de UNIX diferencian los nombres en mayúsculas de los en minúsculas. Si así es, entonces para el sistema operativo habrá diferencia! Los UNIX no manejan el concepto de “extensión de nombre”, así que no se necesita un sufijo al final de los archivos (en especial no un sufijo de tres letras después de un punto). Un nombre de archivo puede contener varias veces el carácter punto (.) o ningún punto. Como los UNIX son liberales con los nombres, y los contenidos de los archivos son bytes únicamente para el sistema operativo, el nombre y el contenido de los archivos no tienen relación directa. Un archivo no tiene que tener nombre terminado en .exe para ser programa o en .jpg para ser imagen. En cada directorio hay una tabla –interna- que tiene los nombres cortos de los archivos –sin ruta- que contiene, relacionados con el inodo que apunta a lo que en realidad es el archivo. Muchos caracteres en el intérprete de comandos de modo texto tienen significado especial, por ello es mejor evitar usarlos en los nombres a menos que se esté dispuesto a expresarle al shell “remueva el significado especial de esto”. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 91 Nombres por ruta absoluta y por ruta relativa Cuando en el sistema operativo se menciona un archivo, se puede mencionar de dos maneras: Por ruta absoluta es cuando en algún programa o en el sistema operativo se menciona un archivo dando la ruta completa para poder ubicarlo. Las rutas absolutas son nombres que incluyen directorios y subdirectorios y que comienzan con el símbolo slash (/), es decir que a partir de la raíz de todo se siguen los directorios y subdirectorios uno a uno hasta encontrar el archivo. Ejemplo: / /home/juancho/foto_vaca.jpg Por ruta relativa es cuando en algún programa o en el sistema operativo se menciona un archivo dando un nombre que no comienza con el símbolo /. Las rutas relativas pueden ser el nombre únicamente (como archivo.txt) o pueden ser con ruta parcial (como subdir/archivo.txt). Cuando se usa una ruta relativa el sistema tiene en cuenta el directorio actual, usándolo como prefijo de nombre, y uniéndolo al nombre dado con un símbolo / intermedio. Ejemplo: Si el usuario juancho está ubicado en su directorio personal y menciona foto_vaca.jpg el sistema entiende /home/juancho/foto_vaca.jpg AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 92 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 93 Listar archivos: ls El comando ls (list) realmente no lista archivos, lista directorios que lo que más contienen son archivos: [255 e@Moe ~] ls Desktop Library Documents Movies Downloads Music Pictures Public Sites dlmgr_.pro drbd.conf Es claro que la mayoría de las “cosas dentro de” un directorio son archivos, y que lo otro, que casi siempre son directorios también son archivos. Ahora, si se lista un archivo, a menos que se diga otra cosa, el comando lista el nombre del archivo dado: [0 e@Moe ~] ls drbd.conf drbd.conf AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 94 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 95 Listar archivos con detalles: ls –l El comando ls cuando tiene la opción l presenta un listado largo, que incluye muchos detalles de los archivos dados o contenidos en el directorio especificado (o contenidos en el directorio actual si no se especifica nada). Ejemplo: e@abe:e/> ls total 88 -rw-r--r--rw-r--r-drwxr-xr-x -rw-r--r--rw-r--r--rw-r--r--rw-r--r-drwxr-xr-x -l 1 1 2 1 1 1 1 3 e e e e e e e e system system system system system system system system 0 17804 256 29 10181 544 291 256 Aug Aug Aug Aug Apr Apr Apr Aug 14 14 14 14 10 10 10 15 23:15 23:16 23:17 23:15 16:02 16:00 16:00 21:15 LitteFile MadRamon 1.png SubDir_2 fecha actual.txt smit.log smit.script smit.transaction subdir1 Es fácil reconocer del listado cuáles ítems son archivos comunes: la primera columna tiene un menos (-) como primer carácter. También se puede notar: La segunda columna es un número, es el número de nombres (oficialmente the link count). Casualmente en el listado superior, todos los archivos comunes tienen un único nombre, como es típico. Todo archivo tiene un dueño, casi siempre quién creó originalmente al archivo. Es lo que aparece en la columna tres (3) del listado. Todo archivo tiene un grupo, casi siempre el grupo principal del usuario dueño. Es lo que aparece en la columna cuatro (4) de un listado como el de arriba. Los archivos comunes y los directorios tienen tamaño. En los listados de ls aparecen en bytes. –l El sistema maneja tres “marcas de tiempo” con fecha y hora por cada archivo (en cada inodo): o Fecha y hora de último uso, sin importar cuál uso. Se llama oficialmente “fecha de último acceso” o atime. o Fecha y hora de la última modificación de los contenidos. Se llama oficialmente “fecha de última modificación” o mtime. o Fecha y hora de la última modificación de los metadatos. Se llama oficialmente “fecha de último cambio” o ctime. Como no está especificado en el estándar, la mayoría de los UNIX no mantienen una “fecha de creación”, aunque muchos creen que sí, ya que el nombre ctime es fácil confundirlo con “creation time”. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 96 De manera predeterminada el comando ls –l muestra en la “sexta columna” la fecha de la última modificación. Si se usa la opción c con ls –l se muestra la fecha de los últimos cambios al inodo, y se usa la opción u con ls –l se muestra es la fecha del último uso. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 97 Crear archivo vacío: touch Como para los sistemas UNIX un archivo es sólo una secuencia de bytes sin un significado especial, el sistema no incluye en sí un comando “crear archivo nuevo”. Los archivos normalmente se crean con la misma aplicación que después se usará para leer y/o procesar la información que contienen. Así para crear un nuevo archivo de audio se usa una aplicación de grabado o edición de audio, para crear un documento hoja de cálculo se usa una aplicación de hojas de cálculo y así. Sin embargo… en el sistema viene un comando que cambia las fechas de los archivos (la de último acceso, la de último cambio o de último cambio del inodo), que casualmente si se le da como argumento algún nombre de archivo que no existe, lo crea nuevo, archivo común, sin contenidos y le cambia la fecha –puede invocarse de manera que no cree archivos si se desea-. Para crear un nuevo archivo puede usarse: touch nombreNuevo y si el nombreNuevo no corresponde con ningún archivo, lo crea nuevo, vacío. Ejemplo: e@abe:e/> ls -l total 88 -rw-r--r-1 e system -rw-r--r-1 e system drwxr-xr-x 2 e system -rw-r--r-1 e system -rw-r--r-1 e system -rw-r--r-1 e system -rw-r--r-1 e system drwxr-xr-x 3 e system e@abe:e/> touch NuevoVacio.txt e@abe:e/> ls -l total 88 -rw-r--r-1 e system -rw-r--r-1 e system -rw-r--r-1 e system drwxr-xr-x 2 e system -rw-r--r-1 e system -rw-r--r-1 e system -rw-r--r-1 e system -rw-r--r-1 e system drwxr-xr-x 3 e system AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 0 17804 256 29 10181 544 291 256 Aug Aug Aug Aug Apr Apr Apr Aug 14 14 14 14 10 10 10 15 23:15 23:16 23:17 23:15 16:02 16:00 16:00 21:15 LitteFile MadRamon 1.png SubDir_2 fecha actual.txt smit.log smit.script smit.transaction subdir1 0 17804 0 256 29 10181 544 291 256 Aug Aug Aug Aug Aug Apr Apr Apr Aug 14 14 16 14 14 10 10 10 15 23:15 23:16 17:22 23:17 23:15 16:02 16:00 16:00 21:15 LitteFile MadRamon 1.png NuevoVacio.txt SubDir_2 fecha actual.txt smit.log smit.script smit.transaction subdir1 98 IMPORTANTE: Si al co se le da como mando segundo nombre el de un archivo existente, si puede sobreescribe ta l archivo sin consultar o adverti r! cp AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 99 Copiar archivos: cp Una operación lo más de común: Se tienen uno o más archivos y se necesita tener copias de los mismos, para tener otros nuevos con exactamente los mismos contenidos. En UNIX, para copiar unos archivos se usa el comando cp (copy) que tiene varios modos de uso, usos que se describen a continuación. Uso de cp para hacer una copia sencilla de un archivo Para hacer una copia sencilla de un archivo simplemente se da a cp como argumento el nombre del archivo original a copiar y el nombre como quiere que se llame la copia nueva. Dependiendo de como se use la ruta del segundo argumento, puede hacerse la copia en algún otro lado. Ejemplos: cp archivoOriginal archivoNuevo que contiene archivoOriginal) cp archivoOriginal /ruta/archivoOriginal está ubicada en otro directorio pero que lleva el mismo nombre) cp archivoOriginal /ruta/ cp archivoOriginal /ruta/nuevoNombre otro y está en otro directorio) cp /ruta/archivoOriginal . la copia tiene el mismo nombre que el original) (ahora existe un nuevo archivo que contiene exactamente lo (ahora hay una copia de un archivo del directorio actual que (lo mismo que en el último ejemplo, pero se escribe menos) (ahora hay una copia del archivo original, pero el nombre es (ahora hay una copia del archivo original en el directorio actual, Uso de cp para copiar varios archivos Para hacer copias de varios archivos –en una sola operación- se dan los nombres de cada uno, como argumentos, separados por espacios, y además el nombre de un directorio destino, también separado por espacios de los otros argumentos. Note que lo último debe ser un directorio, si no lo es, el comando termina, reportando un error: cp arch1 arch2 arch3 … /dir/destino Ejemplos: e@abe:e/> ls -l total 88 -rw-r--r-1 e system 0 Aug 14 23:15 -rw-r--r-1 e system 17804 Aug 14 23:16 -rw-r--r-1 e system 0 Aug 16 17:22 drwxr-xr-x 2 e system 256 Aug 14 23:17 -rw-r--r-1 e system 29 Aug 14 23:15 -rw-r--r-1 e system 10181 Apr 10 16:02 -rw-r--r-1 e system 544 Apr 10 16:00 -rw-r--r-1 e system 291 Apr 10 16:00 drwxr-xr-x 3 e system 256 Aug 15 21:15 e@abe:e/> cp "MadRamon 1.png" smit.log LitteFile cp: LitteFile: The system call does not exist on this AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow LitteFile MadRamon 1.png NuevoVacio.txt SubDir_2 fecha actual.txt smit.log smit.script smit.transaction subdir1 system. 100 e@abe:e/> cp "MadRamon 1.png" smit.log LitteFile subdir1 e@abe:e/> ls subdir1 Antiguo_SubDir LitteFile MadRamon 1.png smit.log Uso del comando cp para copiar directorios completos: cp -R El comando cp puede usarse también para copiar directorios completos, lográndose duplicados de la estructura completa de sus contenidos. Hay dos modos de uso: Si se usa dando como destino un nombre que no existe se crea una estructura copia del original. La copia lleva como nombre el segundo IMPORTANTE: Si al comando argumento dado. mv se le da Si se usa dando como destino un nombre de un directorio preexistente se crea una copia con la estructura completa, con el mismo nombre del original, pero como subdirectorio del nombrado como segundo argumento –“dentro” del segundo-. como segundo nombre el de un archivo existente, si puede sobreescribe ta l ar consultar o adverti chivo sin r! Ejemplos: e@abe:e/> cp e@abe:e/> ls total 88 -rw-r--r--rw-r--r--rw-r--r-drwxr-xr-x -rw-r--r--rw-r--r--rw-r--r--rw-r--r-drwxr-xr-x drwxr-xr-x e@abe:e/> cp e@abe:e/> ls total 88 -rw-r--r--rw-r--r--rw-r--r-drwxr-xr-x -rw-r--r--rw-r--r--rw-r--r--rw-r--r-drwxr-xr-x drwxr-xr-x e@abe:e/> -R subdir1 subdir2 -l 1 e 1 e 1 e 2 e 1 e 1 e 1 e 1 e 3 e 3 e -R subdir2 -l system system system system system system system system system system SubDir_2 0 17804 0 256 29 10181 544 291 256 256 Aug Aug Aug Aug Aug Apr Apr Apr Aug Aug 14 14 16 14 14 10 10 10 16 16 23:15 23:16 17:22 23:17 23:15 16:02 16:00 16:00 17:37 17:59 LitteFile MadRamon 1.png NuevoVacio.txt SubDir_2 fecha actual.txt smit.log smit.script smit.transaction subdir1 subdir2 1 1 1 3 1 1 1 1 3 3 system system system system system system system system system system 0 17804 0 256 29 10181 544 291 256 256 Aug Aug Aug Aug Aug Apr Apr Apr Aug Aug 14 14 16 16 14 10 10 10 16 16 23:15 23:16 17:22 18:00 23:15 16:02 16:00 16:00 17:37 17:59 LitteFile MadRamon 1.png NuevoVacio.txt SubDir_2 fecha actual.txt smit.log smit.script smit.transaction subdir1 subdir2 e e e e e e e e e e AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 101 Mover o renombrar archivos: mv Otras dos operaciones muy comunes en todos los ambientes son “renombrar” un ítem, y “mover” de sitio un ítem. Ambas operaciones son lo mismo en UNIX, y por ello ambas se hacen con el mismo comando, mv (move). El uso de mv es básicamente el mismo de cp, pero siendo otro, éste no deja copia. Uso de mv para renombrar un archivo Para hacer una copia sencilla de un archivo simplemente se da a mv como argumento el nombre del archivo original a renombrar y el nombre como quiere que se llame definitivamente. Dependiendo de como se use la ruta del segundo argumento, puede moverse a algún otro lado. Ejemplos: mv archivoOriginal archivoNuevo archivoOriginal, se llama archivoNuevo) (ahora existe el archivo, pero ya no se llama mv archivoOriginal /ruta/archivoOriginal sitio, sigue teniendo el mismo nombre) (se movió el archivo del directorio actual a un nuevo mv archivoOriginal /ruta/ menos) (lo mismo que en el último ejemplo, pero se escribe mv archivoOriginal /ruta/nuevoNombre mismo nombre, ahora es nuevoNombre) (ahora el archivo está en otro sitio, y no tiene el mv /ruta/archivoOriginal . (ahora se trae el archivo de donde estaba al directorio actual, sigue con el mismo nombre, archivoOriginal) Uso de mv para mover varios archivos Para hacer movimiento de varios archivos –en una sola operación- se dan los nombres de cada uno, como argumentos, separados por espacios, y además el nombre de un directorio destino, también separado por espacios de los otros argumentos. Note que lo último debe ser un directorio, si no lo es, el comando termina, reportando un error: mv arch1 arch2 arch3 … /dir/destino AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 102 IMPORTANTE: Si al co se le da como mando segundo nombre el de un archivo existente, si puede sobreescribe ta l archivo sin consultar o adverti r! ln AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 103 Agregar nombres a archivos: ln En UNIX hay una operación que no es posible hacer con los archivos en la mayoría de los otros sistemas: agregarle nombres a los archivos. La operación es semejante a la de “copiar archivos”, pero en este caso lo que queda no es un nuevo archivo con los mismos contenidos, queda un nuevo nombre por el que se puede acceder a un archivo –por eso parece una copia, pero el archivo es uno solo-. UNIX no maneja casos especiales de “primer nombre” o “último nombre”, así que todos los nombres son equivalentes y ninguno es “principal”. Agregarle un nuevo nombre a un archivo individual Se usa el comando ln (link) para agregarle nombres (oficialmente en UNIX se llaman links), cuya sintaxis es muy parecida a la de cp y mv: ln nombreOriginal nombreNuevo Dependiendo de cómo se usen los argumentos, los dos nombres pueden estar en el mismo o en diferentes directorios, pero, los UNIX por lo general necesitan que ambos estén en el mismo “contenedor físico”. Como ambos nombres son un mismo archivo y un archivo tiene un único inodo, ambos nombres llevan al mismo inodo. Como el sistema operativo usa esta operación para mantener la estructura de árboles para directorios, este comando no puede ponerle nombres adicionales a directorios. Ejemplo: e@abe:e/> ls -li total 48 72 -rw-r--r-1 e system 0 Aug 14 23:15 LitteFile 180 -rw-r--r-1 e system 17804 Aug 14 23:16 MadRamon 1.png 179 -rw-r--r-1 e system 0 Aug 16 17:22 NuevoVacio.txt 12320 drwxr-xr-x 3 e system 256 Aug 16 18:00 SubDir_2 177 -rw-r--r-1 e system 29 Aug 14 23:15 fecha actual.txt 12288 drwxr-xr-x 3 e system 256 Aug 16 17:37 subdir1 12292 drwxr-xr-x 3 e system 256 Aug 16 17:59 subdir2 e@abe:e/> ln "fecha actual.txt" "dato viejo" e@abe:e/> ls -li total 56 72 -rw-r--r-1 e system 0 Aug 14 23:15 LitteFile 180 -rw-r--r-1 e system 17804 Aug 14 23:16 MadRamon 1.png 179 -rw-r--r-1 e system 0 Aug 16 17:22 NuevoVacio.txt 12320 drwxr-xr-x 3 e system 256 Aug 16 18:00 SubDir_2 177 -rw-r--r-2 e system 29 Aug 14 23:15 dato viejo 177 -rw-r--r-2 e system 29 Aug 14 23:15 fecha actual.txt 12288 drwxr-xr-x 3 e system 256 Aug 16 17:37 subdir1 12292 drwxr-xr-x 3 e system 256 Aug 16 17:59 subdir2 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 104 Con la opción i del comando ls se logra que éste genere listados donde se incluye el número del inodo de cada item. Como se ve en el ejemplo, dato viejo y fecha actual.txt tienen el mismo inodo, por lo que trabajar uno es exactamente lo mismo que trabajar el otro. Si se intenta borrar un archivo que tiene varios nombres hay que borrar todos los nombres que tenga, ya que mientras al archivo le quede al menos un nombre se podrá usar por ése nombre que quede y no será borrado. Cuando ya no tenga ni un nombre, y tampoco está abierto por ninguna aplicación el sistema desconectará al archivo de su ínodo y ya no podrá ni accederse a él ni recuperarse. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 105 Agregar enlaces simbólicos: ln –s Como no se pueden tener dos nombres al mismo archivo en diferente contenedor físico de almacenamiento ni se pueden hacer enlaces tradicionales a directorios entonces en UNIX hay otro estilo de enlace que se puede usar en todos los casos. Este otro estilo de enlace se llama “enlace simbólico” y es realmente un nuevo archivo, de tipo especial l que realmente apunta al nombre del archivo original. Como es otro archivo ocupa espacio aparte y tiene su propio inodo. Cuando se crea un enlace simbólico a un archivo no se le aumenta al archivo original la cuenta de nombres que se almacena en el inodo. Cuando se borra un archivo enlace simbólico tampoco se afecta el original, pero cuando se borra el archivo original el enlace simbólico no sirve, porque sigue apuntando al nombre del archivo original que ya no existe. Por otro lado, usar un enlace simbólico realmente hace que el sistema operativo redirija la operación y los programas realmente usan el archivo original. Agregarle un enlace simbólico a un archivo individual Se usa el comando ln con la opción s para agregarle enlaces simbólicos (oficialmente en UNIX se llaman symbolic links pero tradicionalmente se usa symlinks), cuya sintaxis es muy parecida a la de cp y mv: ln –s nombreOriginal nombreNuevo Dependiendo de cómo se usen los argumentos, los dos nombres pueden estar en el mismo o en diferentes directorios, o en áreas totalmente diferentes del sistema. Si el archivo original está en algún otro lado puede obviarse el segundo nombre, lo que hace un enlace simbólico nuevo en el directorio actual, que cuando se use haga acceso al archivo original en algún otro lado: ln –s /ruta/nombreOriginal Agregarle enlaces simbólicos a múltiples archivos a la vez Si se quieren tener en un directorio múltiples enlaces simbólicos de manera que cada uno apunte a algún archivo diferente simplemente se usa: ln –s /ruta1/archivo1 /ruta2/archivo2 … /directorio/destino Comando que un una sola operación crea un enlace simbólico llamado /directorio/ destino/archivo1 apuntando a /ruta1/archivo1, uno llamado /directorio/destino/ archivo2 apuntando a /ruta2/archivo2, y así sucesivamente. Ejemplos: e@abe:e/> date Thu Aug 16 23:00:45 EST 2007 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 106 e@abe:e/> date > actual.txt e@abe:e/> ls -l actual.txt -rw-r--r-1 e system 29 Aug 16 23:00 actual.txt e@abe:e/> cat actual.txt Thu Aug 16 23:00:53 EST 2007 e@abe:e/> ln -s actual.txt hoy.txt e@abe:e/> ls -l actual.txt hoy.txt -rw-r--r-1 e system 29 Aug 16 23:00 actual.txt lrwxrwxrwx 1 e system 10 Aug 16 23:01 hoy.txt -> actual.txt e@abe:e/> cat hoy.txt Thu Aug 16 23:00:53 EST 2007 e@abe:e/> date > hoy.txt Hay que record ar que un e@abe:e/> cat hoy.txt archivo realmen te se borra Thu Aug 16 23:02:33 EST 2007 cuando se queda sin nombres. e@abe:e/> cat actual.txt Thu Aug 16 23:02:33 EST 2007 Se nota cómo editar los contenidos de actual.txt o de hoy.txt resulta en lo mismo, los contenidos de actual.txt son los que cambian, pero se nota cómo no son el mismo archivo, es más actual.txt mide 29 bytes, pero hoy.txt mide 10 bytes (el nombre actual.txt son 10 caracteres). AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 107 Remover archivos y nombres de archivos: rm Como el espacio se va acabando pronto, es necesario un comando que borre lo que ya no se necesita para liberar el espacio para otras cosas. Es casi una ley: no importa de cuánto espacio se disponga, pronto se acaba. En UNIX hay que tener mucho cuidado con lo que se borra, ya que si se trabaja en modo texto no hay protección: el archivo borrado es muy muy difícil de recuperar, no hay “trashcan”, y como funcionan los sistemas operativos no hacen muy fácil el desarrollo de utilidades estilo Undelete. El comando “borrar” o “eliminar” se llama rm (remove) y es muy sencillo (demasiado) de usar. Sólo hay que darle como argumentos los nombres que se quieren borrar. Si se tienen suficientes permisos como para borrar los archivos el comando ni siquiera valida o confirma, simplemente borra. Ejemplos: e@abe:e/> ls LitteFile SubDir_2 fecha actual.txt subdir2 MadRamon 1.png actual.txt hoy.txt NuevoVacio.txt dato viejo subdir1 e@abe:e/> rm fecha\ actual.txt hoy.txt e@abe:e/> rm SubDir_2 rm: 0653-603 Cannot remove directory SubDir_2. e@abe:e/> ls LitteFile NuevoVacio.txt actual.txt subdir1 MadRamon 1.png SubDir_2 dato viejo subdir2 Remoción de directorios Hay que notar que para borrar directorios se usa el comando rmdir, pero que éste sólo borra directorios que estén vacíos. Por eso el comando rm tiene una función adicional: la posibilidad de remover directorios con todo lo que contienen –es decir que borra aunque no estén vacíos-. Este es un comando muy peligroso, por favor fíjese antes de enviar el comando: rm –R item1 item2 Ejemplo: e@abe:e/> ls subdir2 Antiguo_SubDir LitteFile MadRamon 1.png e@abe:e/> rm -R subdir2 e@abe:e/> ls subdir2 ls: 0653-341 The file subdir2 does not exist. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow smit.log 108 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 109 Determinar tipo de archivo: file Como el nombre y los contenidos de un archivo en UNIX no tienen relación directa, en UNIX hay disponible que un comando que revisa los contenidos y haciendo un análisis intenta reportar qué clase de archivo es cada uno de los nombrados como argumentos. El comando se llama file, y es de muy sencillo uso. Ejemplos: e@abe:e/> file LitteFile actual.txt LitteFile: empty actual.txt: ascii text e@abe:e/> file subdir1 subdir1: directory e@abe:e/> file /tmp /tmp: directory AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 110 A mediados de lo s por la época en setentas – que apareció vi- se usaba m ucho de texto avanza un editor do con una infinidad de com binaciones de teclas y casi c secuencia de cara u a l q u i e r cteres como co m an do s. Su no m br e es TECO. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 111 Edición de Archivos de Texto: vi Archivos de Texto Desde el comienzo UNIX se planeó para trabajar texto, grandes cantidades de texto, por ello, desde siempre ha habido muchas utilidades para el manejo de texto. De todas las utilidades para el manejo de texto la central es la herramienta de creación de contenido –y de edición-: el editor de texto. Editores de Texto: vi En UNIX se cuenta con múltiples editores de texto, que varían de plataforma a plataforma, pero hay unos que están estandarizados en los libros POSIX y en la especificación UNIX oficial (la última siendo Single UNIX Specification v3 o UNIX 03), de éstos el más importante es vi. Este editor, llamado por el comando que lo invoca toma el nombre de un editor anterior llamado ex, que era una versión “moderna” de otro anterior con el cual mantiene la compatibilidad –llamado ed-. En ex, usar el comando vi lleva al modo “visual” de edición – normalmente se trabaja a través de comandos, parecidos a las actuales macros de los editores de ambiente gráfico-. El modo visual de ex es exactamente el actual comando vi. Es más hoy en día son el mismo programa (son dos links o nombres del mismo archivo), y si se invoca ex inicia en modo comandos, y si se invoca vi inicia en modo visual. Modos de vi vi es un editor de texto modal, y qué es modal? que vi sea modal significa que las teclas que se presionen tienen un efecto diferente del modo en que está trabajando vi en el momento. Cuando vi está en modo inserción de texto las letras y símbolos del teclado simplemente insertan los caracteres de las teclas en el archivo que se esté editando; pero, cuando vi está en modo comando muchas letras y símbolos del teclado realizan funciones, funcionan como comandos. Esto puede verse raro, pero tiene un razonamiento directo: El teclado de la terminal donde se desarrolló vi no tenía muchas teclas, en especial no tenía teclas de función, básicamente la tecla shift y la tecla control. Si se usan las teclas básicas para los comandos no hay que usar combinaciones especiales de teclas, por lo que las manos del usuario se estresan menos –el principal origen del síndrome del tunel del Carpio-. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 112 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 113 Editar archivos existentes con vi Editar archivos de texto ya existentes con vi es muy sencillo, simplemente se puede abrir uno con vi nombreArchivo o se pueden abrir varios simultáneamente dándolos todos como argumentos –como siempre, separados por espacios-: vi archivo1 archivo2 archivo3 vi los abrirá todos, en diferentes “pantallas”. Siendo un programa de terminal de texto no hay manera de cambiar la apariencia de las “pantallas”. vi simplemente los abrirá todos y mostrará en la “primera” pantalla el primero de los archivos. Como se observa, vi muestra en la última línea información de estado: Nombre del archivo, entre comillas dobles Si el archivo no puede ser guardado muestra [Read only] El número de líneas de texto El número de caracteres Para cambiarnos de pantalla simplemente se usa el comando :n (sí, dos puntos n). Para salir de vi, si únicamente se está editando un archivo se usa el comando :q (dos puntos q), pero si se está editando más de un archivo se usa :q! (dos puntos q admiración). Este último comando funciona para todos los casos. Si se intenta salir con :q y hay varios archivos abiertos, vi reportará en la línea de estado There are x more files to edit. En cambio, si se intenta cambiar al siguiente archivo AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 114 cuando ya está en el último archivo (no hay siguiente) vi mostrará en la línea de estado No more files to edit. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 115 Creación de nuevos archivos de texto Crear nuevos archivos de texto con vi es muy sencillo, se hace de la misma manera como se abren archivos existentes, simplemente se nombra o nombran en la línea de comandos, y si vi nota que no existe –cada uno- se prepara para crearlo, nuevo. Ahora vi realmente no crea el archivo si no en el momento que se guarde. vi nombreNuevo Como se observa, vi muestra una pantalla llena de símbolos ~, donde cada símbolo ~ representa una línea no existente en el archivo. También vi muestra información en la línea de estado: Nombre del nuevo archivo a crear, entre comillas dobles El texto informativo [New file] Para salir del archivo o los archivos se usa el mismo comando que antes :q (dos puntos q) Ahora, como los archivos nuevos no existen realmente si no cuando se guarden en disco, hay que guardar, y esta operación se realiza con el comando :w (dos puntos w) por archivo. Cuando vi guarda un archivo, reporta en la línea de estado el nombre del archivo guardado, entre comillas dobles, el número de caracteres y el número de líneas en el archivo recién guardado. Ahora, si el usuario puede sobreescribir un archivo –por ejemplo es el dueño del archivo- pero los permisos del mismo dicen que debería estar protegido, cuando se intente guardar vi reportará The file has read permission only, pero podrá escribirse de todas maneras sobre el archivo si se usa el comando :w! (dos puntos w admiración). AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 116 Muchas veces el usuario está trabajando un archivo y quiere terminar de trabajar, por ello necesita guardar y salir de vi. Estas dos operaciones pueden llevarse a cabo con: Comando :w y el comando :q Comando combinado :wq Comando :x Todos los tres comandos son sinónimos. Ahora, si el usuario ha hecho cambios en un archivo y desea salir, pero no desea mantener los cambios, es decir le interesa salir sin guardar vi no se lo permitirá, reportando No write since the file was last change. Si el usuario realmente desea salir de vi sin guardar deberá usar entonces el comando :q! (dos puntos q admiración). AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow Como es posible sacar a vi del modo comando y que los comandos aquí mencionados no funcionen de berá recordar qu e pa ra en tr ar a m od o comando se pu ede presionar escape las ve ces necesarias (hasta que vi pite !) 117 Moverse dentro de un archivo vi tiene numerosas maneras de moverse dentro de un archivo, dependiendo de lo que el usuario necesite y del modo en el que vi esté. Lo más básico es que si se tiene una terminal moderna –o un programa cliente con una muy buena emulación- se pueden usar las teclas flecha de movimiento de cursor . También podrán usarse las téclas AvPágina y RetrPágina. Moverse de a líneas Ahora, cuando vi inicia normalmente está en modo comando, y en este modo funcionan también: ‣ h, suprimir o control h para moverse un carácter a la izquierda. Equivalente a la tecla . ‣ l o espacio para moverse un carácter a la derecha. Equivalente a la tecla . ‣ k o control p para moverse una línea arriba. Equivalente a la tecla . ‣ j, control j o control n para moverse una línea abajo. Equivalente a la tecla . ‣ + para moverse a la siguiente línea, ubicándose en el primer carácter visible (en esa línea). ‣ - para moverse a la línea anterior, ubicándose en el primer carácter visible (en esa línea). Moverse de a páginas o pantallas Cuando vi está en modo comando funcionan: ‣ control f para avanzar una pantalla completa. Equivalente AvPágina. ‣ control b para retroceder una pantalla completa. Equivalente a RetrPágina. ‣ control d para avanzar media pantalla. ‣ control u para retroceder media pantalla. ‣ control e para desplazar una línea hacia arriba la pantalla. ‣ control y para desplazar una línea hacia abajo la pantalla. ‣ shift h para llevar el cursor a la primera línea de la pantalla. ‣ shift m para llevar el cursor a la línea en la mitad de la pantalla. ‣ shift l para llevar el cursor a la última línea en la pantalla. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 118 Moverse según el contexto Según el modo en que está trabajando vi las siguientes teclas varían en su funcionamiento, pero si el archivo que se trabaja es un archivo de texto sencillo, y se está en modo comando funcionan: ‣ 0 para moverse al inicio de la línea actual. ‣ $ para moverse al final de la línea actual. ‣ ) para moverse al inicio de la siguiente frase. ‣ ( para moverse al inicio de la anterior frase. ‣ } para moverse a justo antes del siguiente párrafo. ‣ { para moverse a justo antes del actual párrafo. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 119 Inserción de nuevos contenidos de texto (en vi) Entrar nuevo texto en vi es muy fácil. Existen varias maneras, dependiendo de dónde se esté y de dónde se quiere que aparezca el nuevo texto agregado. En modo comando funcionan: ‣ i para insertar texto justo antes de la posición del cursor. Agrega texto si se está al final de una línea. ‣ a para agregar texto justo después de la posición del cursor. ‣ shift i para insertar texto al comienzo de la línea sin importar dónde esté el cursor en la línea. ‣ shift a para agregar texto al final de la línea sin importar dónde esté el cursor en la línea. ‣ o para agregar una línea en blanco después de la actual. ‣ shift o para agregar una línea en blanco antes de la actual. Todos estos comandos cambian el modo de vi, apenas se usen vi se cambia a modo inserción de texto y así permanecerá. Puede cambiarse al modo comando usando la tecla escape. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 120 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 121 Comandos básicos de edición de texto (de vi) vi tiene unos comandos sencillos para modificar texto, son necesarios en las operaciones del día a día con texto. Funcionan cuando se está en modo comando: ‣ x para borrar el carácter debajo del cursor. Borra el carácter a la izquierda del cursor si se está al final de la línea. ‣ X para borrar el carácter anterior al cursor. Borra el carácter debajo del cursor si se está al comienzo de la línea. ‣ r y un carácter para reemplazar el carácter debajo del cursor por el que se escriba a continuación. ‣ R y texto para sobreescribir un texto original. Si se escriben n caracteres se sobrescribirán los n caracteres a partir de la posición del cursor. Se termina la sobreescritura presionando escape. ‣ . para repetir la última operación, sin importar cuál operación de edición haya sido. ‣ u para deshacer el último cambio o edición hecha. ‣ U para deshacer todos los cambios hechos en la línea actual. ‣ >> para indentar la línea actual. ‣ << para de-indentar la línea actual. ‣ ~ para cambiar el carácter debajo del cursor de minúsculas a mayúsculas y viceversa. ‣ shift j para unir la línea que sigue con la actual, para que no sea la línea que sigue sino una parte al final de la línea actual. Ninguno de estos comandos deja a vi en modo inserción, vi permanece en modo comando. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 122 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 123 Buscar y reemplazar textos contenidos (dentro de vi) vi es muy poderoso, y aunque a primera vista se ve primitivo, tiene comandos de búsqueda y movimiento muy poderosos. Mientras se está en modo comando funcionan: ‣ control g para que vi muestre en la línea de estado el nombre del archivo (dentro de comillas dobles), si el archivo es de sólo lectura (muestra [Read Only]), si el archivo ha recibido cambios (muestra [Modified]), muestra en qué línea en el archivo se está, cuántas son y la posición porcentualmente cuánto es. ‣ shift g para ir a la última línea del archivo. ‣ número shift g para ir a la línea con la posición número. Así para ir a la primera línea se dará 1G cuando se está en modo comando. Si el archivo no tiene la línea número vi reporta con una alarma sonora. ‣ /texto para ir a la próxima línea que contenga el texto dado (busca hacia adelante o abajo). Si el texto no se encuentra vi reporta The exists. ‣ ?texto para ir a la previa línea que contenga el texto dado (busca hacia atrás o arriba). Si el texto no se encuentra vi reporta The ‣ pattern does not pattern does not exists. n después de una búsqueda para que vi vuelva a buscar en el mismo sentido. Así si se hizo una búsqueda con / vi volverá a buscar hacia adelante. ‣ N después de una búsqueda para que vi vuelva a buscar pero ahora en el sentido contrario. Así si se hizo una búsqueda con ? vi volverá a buscar, pero ahora hacia adelante. ‣ /texto/+número para que vi busque un texto hacia adelante y se ubique número líneas después de la que contiene el texto. ‣ /texto/-número para que vi busque un texto hacia adelante y se ubique número líneas antes de la que contiene el texto. ‣ ?texto?+número para que vi busque un texto hacia atrás y se ubique número líneas después de la que contiene el texto. ‣ ?texto?-número para que vi busque un texto hacia atrás y se ubique número líneas antes de la que contiene el texto. ‣ :%s/original/reemplazo/ para que vi reemplace en todas las líneas del archivo el texto original por el reemplazo la primera vez que aparezca en cada línea. Normalmente vi diferencia las mayúsculas de las minúsculas. vi reporta cuántas líneas sufrieron modificaciones. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 124 ‣ :%s/original/reemplazo/g para que vi reemplace en todas las líneas del archivo el texto original por el reemplazo todas las veces que aparezca en cada línea. Normalmente vi diferencia las mayúsculas de las minúsculas. vi reporta cuántas modificaciones hizo y en cuántas líneas. Recuerde que las pr te cl a o co m bi esiones de na ci on es de control sólo fu nc modo comando ionan en . Para llegar al modo comando se usa la tecla escape. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 125 Tableros de recortes: Cortar, copiar y pegar vi como los editores de texto más modernos tiene un “tablero de recortes” o “portapapeles” (oficialmente se llama el undo buffer), pero a diferencia de la mayoría de los editores modernos tiene “tableros nombrados”. Todos sirven para copiar, cortar y pegar. Mientras vi está en modo comando funcionan: ‣ dw corta desde donde está el cursor hasta el final de la palabra actual. ‣ número dw corta las número palabras a partir de las palabra actual. ‣ d$ corta desde donde está el cursor hasta el final de la línea actual. ‣ d0 corta desde donde está el cursor hasta el inicio de la línea actual. ‣ dd corta la línea actual. ‣ número dd corta las número líneas a partir de la línea actual. ‣ d) corta desde donde está el cursor hasta el final de la frase actual. ‣ d} corta desde donde está el cursor hasta el final del párrafo actual ‣ yw copia desde donde está el cursor hasta el final de la palabra actual. ‣ número yw copia las número palabras a partir de la palabra actual. ‣ y$ copia desde donde está el cursor hasta el final de la línea actual. ‣ y0 copia desde donde está el cursor hasta el inicio de la línea actual. ‣ yy copia la línea actual. ‣ número yy copia las número líneas a partir de la línea actual. ‣ y) copia desde donde está el cursor hasta el final de la frase actual. ‣ y} copia desde donde está el cursor hasta el final del párrafo actual. ‣ p pega los contenidos del “tablero de recortes” justo después de donde está el cursor. Si son líneas pega justo después de la línea actual. ‣ P pega los contenidos del “tablero de recortes” justo antes de donde está el cursor. Si son líneas pega justo antes de la línea actual. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 126 Recuerde que las pr te cl a o co m bi esiones de na ci on es de control sólo fu nc modo comando ionan en . Para llegar al modo comando se usa la tecla escape. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 127 Editar y trabajar con más de un archivo de texto Aparte de poder dar a vi más de un archivo de texto en la línea de comandos original como ya se ha visto, desde dentro de una sesión se pueden trabajar varios archivos aún si no se cargaron originalmente con la invocación. Hay varias invocaciones que podrán interesar. Estando en modo comando funcionan: graba el archivo que se está editando en la pantalla, con el nombre que ya tiene. Si el archivo no ha sido modificado o no tiene permisos de escritura no lo intenta guardar. ‣ :w ‣ :w! graba el archivo que se está editando en la pantalla, con el nombre que ya tiene, aunque no haya sido modificado o el archivo no tiene permisos de escritura. Si el sistema operativo no permite las modificaciones obviamente no se podrá grabar el archivo. ‣ :w nuevoNombre graba el archivo que se está editando con un nuevo nombre (básicamente la función Guardar como… que se encuentra disponible en los editores modernos) ‣ :w! nuevoNombre graba el archivo que se está editando con un nuevo nombre, aunque no se hayan hecho modificaciones o no tenga permisos de escritura. ‣ :e otroArchivo abre para edición el archivo mencionado en el comando. ‣ :e! re-abre para edición el archivo actual, descartando todos los cambios hechos que no hayan sido guardados ‣ :e+ otroArchivo abre para edición el archivo mencionado, y automáticamente se ubica al final del mismo (se abre el archivo para agregar contenido). ‣ :e+número otroArchivo abre para edición el archivo mencionado, y automáticamente se ubica en la línea número especificada. Si otroArchivo puede abirse pero no tiene tantas líneas como para ubicarse en la línea especificada lo abre pero reporta Not that many lines exist in the file. ‣ :e# vuelve a abrir “el otro archivo”, el último que se estaba editando. ‣ :r otroArchivo importa otro archivo en el que se está editando, es decir lee las líneas del otroArchivo y las inserta justo después de la línea actual en el archivo que se está editando. ‣ :r !unComando ejecuta unComando, y las líneas de texto producidas por el comando las inserta justo después de la línea actual en el archivo que se está editando. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 128 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 129 Personalización del editor de texto vi El editor de texto vi tiene una serie de opciones que gobiernan cómo funciona. Estas opciones gobiernan cómo reacciona a los comandos, como muestra contenido en la pantalla y cómo se manipulan las líneas de texto. Para ver las opciones actualmente en efecto en vi se usa el comando :set muestra a continuación: all como se Como puede apreciarse, hay muchas opciones, pero no todas son de uso común. Entre las más útiles están: ‣ autoindent (ai) opción que activa la indentación automática de las nuevas líneas de texto, para alinearlas con las inmediatamente anteriores. Para desactivar la función se usa noautoindent o noai. ‣ autowrite (aw) ‣ beautifying text (bf) ‣ ignorecase (ic) opción que activa el grabado automático de un archivo antes de cambiarse al siguiente en una sesión. Para desactivar la función se usa noautowrite o noaw. opción que activa la protección de los archivos para que no se puedan insertar caracteres de control en el mismo. Para desactivar la función se usa nobf. opción que hace que el editor ignore la diferencia entre mayúsculas y minúsculas en las búsquedas y los reemplazos. Para desactivar la función se usa noignorecase o noic. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 130 opción que hace que el editor muestre los caracteres tabulador dentro del archivo como ^I y los finales de línea como $. Para desactivar la función se usa nolist. ‣ list ‣ number (un) ‣ shiftwidth (sw=) ‣ showmatch (sm) ‣ showmode (smd) ‣ tabstop (ts=) ‣ wrapmargin (wm=) ‣ wrapscan (ws) ‣ wraptype (wt=) opción que hace que el editor muestre el número de cada línea en la primera columna de la pantalla. Para desactivar la función se usa nonumber o nonu. opción con la que se le define a vi cuántos caracteres de ancho ocupa un tabulador inicial o la indentación automática. El valor predeterminado es sw=8. opción con la que se activa la muestra automática del carácter pareja de (, ), {, }. La función se desactiva con noshowmatch o nosm. opción con la que se activa el aviso en la última línea cuando vi esté en modo inserción de texto. La función se desactiva con noshowmode o nosmd. opción con la que se le define a vi cuántos caracteres espacio debe usar para presentar en un archivo cada carácter tabulador. El valor predeterminado es ts=8. opción con la que se activa la definición del ancho flexible de página. Con esta opción la presentación de una línea mayor que el margen fluye a la siguiente línea de pantalla. El valor predeterminado es wm=0 con lo que el texto no fluye. opción con la que se activa que las búsquedas reinicien en la primera línea del archivo cuando pasen de la última. La opción se desactiva con nowrapscan o nows. opción con la que se configura cómo corta y fluye las líneas vi cuando una línea sea más larga que el margen especificado con wm=. Tiene cuatro posibles valores general, word, rigid, y flexible. A todas estas opciones pueden dársele valor en cualquier momento, usando :set opción o tal vez :set opción=valor. Cuando así se usa, la opción sólo aplica para la sesión actual de edición, es decir, que si se sale del editor vuelven a aplicar los valores predeterminados. Si se desea que vi tenga una cierta configuración y que dicha configuración aplique para todas las invocaciones del editor hay que guardarlas en un archivo de configuración. vi nunca guarda las opciones automáticamente, el archivo debe ser creado. Cuando vi se ejecuta, a menos que se le de la opción para que no lo haga, busca el archivo / etc/.exrc, si lo encuentra carga las opciones de configuración que allí encuentre; luego busca el archivo .exrc en el directorio personal o inicial del usuario, si lo encuentra carga las AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 131 opciones de configuración que allí encuentre; y por último busca un archivo .exrc en el directorio actual de invocación del comando, y si lo encuentra carga las opciones que allí encuentre. Uso práctico de los archivos de opciones de vi Ahora, cómo se usa en la práctica esto? Como /etc es un directorio único en el sistema, y todos los usuarios tienen derecho a buscar cosas allí, si hay un archivo .exrc éste aplicará para todos los usuarios del sistema, así que en este archivo deberán configurarse opciones de vi que aplique para todos los usuarios – usarios que usen vi, claro está-. Como el directorio personal es como el nombre lo indica, propio de cada usuario, si hay un archivo .exrc en el directorio personal, las opciones que allí se encuentren aplicarán para todas las invocaciones de vi de usuario, pero sólo para el usuario. Si se necesitan trabajar unos archivos de texto que están en algún otro directorio y la configuración típica de vi no aplica, puede crearse un archivo .exrc con las opciones, y éstas sólo aplicarán mientras se esté trabajando el directorio. Formato de un archivo de opciones de configuración de vi Un archivo de opciones de vi es muy sencillo, es simplemente un archivo de texto que tiene líneas con las opciones como se escriben en el modo comando de vi, pero sin el carácter : (dos puntos) como prefijo. vi ignora las líneas en blanco y las líneas que comienzan con el carácter “ (comillas dobles). Un archivo válido de opciones de vi podría ser: “no diferenciar mayúsculas de minúsculas set ignorecase “mostrar números de línea set number “avisar cuando esté en modo inserción showmode Recuerde que como el archivo debe llamarse .exrc normalmente no aparecerá en los listados (el nombre comienza con punto). AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 132 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 133 El ambiente de trabajo: procesos y variables El ambiente de trabajo env env env env 41329= telnetd hijo de 33571=ksh hijo de 3128=cron env 1=init hijo de hijo de 5739=inetd env hijo de hijo de hijo de env env 132231=ksh 132231=ksh 51301=dbmgr Los sistemas operativos UNIX tienen todos una arquitectura de ejecución donde cada instancia de comando o programa que se ejecuta en el sistema obtiene una “vista” de un “universo virtual”, donde él es el único programa en ejecución. Ahora, en la realidad todos los UNIX son sistemas multitarea y multiusuario, y por ello, dentro de esa arquitectura hay, por cada programa en ejecución –que oficialmente se llama proceso- un espacio que se llama “el ambiente”. El mencionado “ambiente” es un área de memoria que existe dentro del “universo virtual” de cada proceso. En dicho ambiente escribe el “cargador de procesos” unos valores que definen cómo reacciona el programa al “universo virtual” y cómo reacciona el sistema operativo ante lo que el proceso le solicita. Lo que hay en el ambiente son valores guardados a manera de variables, aunque no todos los valores que allí se encuentra se consideran variables en sí. Como cada proceso ve al sistema como todo para sí, ya que lo que tiene es una vista que le arma un “universo virtual” propio, no hay manera de hacer que un proceso directamente altere los valores que hay en el ambiente de otro proceso. Algunos de los valores que están en el ambiente –oficialmente llamado environment- de un proceso son fáciles de revisar por el proceso, ya que están en “casillas nombradas” con nombre y con valores que se consideran texto. Estos pares se llaman variables de AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 134 ambiente y permiten que de cierta manera un proceso le “pase” información a otro proceso mientras sea un nuevo proceso hijo que el proceso original inicie. Adicionalmente –adicionales a las variables de ambiente- en el ambiente de cada proceso hay: Un número único –único dentro del sistema- que identifica al proceso. Oficialmente se llama “identificador de proceso” o process ID (PID). Este es un número entero positivo siempre. El número identificador de proceso del otro proceso que ordenó el inicio o armó la ejecución del proceso. Oficialmente se llama “identificador de proceso padre” o parent process ID (PPID). El número identificador del usuario que ordenó el inicio o invocó el proceso, así sea indirectamente. Oficialmente se llama “identificador del usuario real” o real user ID (RUID). El número identificador del usuario con el que se le maneja toda la seguridad a las operaciones que realice el proceso; y, casi siempre es el mismo identificador del usuario real. Oficialmente se llama “identificador del usuario efectivo” o effective user ID (EUID). Una lista de números identificadores de grupos a los que el usuario que ordenó la invocación del proceso pertenece. Oficialmente se llama “identificadores de grupos reales” o real group IDs (RGIDs). Una lista de número identificadores de grupos con los que se le maneja la seguridad a las operaciones que realiza el proceso; y casi siempre es la misma lista de grupos que está en RGIDs. El momento exacto en el tiempo en que se inició el proceso. Oficialmente se llama “tiempo de inicio” o starting time (STIME). Cuánto lleva ejecutando el proceso en total, teniendo en cuenta que se ejecuta por períodos muy cortos porque casi siempre tiene que compartir las CPUs del sistema con muchos otros procesos. Oficialmente se llama “tiempo de ejecución” o execution time (TIME). Uno o más números para el manejo de prioridades. Comúnmente son dos números, una base y un variable. El directorio actual donde está trabajando el proceso. Comúnmente es el directorio desde donde se invocó el proceso. Oficialmente se llama “directorio actual de trabajo” o current working directory (CWD). AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 135 Procesos Como cada proceso es una instancia de un programa o comando en ejecución, cada proceso en el sistema necesita de algo de CPU (por lo menos uno turnos cuando no “consume” mucho), cierta cantidad de RAM, y hace ciertas operaciones de I/O. Todo proceso en el sistema afecta en algo, entonces puede al usuario interesarle: Sus propios procesos cuánto afectan a los demás. Cuán afectado se ven sus propios procesos afectados por lo que hacen los procesos de los demás. Nótese que cómo afectan a los demás y cómo son afectados por los demás es el resultado indirecto de estar en el mismo sistema, no es algo directo porque los UNIX son un ambiente protegido de ejecución, que no permite que un proceso pueda manipular directamente el ambiente donde otro proceso existe y se ejecuta. Iniciar y detener procesos Como un proceso es una instancia de programa y comando en ejecución, iniciar un proceso es simplemente invocar un comando o iniciar un programa. Este sólo hecho inicia al menos un proceso –algunos programas cuando inician ejecutan otros programas accesorios que necesitan para funcionar-. Detener oficialmente un proceso en UNIX es decirle a un programa que termine de la manera que al programa se le dice. Por ejemplo: la mayoría de lo que uno llama comando es un programa que realiza una tarea sencilla, y cuando el programa termina dicha tarea el sólo programa termina, sin necesidad de solicitarle. Como un proceso es un programa en ejecución, si un programa termina, el proceso que lo representa desaparece de la lista de procesos. Por otro lado, programas como vi, que trabaja interactivamente necesita que se le diga “termine” usando algún tipo de comando interno o menú; en el caso de vi, se le dice usando el comando escape :q! o escape :x! AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 136 El comando ps es uno de los pocos importan tes que no están tot a estandarizados en l m e n t e UNIX. Hay dos va todos los ria la información qu ciones en e muestra ps y en lo que sig opciones de ps. nifican las Un que aplica para a variante, AI Solaris deriva del X y para UNIX original de AT&T y otra variante aplica para Mac OS X deriva de los UNIX BSD. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 137 Listar procesos Listado básico de procesos: ps Para listar procesos se usa un comando muy sencillo llamado ps (process status). Este es un comando increíblemente variado, donde casi todas las letras del alfabeto son opción. Afortunadamente la ejecución más sencilla, sin opciones, es usable: [0 e@Moe ~] ps PID TT STAT 8009 p1 S TIME COMMAND 0:00.03 -bash La ejecución del comando ps sin opciones sólo obtiene un listado de los procesos del usuario que lo invoca, en la ventana de sesión actual y sin muchos detalles. Muestra, a saber: Una línea con títulos de columnas (PID, TT, STAT, TIME, COMMAND) Para cada proceso una línea o renglón de texto. El número identificador único de cada proceso debajo del título PID. El nombre corto de la ventana de sesión debajo del título TTY . Unas letras que describen el estado del proceso que la línea representa. Un tiempo en minutos:segundos.fracción, que acumula todo el tiempo que el proceso a usado dentro de la(s) CPU(s) del sistema bajo el título TIME. El nombre del proceso, derivado del nombre del comando. Note que como cada proceso tiene acceso a su ambiente, un proceso puede cambiar el título que aquí se muestra, bajo el título de columna COMMAND. Listado de todos los procesos: ps –e Cuando se necesite listar la información de todos los procesos del sistema –exceptuando los miniprocesos internos del núcleo o kernel- se puede usar la opción e del comando ps. Esta opción hace que ps muestra las columnas seleccionadas según el caso (si no se dan más opciones el identificador de proceso o PID, la terminal de control o TTY, el tiempo acumulado en ejecución de CPU o TIME, y el nombre del comando. Si al comando ps –e se le agregan otras opciones, se mostrará lo que las otras opciones seleccionen, pero para todos los procesos. Listado largo (técnico) de los procesos: ps –l Si se necesita información detallada acerca de los procesos, puede usarse tal vez la opción l del comando ps que presenta unas columnas con detalles más técnicos acerca de los procesos seleccionados (sólo de la sesión actual sin más opciones, procesos de un usuario con u o todos los procesos con e). El comando muestra, varias columnas, a saber: AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 138 Esta columna muestra el usuario que inició o bajo cuya identidad está corriendo cada proceso. UID PID Esta columna muestra el identificador único de cada proceso mostrado. PPID Esta columna muestra el proceso padre desde donde se inició el proceso. C STIME TTY TIME CMD Esta columna muestra el porcentaje aproximado actual de turnos de CPU que está usando cada proceso. Esta columna muestra cuándo se inició cada proceso. Si el proceso inició hoy muestra la hora (en formato HH:MM:SS, la horas de 00 a 23), y si se inició antes, muestra la fecha. Esta columna muestra la terminal de control del proceso. Cuando el proceso no está relacionado con una terminal muestra ?. Esta columna muestra el tiempo acumulado de CPU, con el total de consumo de CPU sumando los turnos de ejecución desde que el proceso inició. Esta columna muestra el nombre de cada proceso como está registrado en la memoria. Muchas veces muestra el nombre completo del archivo ejecutable del procesos, pero como esta información está en el ambiente de cada proceso y los mismos pueden escribir en su propio ambiente puede mostrar otra información o información incompleta. Listado completo (full) de información de los procesos: ps –f Si se necesita información detallada acerca de los procesos, puede usarse tal vez la opción f del comando ps que presenta unas columnas con detalles más técnicos acerca de los procesos seleccionados (sólo de la sesión actual sin más opciones, procesos de un usuario con u o todos los procesos con e). El comando muestra, varias columnas, a saber: Esta columna muestra el nombre del usuario que inició -o bajo el que se inició- el cada proceso. UID PID PPID C STIME Como siempre, esta columna muestra el número identificador único del proceso. Esta columna muestra el número identificador del proceso padre de cada uno de los procesos. Esta columna muestra el consumo promedio porcentual -redondeado a entero- de cada uno de los procesos. Esta columna muestra cuándo se inició cada uno de los procesos. Si el proceso inició hoy mismo muestra la hora, pero si no, muestra la fecha únicamente. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 139 Esta columna muestra la terminal de control del proceso. Cuando el proceso no está relacionado con una terminal muestra ? TTY TIME CMD Esta columna muestra muestra el tiempo acumulado de ejecución, contando la suma de los turnos de procesador que ha consumido cada proceso desde el momento del inicio. Esta columna muestra, si es posible, el comando que constituye el proceso, con todo y la sintaxis de inicio. Ejemplo: 0 root@abe:/> ps -f UID PID PPID root 135342 249876 root 249876 172188 C STIME 1 00:30:24 3 00:30:22 TTY pts/0 pts/0 TIME CMD 0:00 ps -f 0:00 -bash Variantes BSD - Listado extendido de procesos: ps –U nombreUsuario Si se quiere o se necesita la información acerca de todos los procesos en un sistema iniciados por o relacionados con un usuario puede usarse el comando ps –U nombreUsuario. Este comando es muy común en ambientes de servidor dedicado –donde un sistema básicamente fue adquirido para ejecutar una aplicación y lo demás es accesorio. Esta versión del comando muestra, a saber: El identificador único de cada proceso, bajo la columna PID, como siempre. El nombre de la terminal de control o de interacción con el proceso, bajo el título de columna TT. El estado del proceso bajo la columna STAT. De los estados se hablará más adelante. El tiempo acumulado de ejecución, en minutos:segundos.fracción. El nombre largo del programa/proceso, lo más completo posible. Ejemplo: [0 e@moe:~] ps -U e PID TT STAT TIME COMMAND 115 ?? Ss 0:29.51 /System/Library/Frameworks/ ApplicationServices.framew 122 ?? Ss 0:23.59 /System/Library/CoreServices/loginwindow.app/ Contents 133 ?? Ss 0:00.58 /System/Library/CoreServices/pbs 138 ?? S 0:13.01 /System/Library/CoreServices/Dock.app/Contents/ MacOS/ 139 ?? S 0:00.37 aped 141 ?? S 6:54.35 /System/Library/CoreServices/SystemUIServer.app/ Conte AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 140 142 ?? S 1:07.88 MacO 147 ?? S 0:14.01 Reso 148 ?? S 0:01.23 iCalAlarmSc 149 ?? S 1:48.19 UniversalAccessPref.p /System/Library/CoreServices/Finder.app/Contents/ /Library/PreferencePanes/Growl.prefPane/Contents/ /Applications/iCal.app/Contents/Resources/ /System/Library/PreferencePanes/ Puede obtenerse un listado donde se muestre completa la última columna –el nombre completo del programa/proceso- si se agrega la opción w al comando ps: [0 e@moe:~] ps -wU e PID TT STAT TIME COMMAND 115 ?? Ss 0:29.86 /System/Library/Frameworks/ ApplicationServices.framework/Frameworks/ATS.framework/Support/ATSServer 122 ?? Ss 0:23.67 /System/Library/CoreServices/loginwindow.app/ Contents/MacOS/loginwindow console 133 ?? Ss 0:00.58 /System/Library/CoreServices/pbs 138 ?? S 0:13.05 /System/Library/CoreServices/Dock.app/Contents/ MacOS/Dock -psn_0_393217 139 ?? S 0:00.37 aped 141 ?? S 7:02.79 /System/Library/CoreServices/SystemUIServer.app/ Contents/MacOS/SystemUIServer -psn_0_524289 Listado extra extendido de procesos, en BSD: ps –aux Si se quiere o necesita la información de todos los procesos del sistema, puede usarse – entre otros- el comando ps con opciones: La opción a solicita que el comando ps muestre todos los procesos de todos los usuarios –incluidos los propios- independiente de la ventana de sesión desde donde se controlan. La opción u solicita que el comando ps muestre información adicional acerca de los procesos. Incluye información: PID, usuario, porcentaje promedio de CPU consumido, porcentaje promedio de RAM consumida, tamaño virtual del proceso, tamaño residente del proceso, terminal de control, estado, tiempo de inicio, tiempo acumulado de CPU, y nombre del comando. La opción x solicita al comando ps que muestre información de los procesos que no tienen una terminal de control. Ejemplo: [0 e@Moe ~] ps -aux USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND e 7987 2.5 -5.2 391148 108204 ?? S 7:01AM 4:24.98 /Applications/ Microsoft Office 2004/Microsoft Word -psn_0_39452673 e 3901 1.1 -0.4 246928 8292 ?? S Sat08PM 5:36.87 /Applications/ Utilities/Terminal.app/Contents/MacOS/Terminal -psn_0_3932161 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 141 windowse 3830 1.0 -4.4 835992 91932 ?? Ss Sat08PM 55:17.99 /System/Library/ Frameworks/ApplicationServices.framework/Frameworks/CoreGraphics.framework/Resources/ WindowServer -daemon e 3845 0.4 -0.6 262328 13264 ?? S Sat08PM 15:00.64 /System/Library/ CoreServices/SystemUIServer.app/Contents/MacOS/SystemUIServer -psn_0_655361 e 4010 0.3 -1.8 308184 36992 ?? S Sat09PM 38:04.42 /Applications/ iTunes.app/Contents/MacOS/iTunes -psn_0_7864321 e 8009 0.1 -0.0 27892 948 p1 S 7:17AM 0:00.14 -bash e 3890 0.1 -11.5 602380 240140 ?? S Sat08PM 31:15.49 /Applications/ Safari.app/ Contents/MacOS/Safari -psn_0_3145729 root 40 0.1 -0.1 30248 1912 ?? Ss Sat10AM 3:44.29 /usr/sbin/configd root 41 0.0 -0.1 33144 1836 ?? Ss Sat10AM 0:06.13 /usr/sbin/ coreaudiod root 42 0.0 -0.1 27780 1132 ?? Ss Sat10AM 0:05.27 /usr/sbin/ diskarbitrationd root 44 0.0 -0.0 28320 508 ?? Ss Sat10AM 0:00.17 /usr/sbin/memberd -x root 45 0.0 -0.0 27864 392 ?? Ss Sat10AM 0:01.73 /usr/sbin/notifyd root 46 0.0 -0.1 29204 1660 ?? Ss Sat10AM 0:01.72 /usr/sbin/ securityd root 48 0.0 -0.0 27672 852 ?? Ss Sat10AM 0:12.89 /usr/sbin/ distnoted root 49 0.0 -0.1 31456 2124 ?? Ss Sat10AM 0:05.36 /usr/sbin/ DirectoryService root 52 0.0 -0.0 27248 172 ?? Ss Sat10AM 3:52.75 /usr/sbin/update root 63 0.0 -0.1 38280 2368 ?? S Sat10AM 0:08.28 /usr/sbin/blued root 64 0.0 -1.2 71476 25204 ?? Ss Sat10AM 1:29.30 /System/Library/ CoreServices/coreservicesd e 71 0.0 -0.6 98476 11580 ?? Ss Sat10AM 1:34.34 /System/Library/ Frameworks/ApplicationServices.framework/Frameworks/ATS.framework/Support/ATSServer root 82 0.0 -0.0 27768 104 ?? Ss Sat10AM 0:00.01 /usr/libexec/ crashreporterd root 114 0.0 -0.3 47288 5740 ?? Ss Sat10AM 1:49.11 /System/Library/ Frameworks/CoreServices.framework/Frameworks/Metadata.framework/Versions/A/Support/mds root 132 0.0 -0.2 30600 3520 ?? Ss Sat10AM 0:10.09 /usr/sbin/cupsd L root 150 0.0 -0.0 27508 260 ?? Ss Sat10AM 0:10.92 ntpd -f /var/run/ ntp.drift -p root 164 0.0 -0.0 29308 60 ?? Ss Sat10AM 0:00.00 nfsiod -n 4 … Como se puede observar la lista puede llegar a ser muy grande –habiéndose extraído la información de una estación de trabajo –básicamente con un único usuario-. Acerca de las columnas: %CPU La columna %CPU del comando ps -aux muestra un promedio porcentual de lo consumido en turnos de CPU por cada proceso desde el momento en que se inició. Como cada proceso inicia –y consume CPU- desde un momento del tiempo diferente, los porcentajes no se refieren a los mismos momentos del tiempo y por ello las sumatorias o cualquier otro cálculo no tienen que sumar un valor específico. Adicionalmente, si un proceso lleva días de iniciado y casi nunca ha consumido pero ahora último consume bastante el promedio no lo indicará. Así que esta columna no es un indicador definitivo de cuáles procesos afectan ahora más en el sistema. Adicionalmente, en algunos UNIX la cantidad de CPU en un sistema es un AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 142 valor lógico, virtual o físicamente cambiable, y este comando –no siendo consciente de estono tiene en cuenta estos factores de cambio, por lo que la información mostrada es sólo un indicador guía, no un valor realmente exacto. Acerca de las columnas: %MEM La columna %MEM del comando ps –aux muestra un promedio porcentual de lo consumido en páginas de memoria por cada proceso desde el momento en que se inició. Igual que en el punto anterior, como cada proceso inicia –y ocupa memoria- desde un momento diferente del tiempo, los porcentajes no se refieren a los mismos momentos del tiempo y por ello las sumatorias o cualquier otro cálculo no tienen que sumar un valor específico. Adicionalmente, si un proceso lleva días de iniciado y casi nunca ha consumido pero ahora último consume bastante el promedio no lo indicará. Así que esta columna no es un indicador definitivo de cuáles procesos afectan ahora más en el sistema. Adicionalmente, en algunos UNIX la cantidad de RAM en un sistema es un valor lógico, virtual o físicamente cambiable, y este comando –no siendo consciente de esto- no tiene en cuenta estos factores de cambio, por lo que la información mostrada es sólo un indicador guía, no un valor realmente exacto. Acerca de las columnas: STATE La columna STAT o STATE del comando ps –aux o ps –U o ps –w muestra dos caracteres que resumen el estado actual del proceso –actual cuando se ejecutó el comando ps-. Básicamente muestra: para los comandos “inactivos” (idle). Estos procesos llevan durmiendo, sin hacer nada más de veinte (20) segundos. ‣ I ‣ R ‣ S ‣ T ‣ U ‣ Z es el indicador para un proceso “en ejecución”, no necesariamente en CPU cuando se ejecutó el comando ps. La letra indica runnable. es el indicador para los procesos “durmientes” (sleeping). Este carácter se usa para los procesos que llevan durmiendo máximo unos veinte (20) segundos. es el indicador para los procesos “forzosamente detenidos” (stopped). Estos procesos están en el mencionado estado debido a una señal externa a ellos. Estos procesos no recontinuarán a menos que externamente se les señale. es el indicador para los procesos que están en una espera no interrumpible. Estos procesos casi siempre están a espera de una respuesta de I/ O o de hardware y no pueden ser detenidos en medio de la operación. es el indicador para los residuos de procesos terminados que no han sido “recolectados” por los procesos padre. El carácter resume al estado zombie. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 143 Procesos de fondo Los UNIX son sistemas multitarea y multiusuario, por ello, aunque no lo parezca al usuario desprevenido, pueden aún desde una única ventada de terminal o de sesión, iniciarse múltiples procesos, aunque normalmente no visibles simultáneamente como se puede en un ambiente gráfico multi-ventanas. Ejecución de procesos “de fondo” (en background) La manera más fácil de iniciar procesos que se ejecuten mientras se trabaja con otras cosas en la línea de comandos es usando el símbolo & (and) al final de un comando. Ejemplo: Si se necesita probar la conectividad –con ping- mientras se hace otra cosa en la línea de comandos se puede intentar: [0 e@Moe ~] ping -q localhost & [1] 1106 PING localhost (127.0.0.1): 56 data bytes [127 e@Moe ~] telnet localhost 22 Trying ::1... Connected to localhost. Escape character is '^]'. SSH-1.99-OpenSSH_4.5 nótese lo que reporta el & esta es salida del comando La mencionada aquí no es la única manera de hacer manejo de sesiones y de procesos m ul tit ar ea en UN manera es el uso IX . O tr a del comando screen. Mientras todo sigue, el comando terminado en & se ejecuta sin acceder a la terminal (ni teclado ni control de pantalla). Nótese que los sistemas UNIX pondrán a un proceso de fondo en pausa automáticamente si y cuando intente controlar la terminal de sesión (por ejemplo especificando posición, colores o atributos a un aviso de texto) o si intenta leer de la terminal (el teclado se mantiene ocupado con lo que el usuario esté trabajando interactivamente). Listar procesos de fondo Para listar los procesos de fondo asociados con trabajos iniciados desde ventana de sesión actual se usa el comando jobs. Es muy sencillo: [0 e@Moe ~] ping -q localhost & [1] 1158 [PING localhost (127.0.0.1): 56 data bytes esta es salida del comando [0 e@Moe ~] jobs [1]- Running ping -q localhost & [2]+ Stopped vi [0 e@Moe ~] Como se observa, de manera predeterminada muestra tres (3) columnas: La primera columna muestra el número del trabajo (entre símbolos []). Esta columna tiene anexa además un más (+) o un menos (-). El símbolo se usa para AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 144 indicar cuáles trabajos son usables para el cambio rápido con los comandos fg, bg y kill que se mencionarán más adelante. La segunda columna muestra el estado del proceso que es representado por la tarea (job). El estado Running aplica para jobs cuyo proceso tiene estado R como se ha mencionado en la descripción del comando ps. El estado Stopped aplica para jobs cuyo proceso tiene estado T en la descripción del comando ps. La tercera columna describe el comando ejecutado que constituye el trabajo. Aunque no se usa mucho, si se tienen muchos trabajos en una ventana de sesión, es útil conocer que con jobs %número puede listarse sólo un trabajo de fondo, y que con jobs %texto pueden listarse todos los trabajos de fondo cuyo comando comienza con el texto especificado. Manejo de las tareas de fondo con fg y con bg La idea principal de tener tareas de fondo es la posibilidad de hacer provecho de la multitarea de UNIX aunque se tenga una única terminal de sesión de modo texto. Cuando se tienen trabajos multitarea que aparecen en los listados del comando jobs se puede: Llevar el intérprete del shell al fondo, y traer una de las tareas de fondo a sesión interactiva. El comando fg o fg %+ trae la última tarea, que es la que normalmente aparece con un símbolo de + después del número de tarea en los listados de jobs. Si el proceso está detenido (Stopped) además de traerlo a la sesión interactiva el proceso es recontinuado. El comando fg %- trae la penúltima tarea. El comando fg %número trae la tarea listada con dicho número en jobs. Hacer que una tarea que aparece con estado Stopped reinicie –si se puede- pero mientras continúa trabajando en el fondo con el comando bg. El comando bg o bg %+ hace continuar la tarea que se lista con el símbolo + junto a su número de tarea en el comando jobs. Puede hacerse continuar la penúltima tarea con bg %o puede seleccionarse cualquiera con bg %número también. Señales a procesos: combinaciones de tecla y el comando kill Como se diseñó la arquitectura de protección de procesos de los sistemas UNIX. Un proceso cualquiera no puede intervenir fácilmente en lo que sucede en cualquier otro proceso –o el ambiente de otro proceso. Hay oficialmente unas maneras como se un proceso puede interactuar con otro. Una manera es a través del uso de señales. Las señales son mensajes sencillos que un proceso puede enviar a otro, o que el sistema envía a procesos automáticamente como respuesta a ciertos eventos, como el uso de ciertas combinaciones de tecla. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 145 Note especialmente que las señales generadas automáticamente por el sistema siempre son a un grupo de procesos, no a un único proceso. Note que un proceso o tarea puede programarse para que ignore ciertas señales que se le envíen, pero no todas las señales son ignorables. Un grupo de procesos es el conjunto de programas iniciado en alguno específico y que contiene los procesos hijos y los hijos de los hijos –y así sucesivamente-. El comando básico para el envío de señales a procesos es kill. Este comando de desafortunado nombre se usa para enviar señales específicas a procesos o trabajos especificados. Como se ha diseñado en UNIX, el comando no interactúa con el proceso o procesos destino, el comando solicita al proceso maestro init que envíe la señal al proceso o procesos destino. Algunas combinaciones de teclas como control c, control z, control \ hacen que el núcleo del sistema envíe señales idénticas a las de kill a todo un grupo de procesos. Sintaxis del comando kill El primer uso del comando kill es el de poder listar las posibles señales que se pueden enviar. No todas las señales están estandarizadas a través de toda la amplia gama de sistemas en la familia UNIX. Para listar qué señales están disponibles para enviar en el sistema actual se usa kill –l: [1 e@Moe ~] kill -l 1) SIGHUP 2) SIGINT 5) SIGTRAP 6) SIGABRT 9) SIGKILL 10) SIGBUS 13) SIGPIPE 14) SIGALRM 17) SIGSTOP 18) SIGTSTP 21) SIGTTIN 22) SIGTTOU 25) SIGXFSZ 26) SIGVTALRM 29) SIGINFO 30) SIGUSR1 3) 7) 11) 15) 19) 23) 27) 31) SIGQUIT SIGEMT SIGSEGV SIGTERM SIGCONT SIGIO SIGPROF SIGUSR2 4) 8) 12) 16) 20) 24) 28) SIGILL SIGFPE SIGSYS SIGURG SIGCHLD SIGXCPU SIGWINCH Para enviar una señal se usa kill –señal númeroProceso … o para enviar una señal a una tarea se usa kill –señal %númeroTarea. Para enviar una señal a todo un grupo de procesos se usa kill –señal –númeroGrupo. Las señales, en el comando kill, pueden especificarse usando el número obtenido del listado, el nombre completo (también obtenido del listado) o el nombre cortado, sin el prefijo SIG. Acerca de las señales Algunas de las señales son típicas o están estandarizadas: La señal 1, HUP o SIGHUP (hang up) es enviada automáticamente por el sistema a todos los procesos del grupo relacionados con una ventana de sesión que ha sido AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 146 cerrada, desconectada o que ha sufrido desconexión en las comunicaciones. Como muchos de los procesos que implementan servicios en los ambientes UNIX son procesos que no están relacionados con ventanas de sesión, esta señal se reusa mucho para señalar a un proceso de servicio que reinicie o que recargue su configuración. La señal 2, INT o SIGINT (interrupt) es enviada automáticamente –generalmentepor el sistema a el proceso interactivo actual cuando se presiona la combinación de teclas control c. La señal 3, QUIT o SIGQUIT es enviada automáticamente por el sistema a el proceso interactivo actual cuando se presiona una combinación de teclas predefinida. Comúnmente se usa la tecla control \ para esta señal. Normalmente esta señal hace que el proceso que la recibe termine pero que al terminar genere un archivo de depuración core. La señal 9, KILL o SIGKILL es enviada únicamente a través de un comando, típicamente el del mismo nombre, kill. Esta señal no es ignorable y al proceso destino no se le da tiempo para haga los pasos de limpieza necesarios para un cierre ordenado, por lo que el proceso que la recibe termina inmediatamente e irrevocablemente. La señal 10, BUS o SIGBUS (bus error) es una señal que genera y envía el sistema a un proceso o tarea cuando se dan ciertos errores de hardware o cuando hay corrupción en un archivo ejecutable en ejecución. Esta señal siempre termina un proceso inmediatamente –a menos que el proceso esté bloqueando estas señales-. La señal 11, SEGV o SIGSEGV (segment violation) es una señal que genera y envía el sistema a un proceso cuando encuentra que el mismo ha intentado acceder a una dirección de memoria por fuera de su entorno virtual de ejecución. Esta señal siempre termina irremediablemente al proceso. La señal 15, TERM o SIGTERM (termination) es una señal con la que se le solicita a un proceso su terminación. El proceso que la recibe puede ignorarla, y si no la ignora puede hacer un cierre ordenado. Esta es la señal predeterminada del comando kill, así usar kill númeroProceso hace el envío de esta señal TERM. La señal 17, STOP o SIGSTOP es una señal con la que se solicita al proceso maestro init que “congele” a un proceso o grupo de procesos y los deje en estado Stopped. Esta señal no es ignorable ni bloqueable por los procesos. Esta señal es generada y enviada automáticamente por el sistema cuando se presiona una combinación de teclas. Comúnmente se usa la combinación control z para hacer envío de esta señal. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 147 La señal 19, CONT o SIGCONT (continue) es una señal con la que se le solicita al proceso maestro init que “descongele” a un proceso o grupo de procesos para que dejen de estar Stopped. Como los procesos están congelados –realmente no están en ejecución- no es ignorable ni bloqueable. Los comandos fg y bg usan esta señal para hacer que un trabajo de fondo que está en estado Stopped sigue en ejecución. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 148 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 149 Variables de ambiente Muchos procesos en UNIX necesitan de los valores en las variables de ambiente para funcionar o simplemente para hacer lo correcto o lo que se espera; adicionalmente, muchos de los programas en UNIX necesitan invocar subprogramas sencillos para realizar su labor (el editor vi no sabe corregir ortografía o imprimir, por ejemplo). La manera más sencilla de pasar información en estos casos es una manera estandarizada en UNIX: un proceso puede seleccionar la información inicial del ambiente de con la que todos sus procesos hijos inician –prácticamente no se puede seleccionar la información relacionada directamente con la seguridad-. Cuando se trata del intérprete de comandos shell –un programa que casi lo único que hace es invocar subprogramas-, hay cómo fácilmente revisar las variables del ambiente donde está trabajando y cómo seleccionar la información que copia a sus subprogramas hijos. Una variable de ambiente como se ha mencionado es un valor –limitado básicamente por la memoria disponible en el sistema- considerado como texto, manejado a través de una etiqueta o nombre de variable. Como muchísimas otras cosas en UNIX, se diferencia entre mayúsculas y minúsculas. Listar las variables de ambiente del intérprete shell Si el intérprete que se está usando es Bourne, Bourne Again o Korn, para revisar las variables de ambiente se usa el comando set: [0 e@Moe ~] set BASH=/bin/bash BASH_VERSINFO=([0]="2" [1]="05b" [2]="0" [3]="1" [4]="release" [5]="powerpcapple-darwin8.0") BASH_VERSION='2.05b.0(1)-release' CDPATH=.:/Users/e/:/Users/e/Documents:/ CLICOLOR=1 COLUMNS=80 DIRSTACK=() DISPLAY=:0.0 EUID=501 GROUPS=() HISTFILE=/Users/e/.bash_history HISTFILESIZE=500 HISTIGNORE='*rot*' HISTSIZE=500 HOME=/Users/e HOST=Moe HOSTNAME=Moe.local HOSTTYPE=powerpc IFS=$' \t\n' LANG=en_US.UTF-8 … AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 150 Ahora, como el shell no todas las variables las copia a los subprocesos hijos, existe otro comando que muestra de las variables del ambiente cuáles se copiarán a los subprocesos hijos. Este último comando es export: [0 e@Moe ~] export declare -x CDPATH=".:/Users/e/:/Users/e/Documents:/" declare -x CLICOLOR="1" declare -x DISPLAY=":0.0" declare -x HISTIGNORE="*rot*" declare -x HOME="/Users/e" declare -x HOST="Moe" declare -x HOSTNAME="Moe.local" declare -x LANG="en_US.UTF-8" … Como puede observarse las variables de ambiente que se copian a los procesos hijos son un subconjunto de las variables de ambiente del shell. Esta no es la situación para los otros programas. Definición de nuevas variables en el intérprete shell Para crear una nueva variable de ambiente en el intérprete shell se usa una sintaxis muy sencilla: nombreVar1=valor1 Como se observa simplemente se nombra una variable y se una con un valor por medio de un símbolo de igual (=) sin espacios alrededor. La variable asume un valor único, por lo que únicamente se puede asignar un valor. Si se necesita insertar un valor multi-palabra en una variable se ponen comillas sencillas o dobles –dependiendo exactamente de lo que se necesite hacer- alrededor de los valores múltiples, para que se entienda como un único valor: nombreVar1=”valor multi palabras” Note que si la variable nombrada con nombreVar1 no existe se crea con la ejecución de la sentencia anterior, pero si la variable previamente existía simplemente se reusa pero se le define un nuevo valor, con lo que el valor anteriormente guardado en la Note que siempr e se menciona variable se pierde definitivamente. “c op ia s de Las variables del intérprete shell existen únicamente en memoria, con lo que el límite de lo que se puede almacenar en una variable está limitado por la memoria disponible en el sistema, y además, los valores almacenados en las variables se pierden cuando se cierre el intérprete shell o termine la sesión. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow va ri ab procesos hijos re le ”. Lo s cib que pueden m en copias odificar con libertad sin que se variables en el pr afecten las oceso padre shell. 151 Paso de variables entre grupos de procesos env 41329=telnetd env hijo de Para que un proceso pase variables a otros procesos deberá cumplirse una única condición: como los sistemas UNIX son de memoria protegida lo único factible es pasar copias de ciertas variables de ambiente a los procesos hijo nuevos, justo en el momento de la creación –de los procesos hijo-. Cuando se trata del intérprete de comandos shell se especifica qué subconjunto de las variables del ambiente del shell se copiarán a los comandos ejecutados, comandos que inician procesos hijo. Existen dos maneras: Una copia de cada una de las variables de la lista de exportadas es recibida en el ambiente por cada uno de los procesos hijos de intérprete o shell. Puede especificarse un juego de variables con valor en la línea de comandos que inicia un nuevo proceso. Estas variables son insertadas en el ambiente del nuevo proceso aunque no hacen parte del ambiente del intérprete de comandos. Uso del comando export El comando export es muy sencillo. Si una variable existe puede usarse export nombreVariable … para que la misma quede marcada como “de copia al ambiente de todos los procesos hijos nuevos, de aquí en adelante”. Si la variable no existe el intérprete shell define el nombre, para que cuando una variable con el nombreVariable sea definida, automáticamente se trate como de copia a los procesos hijos. Puede también definirse una variable, asignársele valor y definirla como de copia a los procesos hijo, todo en una sola operación con export nombreVar1=valor1 nombreVar2=”valor múltiple 2” … AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 152 Las variables del intérprete shell se remueven de la memoria con unset. Remover con unset una variable definida como de copia a los procesos hijos la remueve también de la lista de copia, y si se vuelve a definir como variable no nace nuevamente como variable definida de copia a los procesos hijos. Para remover una variable de la memoria –y al mismo tiempo de la lista de copia- se usa: unset nombreVariable … Note que las variables no exportadas sólo existen en el ambiente del intérprete y por eso ningún otro proceso o comando tiene acceso a las mismas o los valores contenidas en ellas. Paso de variables nuevas no preexistentes en el intérprete Si necesita insertar una o algunas variables en el ambiente de un nuevo proceso desde el intérprete shell sin que hagan parte del ambiente del shell se usa una sintaxis muy clara: nombreVar1=valor1 nombreVar2=”valor múltiple2” … comandoNuevo como se observa, simplemente se usa la sintaxis como tradicionalmente se define una variable en el shell –las que no se copian a los procesos hijos- pero al final El proceso init de la línea se incluye el comando que se necesita que se ejecute como señales a proces no envía os proceso hijo. Esta sintaxis indica al intérprete shell que cree o haga una que el originador a menos y el destino ej ec ut en ba jo copia modificada de unas variables únicamente para ser insertadas en el un m is m o usuario o el orig inador sea el ambiente del nuevo proceso hijo iniciado con la ejecución del usuario root. comandoNuevo. Note que las variables nuevas o las copias modificadas como se ven el último comando anterior sólo existen durante la ejecución del nuevo proceso hijo. No existen como se ve en el intérprete shell, no existen después de la línea que inicia al nuevo proceso, no existen en ninguno de los otros procesos del sistema. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 153 Paso de Señales entre Grupos de Procesos env señal entregada 1=init 2 env env 1 3 41329=telnetd señal entregada 27525=kill favor enviar señal env hijo de 131271=ksh Dada la arquitectura de procesos de los sistemas Unix, todas las señales (las mencionadas cuando se habló del comando kill) que se envían a un proceso líder de grupo son enviadas no solo al proceso líder, si no que son directamente heredadas por sus procesos hijos. Así, cuando un usuario tiene una sesión de terminal remota usando SSH contra un servidor Unix. y en la misma inicia al editor vi, tiene no un proceso, si no un grupo de procesos: Un proceso SSHD que recibe la conexión en el servidor requerida por el cliente SSH remoto. Un intérprete de comandos en el servidor UNIX. Una instancia del editor vi, en la misma sesión de terminal. Si en la máquina cliente se cierra la ventana de terminal remota, como el sistema detecta la falla en la conexión TCP/IP, genera y envía una señal hang up o SIGHUP al proceso líder de grupo, en este el sshd que recibe la sesión en el servidor. Como es todo un grupo de procesos, la señal SIGHUP se le envía también al intérprete de comandos y al editor de texto, todo simultáneamente. Uso del comando kill para el envío de señales a grupos de procesos Para enviar señales a todo un grupo de procesos se usa la sintaxis: kill –s nombreSeñal –procesoLíder o kill –númeroSeñal –procesoLíder o kill -- -procesoLíder AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 154 La primera sintaxis envía la señal seleccionada por nombre con la opción s a todos los procesos de un grupo, iniciando con su procesoLíder, y a todos sus descendientes, simultáneamente. La segunda sintaxis envía una señal seleccionada dado su número a todo un grupo, iniciando con un proceso líder, y a todos sus descendientes, simultáneamente. La tercera sintaxis envía la señal predeterminada 15 o TERM al líder de un grupo y a todos sus descendientes, simultáneamente. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 155 Seguridad y permisos de archivos Arquitectura de Seguridad de UNIX® u=rw- g=r-- PID=142 U=juan G=it u=juan g=bog dir1 u=rw- g=r-u=ana g=it X PID=3001 U=root G=system arch1 u=rw- g=r-u=jose g=barr arch1 Cada “instancia” de un programa en ejecución es una tarea diferente. Cada una de esas tareas se denomina “proceso”, y cada proceso está compuesto en memoria por varias secciones. Una de esas secciones, a manera de encabezado de proceso se llama ambiente (environment). Dentro de el ambiente del proceso hay numerosas variables que afectan cómo funciona el proceso en sí. Desde el punto de vista de la seguridad, para controlar qué puede y qué no puede hacer un proceso se tienen dentro del ambiente de cada uno unas variables críticas: una variable tiene el número interno del usuario bajo el que el proceso está en ejecución, y otra variable tiene una lista de números internos de grupos a los que está “afiliado” el proceso porque cuando inició el usuario estaba “afiliado” a los mencionados grupos. Cada llamado a sistema, como “abrir archivo”, “leer archivo”, “escribir en archivo”, “enviar paquete”, “pedir memoria”, “cambiar la hora”, tiene unas características que definen quién puede usar dichos llamados a función. Con este esquema el funcionamiento multitarea “con permisos y privilegios” está asegurado y funciona. Aunque puede verse un poco complicado en la teoría y en el esquema, en la práctica es sencillo y se mostrará cómo se usa más adelante. Sólo hay que tener en cuenta: Todo el esquema de seguridad se basa en números: número de usuario, números de grupo, no en los textos que son el nombre de un usuario y los nombres de los grupos. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 156 Existe un usuario, de número cero (0), llamado root al que los controles de seguridad y/o permisos no le aplican. Ningún usuario en general puede “entrometerse” con los procesos que están corriendo con la identidad de otro usuario. Esta regla no aplica para el usuario número 0, es decir root. Todos los archivos del sistema tienen un juego triple de permisos, que controlan qué usuarios pueden acceder. Como muchos dispositivos de hardware se representan y usan a través de un archivo en el directorio /dev se pueden controlar los permisos del hardware. Esta regla no aplica para el usuario número 0, es decir root. Todos los usuarios y grupos tienen propiedades. Las propiedades de un usuario pueden cambiarse dinámicamente, pero generalmente los cambios los toma el usuario la próxima vez que se conecte al sistema. Para conectarse al sistema hay primero que identificarse comúnmente escribiendo el nombre de usuario, que es una palabra sencilla, y luego que autenticarse, también comúnmente usando una contraseña, que casi siempre es también una palabra, pero no tan sencilla. Los métodos de identificación y de autenticación en el sistema son flexibles, cambiables, parametrizables y extensibles. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 157 Procesos y Permisos u=rw- g=r-- PID=142 U=juan G=it u=juan g=bog dir1 u=rw- g=r-u=ana g=it arch1 X PID=3001 U=root G=system u=rw- g=r-u=jose g=barr arch1 Cuando un proceso trata de ejecutar un “llamado a sistema” se validan dos cosas: si es una función común y sin limitaciones o si es una función restringida; o si es una función que accede a algo que tiene permisos. Algunas funciones se consideran restringidas y sólo están disponibles a los procesos que se ejecutan bajo la identidad del usuario root únicamente. Dentro de estas funciones están – pero no siendo una lista exhaustiva-: Conectarse a un puerto TCP o UDP local que tenga número inferior a 1024. Enviar o recibir paquetes IP con transportes diferentes de TCP y de UDP (OSPF, ICMP, etc). Manipular la fecha, hora o el huso horario del sistema. Hacer más prioritario un proceso, propio o ajeno. Manipular cualquier información de un proceso de otro usuario. Acceder al hardware directamente. Ejecutar un proceso con la identidad de otro usuario sin conocer la contraseña del mismo. Ninguno de los llamados a función del sistema mencionados arriba es ajustable o parametrizable para que su seguridad se maneje diferente. Siempre se manejan tal como se describen. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 158 Ahora, muchas otras funciones del sistema están restringidas por permisos, y así, dependen de la herramienta que se use, y de los archivos y directorios que en el momento intente acceder y de los permisos de los mismos. Estas funciones entonces sí son parametrizables. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 159 Usuarios y Grupos de Usuarios Usuario 0=root Grupo 0=system security audit perf Usuarios protegidos admin=true printq staff Jerarquía de usuarios Grupos funcionales shutdown Otros grupos Jerarquía de grupos Cuando un sistema es instalado –y después, cuando se configuran más paquetes de software y cuentas de usuario-, hay un sinnúmero de cuentas de usuario en teoría usables. Esas cuentas de usuario además están –posiblemente- agrupadas en “grupos de usuario”. Todo usuario tiene: Un nombre único de usuario, denominado el username. Un número único de usuario, denominado el userid o UID. Una lista de hasta treinta y dos (32) grupos a los que pertenece. De todos los grupos a los que pertenece, uno se denomina “grupo primario” o primary group. Cada grupo tiene: Un nombre único de grupo, denominado el groupname. Un número único de grupo, denominado el groupid o GID. Adicionalmente cada usuario puede “estar protegido” por un atributo mal llamado “atributo admin”. De todos los usuarios del sistema hay sólo uno que es especial, ése usuario es el de UID igual a cero (0) siempre, independientemente del nombre de usuario (username) que tenga. A este usuario el sistema nunca le forza el cumplimiento de los permisos, sus procesos pueden invocar cualquier llamado a función del sistema y puede intervenir en lo que hacen los procesos de cualquier otro usuario. La cuenta del usuario cero no se bloquea automáticamente por intentos fallidos de autenticación. Existe un grupo en el sistema que puede invocar numerosos llamados a función del sistema, aunque no puede saltarse la seguridad. Este grupo de número cero ya está creado cuando el sistema es instalado, puede administrar numerosas cosas en el sistema y lleva por nombre system. Cuando el sistema está recién instalado, sólo un usuario pertenece al grupo system, AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 160 este usuario es root. Los usuarios que pertenecen al grupo system pueden instalar, actualizar y desinstalar software –y drivers de dispositivos de hardware-, y pueden administrar dispositivos y pueden administrar el espacio del sistema a través del LVM (volúmenes por ejemplo). Pre-creados en el sistema hay otros grupos, denominados “funcionales”. Los usuarios que se asignen a estos grupos pueden realizar ciertas labores de operación y administración, por ello, en sistemas grandes, es bueno tener usuarios comunes que colaboran, sin acceder ni conocer la contraseña del usuario root, si no que trabajan porque por pertenecer a algún grupo funcional tienen el “privilegio” de usar ciertas funciones de administración. Entre estos grupos funcionales están: Grupo security: Los usuarios asignados a este grupo pueden listar, crear, cambiar y borrar cuentas de usuario y cuentas de grupo. Pueden cambiar políticas y contraseñas. No pueden editar directamente los archivos que tienen que ver con la seguridad del sistema, ni pueden administrar los usuarios que tienen el atributo de protección admin en true. Inicialmente este grupo está vacío. Grupo audit: Los usuarios asignados a este grupo pueden configurar el sistema de auditoría de seguridad, y pueden hacer todo tipo de reportes a partir de la información que este sistema genera. Inicialmente este grupo está vacío. Grupo printq: Los usuarios asignados a este grupo pueden administrar las colas de impresión y los dispositivos impresoras administrados a las mismas. Pueden manipular los trabajos de impresión, inclusive los ajenos. Inicialmente este grupo está vacío. Grupo perf: Los usuarios de este grupo pueden ejecutar todo tipo de comandos relacionados con la toma de estadísticas y cifras de desempeño, inclusive los que al invocarlos perjudican el mismo desempeño. Inicialmente este grupo está vacío. Grupo shutdown: Los usuarios asignados a este grupo pueden “bajar el sistema” por medio del uso de comandos como shutdown, reboot, fasthalt, fastboot y halt. Inicialmente este grupo está vacío. Grupo adm: Los usuarios asignados a este grupo pueden tomar estadísticas básicas del sistema, pueden ver los reportes generados por la ejecución del sistema de contabilidad de comandos y pueden manipular la programación de tareas y a cron. Inicialmente este grupo está vacío. Grupos internos: Existen otros grupos para uso interno del sistema. A estos grupos –como el grupo bin- no deben asignarse usuarios porque se compromete la integridad del sistema. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 161 Adicionalmente existe creado en el sistema desde el comienzo un grupo llamado staff, sin ningún tipo de privilegios al que se asigna todo usuario que se cree y al que específicamente no se le asigne un grupo. Todo grupo adicional que se cree en el sistema se considera sin privilegios por parte del sistema operativo. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 162 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 163 Permisos de Archivos: ls -l - rwx rwx rwx archivo! usuario grupo archivo permisos que aplican a este usuario permisos que aplican a este grupo cuando intenta acceder a este archivo permisos que aplican a todos los otros usuarios y grupos cuando intenta acceder a este archivo Para revisar los permisos de unos archivos se usa el comando ls –l nombres Cuando se usa el comando, la primera columna incluye un campo de diez caracteres que si inician en guión (-), este renglón es efectivamente un archivo. Los permisos de un archivo se interpretan de la siguiente manera: Si en la terna de permisos que aplica para el proceso hay una r, el proceso sí tiene permisos para leer los contenidos del archivo en cuestión. Si no hay una r si no un guión en la primera posición, el proceso no tiene permisos para leer los contenidos. Si en la terna de permisos que aplica para el proceso hay una w, el proceso sí tiene permisos para escribir o cambiar los contenidos del archivo en cuestión. Si no hay una w si no un guión en la segunda posición, el proceso no tiene permisos para escribir en los contenidos. Si en la terna de permisos que aplica para el proceso hay una x, el proceso sí tiene permisos para usar el archivo y sus contenidos como si fuera un programa, es decir invocar o “ejecutar” el archivo. Si no hay una x si no un guión en la tercera posición, el proceso puede usar al archivo como datos únicamente. Las propiedades externas de un archivo, que se ven con el comando ls –l archivo –a excepción del nombre- son cambiables únicamente si la identidad con la que está ejecutando el proceso en cuestión es la misma que la que tiene el archivo. Es decir las propiedades sólo las manipula el dueño de un archivo independientemente de los permisos que tenga. Para saber cuál de la terna de permisos aplica a un proceso se sigue el siguiente razonamiento: AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 164 Si la identidad del proceso que intenta acceder al archivo y el propietario – usuario- que tenga marcado el archivo son la misma se le aplica la primera terna de permisos del archivo y no se miran las otras dos ternas. La primera terna de permisos se llama de “usuario”. Si el grupo que tiene marcado el archivo está dentro de la lista de grupos que tiene en el ambiente el proceso que intenta acceder al tal archivo se le aplica la segunda terna de permisos del archivo y no se miran las otras dos ternas. La segunda terna de permisos se llama de “grupo” Si el usuario bajo el que corre un proceso no es el que tiene marcado el archivo, ni el grupo que tiene marcado el archivo está dentro de la lista del ambiente del proceso se mira la tercera terna de permisos únicamente. La tercera terna de permisos se llama de “otros”. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 165 Permisos de Directorios: ls -ld d rwx rwx rwx usuario grupo directorio permisos que aplican a este usuario directorio! permisos que aplican a este grupo cuando intenta acceder a este directorio permisos que aplican a todos los otros usuarios y grupos cuando intenta acceder a este directorio Para revisar los permisos de unos archivos se usa el comando ls –ld nombres Cuando se usa el comando, la primera columna incluye un campo de diez caracteres que si inician en la letra d, este renglón es efectivamente un directorio. Los permisos de un directorio se interpretan de la siguiente manera: Si en la terna de permisos que aplica para el proceso hay una r, el proceso sí tiene permisos para listar lo que hay en el directorio en cuestión. Si no hay una r si no un guión en la primera posición, el proceso no tiene permisos para listar los contenidos del directorio. Si en la terna de permisos que aplica para el proceso hay una w, el proceso sí tiene permisos para cambiar el listado que es el directorio. Si no hay una w si no un guión en la segunda posición, el proceso no tiene permisos para modificar el listado que es el directorio. Poder cambiar los listados que constituyen al directorio implica crear, renombrar, borrar archivos y directorios contenidos en el directorio en cuestión. Si en la terna de permisos que aplica para el proceso hay una x, el proceso sí tiene permisos para “pararse” dentro del directorio con el comando cd (o equivalente), o para “pasar” por él para llegar a un subdirectorio. Si no hay una x si no un guión en la tercera posición, el proceso no puede ni “pararse” en el directorio ni “pasar” por él para llegar a un subdirectorio. Las propiedades externas de un directorio, que se ven con el comando ls –ld archivo –a excepción del nombre- son cambiables únicamente si la identidad con la que está ejecutando el proceso en cuestión es la misma que la que tiene el directorio. Es decir las propiedades sólo las manipula el dueño de un directorio independientemente de los permisos que tenga. Para saber cuál de la terna de permisos aplica a un proceso se sigue el siguiente razonamiento: AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 166 Si la identidad del proceso que intenta acceder al archivo y el propietario – usuario- que tenga marcado el directorio son la misma se le aplica la primera terna de permisos del directorio y no se miran las otras dos ternas. La primera terna de permisos se llama de “usuario”. Si el grupo que tiene marcado el directorio está dentro de la lista de grupos que tiene en el ambiente el proceso que intenta acceder al tal directorio se le aplica la segunda terna de permisos del directorio y no se miran las otras dos ternas. La segunda terna de permisos se llama de “grupo” Si el usuario bajo el que corre un proceso no es el que tiene marcado el directorio, ni el grupo que tiene marcado el directorio está dentro de la lista del ambiente del proceso se mira la tercera terna de permisos únicamente. La tercera terna de permisos se llama de “otros”. Sólo el dueño de un directorio tiene el archivo o privilegio de poder modificar sus permisos, independientem ente de los permisos que ya tenga. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 167 Cambiar Permisos: chmod - rw- r-- --- usuario grupo archivo usuario grupo archivo usuario grupo archivo chmod u+x archivo - rwx r-- --chmod go+rx archivo - rwx r-x r-x Para cambiar los permisos de un archivo o directorio –o de varios a la vez- se usa el comando chmod. La sintaxis del mismo es sencilla: Para agregar unas letras de permisos a un(os) archivo(s) o directorio(s) chmod ternas+permisos archivo … Para remover unas letras de permisos a un(os) archivo(s) o directorio(s) chmod ternas-permisos archivo … Para especificar con qué letras de permisos debe quedar un(os) archivo(s) o directorio(s) chmod terna=permisos archivo … Intentar agregar una letra de permisos que ya tiene o intentar una letra de permisos que un archivo no tiene no es error. Así, como en el ejemplo, si un archivo tiene permisos –rw-r----- y se usa chmod agregará una x en la terna del usuario y quedará –rwxr-----. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow u+x, 168 Un usuario pued e qu é gr up os es conocer a tá as ig na do invocando el com ando sencillo groups. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 169 Cambiar Propietario: chown - rw- r-- --- usuario grupo chown otrousu archivo - rwx r-- --- otrousu comando para el dueño - rwx r-x r-x otrousu grupo usuario comando para sólo root archivo chgrp otrogru archivo otrogru chown usuario.grupo archivo - rwx r-x r-x archivo grupo archivo comando para sólo root archivo Para cambiar el propietario de un archivo o directorio (o de varios a la vez) se usa el comando chown. La sintaxis es muy sencilla: chown nuevoDueño archivo … Para cambiar el dueño y el grupo de un archivo al mismo tiempo se usa chown nuevoDueño.nuevoGrupo archivo … Para cambiar el grupo de un archivo (o de varios a la vez) se usa el comando chgrp. La sintaxis es muy sencilla también: chgrp nuevoGrupo archivo … Nótese que el comando chown sólo puede ser invocado por el usuario root, no puede ser usado ni por el dueño actual del archivo en UNIX. Es decir, la propiedad de un archivo no puede ser entregada, sólo root puede cambiarla. Nótese que el comando chgrp puede ser invocado por el usuario dueño de un archivo, pero que el grupo que se vaya a asignar debe ser uno de los asignados al usuario dueño. Cuando el usuario root usa chgrp para cambiar el grupo, puede asignar un grupo cualquiera –hasta uno inexistente- aún uno no asignado al dueño del archivo en cuestión. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 170 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 171 Cambiar Identidad de Usuario: su juancho@abe:/home/juancho> whoami juancho juancho@abe:/home/juancho> ls –l /etc/security ls: /etc/security: The file access permissions do not allow the specified … juancho@abe:/home/juancho> su root’s password: ********* (texto escrito no visible) juancho@abe:/home/juancho> whoami root juancho@abe:/home/juancho> id uid=501(juancho) gid=0(system) groups=1(staff),7(security),9(printq),10(audit) juancho@abe:/home/juancho> ls –l /etc/security total 6656 -rw------1 root security 14 Jan 31 12:23 .ids -rw-rw---1 root security 254 Jun 21 2004 .profile … juancho@abe:/home/juancho> exit juancho@abe:/home/juancho> whoami juancho juancho@abe:/home/juancho> su – root’s password: ******** (texto escrito no visible) root@abe:/> whoami root root@abe:/> id uid=0(root) gid=0(system) groups=2(bin),3(sys),7(security),8(cron),10(audit) root@abe:/> exit juancho@abe:/home/juancho Si se necesita acceder a unas funciones del sistema sólo por un momento y se conoce la contraseña de la cuenta de otro usuario que sí tiene permiso para ejecutar dichas funciones del sistema no es necesario desconectarse. Todo sistema UNIX –inclusive AIX- incluye la función “sustituir usuario” a través del comando su. Éste es fácil de usar. Si se invoca el comando su usuarioDestino el mismo solicita la autenticación del usuario –normalmente la contraseña- y si ésta es correcta se obtienen las credenciales de seguridad de usuarioDestino. Si se invoca el comando su – usuarioDestino AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 172 el comando solicita igualmente la autenticación del usuario –normalmente la contraseña- y si ésta es correcta se obtienen las credenciales de seguridad del usuarioDestino, y además, se ejecuta el archivo de inicialización de dicho usuario, por lo que también se obtienen las variables de configuración del usuario en el ambiente. El comando su no obliga a especificar un usuario, si no se especifica el comando asume que el usuario está intentando convertirse –u obtener las credenciales de- en root. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 173 Uso efectivo del intérprete de comandos El intérprete de comandos El –realmente los- intérpretes de comandos son quizás la herramienta más avanzada que tienen los UNIX. Los intérpretes shell son muy poderosos debido a que: Implementa un lenguaje de programación completo. Interpreta comodines de nombre de archivo, para que los programas no tengan que hacer la interpretación. Es multitarea –como ya se observó anteriormente-, permite manejar múltiples tareas con una sola invocación, una sola sesión y un solo indicador de comandos. Tiene características avanzadas que se verán en este aparte –como redirección y ejecución condicional-. Implementa muchos de los comandos más básicos, para no depender del sistema operativo y no tener que ejecutar otro proceso en esos casos. El intérprete de comandos y el uso de la multitarea Como ya se observó en el aparte Procesos de Fondo del capítulo Procesos y Variables, el intérprete shell estándar permite un uso multitarea, con comandos y combinaciones de tecla para el cambio de tareas, listar, terminar. Todo comienza con el uso del símbolo &, pero como se vió, hay mucho más. Es de notar –ya que no se mencionó en el capítulo Procesos y Variables- que los trabajos de fondo están asociados a la sesión del shell –de hecho el shell en esos casos es líder del grupo de procesos-, por lo que el usuario no puede desconectar su sesión, ya que, aunque de pronto los procesos de fondo no son directamente visibles, sí están y son dependientes del shell. Si un usuario quiere desconectarse de una sesión usando el comando exit pero tiene jobs en ejecución el shell no se lo permitirá y le mostrará un mensaje: root@ibmserver1:/> jobs [2] + Running [1] - Stopped (SIGTSTP) root@ibmserver1:/> exit There are stopped jobs. root@ibmserver1:/> sleep 600 vi /.profile El intérprete de comandos y los metacaracteres El intérprete de comandos cada vez que recibe la tecla que le indica “iniciar ejecución” -la tecla ENTER cuando no se le impide la interpretación- simplemente no se dedica a iniciar la AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 174 ejecución no más: hace todo un ciclo de interpretación de lo que se entró en la línea o líneas de comandos, y dependiendo de lo que se obtenga, inicia la ejecución. Una de las primeras cosas que logra el intérprete de comandos shell es el de reemplazar, cuando los encuentra en la o las líneas de comandos, unos caracteres que considera especiales. Estos caracteres especiales tienen “un significado más allá de ser simples caracteres de texto” por eso reciben el nombre de metacaracteres. Los metaracteres en los intérpretes de comandos que cumplen con Posix son: $, { y } Para el uso e interpretación de variables de ambiente $, (, ), ` Para el uso de expansión de comandos >, <, &, | Para la redirección y las tuberías *, ?, [, -, !, ] ! ‘, “, y \ ; Para el reemplazo de caracteres de nombre (comodines) Para el manejo de la historia de comandos Por el uso que tie ne comandos como n, algunos find, tar, cpio sí interp retan comodines! Para evitar el uso de los significados especiales de los otros metacaracteres Como separador de comandos Básicamente en este capítulo aprenderemos el uso de estos símbolos para alcanzar las funciones especiales que tienen los intérpretes de comandos POSIX. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 175 Comodines (de nombres) El intérprete de comandos interpreta ciertos caracteres como comodines para facilitarle al usuario expresar conceptos como “todos los archivos”, “todos los archivos que terminan en .c”, “los archivos MP3 que cuyo nombre comienza con Depeche”. Es posible que los usuarios estén algo familiarizados con el uso sencillo de comodines en el intérprete de comandos de MS-DOS o MS-Windows, o con el uso más básico de los comodines en Unix. Es de notar que en muchos otros ambientes los comandos que interpretan los comodines son los comandos de manipulación masiva de archivos, como comandos de copia, movimiento, copias de respaldo y compresión; pero en UNIX, los comodines son interpretados donde es más conveniente: en la línea de comandos del intérprete de mandatos shell. Por qué es más conveniente que los comodines los interprete el shell? Porque el shell siempre los interpreta y porque así la mayoría de los comandos no tienen entonces que hacerlo! Así, puede uno ahorrar escribir un nombre largo como pl-insert_new_student.sql cuando haya que editarlo si uno usa algo como vi *new_st*sql, o si uno sabe que sólo hay un nombre parecido simplemente vi *student.sql. Y esto notando que vi no interpreta comodines en la línea de comandos, el shell siempre interpreta los comodines antes de iniciar la ejecución de lo que unos escribe! Los comodines en el intérprete estándar Posix, como ya se mencionó son: * ? [ - ! ] Comodín básico ? (cualquier un caracter del nombre) El comodín más básico es el símbolo ?. Este se interpreta al usarlo dentro de un nombre de archivo existente como “un caracter cualquiera del nombre”, exceptuando por el punto inicial que denota un archivo oculto. Ejemplos: e@abe:e/> ls LitteFile archivoZ.txt fileA.txt MadRamon 1.png archivoaB.txt fileB NuevoVacio.txt archivoab.txt fileC actual.txt dato viejo fileD archivoA.txt fechaActual.txt fileE archivoAB.txt fileA.c fileF archivoE.txt fileA.cob fileG e@abe:e/> ls archivo?.txt archivoA.txt archivoE.txt archivoZ.txt e@abe:e/> AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow fileH fileI nuevoArchiv2.txt procesos.txt ramon.txt subdir1 176 Como se observa, el símbolo ? permite seleccionar los nombres de los archivos sin especificar un único caracter en una posición. En el caso del ejemplo, ls Archivo?.txt significa “ls ArchivoCualquierCaracter.txt”, así que se listan los archivos cuyo nombre es Archivo, un caracter cualquiera, un punto y txt. Se observa que sólo toma los nombres que existen, así que aparecen los nombres con las letras que existen -no se incluyen por ejemplo ArchivoB.txt o ArchivoC.txt, porque esos archivos no existen-. Note que la interpretación siempre la hace el shell, no ls. Se usa ls únicamente porque es útil como comando sin efectos negativos colaterales. Comodín amplio * (cualesquiera caracteres del nombre) El segundo comodín más básico es el símbolo *. Este se interpreta al usarlo dentro de un nombre de archivo existente como “cualesquiera caracteres del nombre”, incluyendo no caracteres, y exceptuando el punto inicial del nombre de los archivos ocultos. Ejemplos: e@abe:e/> ls LitteFile archivoA.txt fileA.c fileG MadRamon 1.png archivoAB.txt fileA.cob fileH NuevoVacio.txt archivoE.txt fileA.txt fileI actual.txt archivoZ.txt fileB nuevoArchiv2.txt archivo A.txt archivoaB.txt fileC procesos.txt archivo.part.txt archivoab.txt fileD ramon.txt archivo.txt dato viejo fileE subdir1 archivo23.txt fechaActual.txt fileF e@abe:e/> echo file* fileA.c fileA.cob fileA.txt fileB fileC fileD fileE fileF fileG fileH fileI e@abe:e/> echo archivo*.txt archivo A.txt archivo.part.txt archivo.txt archivo23.txt archivoA.txt archivoAB.txt archivoE.txt archivoZ.txt archivoaB.txt archivoab.txt e@abe:e/> Como puede observarse, con la primera ejecución se especifica “seleccionar todos los archivos cuyo nombre comienza con file y el resto del nombre puede ser cualquier cosa incluso nada-”; en este ejemplo aparecen archivos que tienen una letra en la parte seleccionada por *, pero también archivos que tienen una letra un punto y un sufijo variable; en el segundo ejemplo se especifica “seleccionar todos los archivos cuyo nombre comienza con archivo luego tiene un * para indicar que pueden ser cualquier cantidad de cualesquiera caracteres -incluso nada- y luego un punto y el sufijo txt”, en este ejemplo aparecen archivos que no tienen nada entre archivo y .txt -este es el caso de archivo.txt-, y que tienen diferentes letras entre archivo y .txt, mayúsculas, minúsculas, números, y hasta caracteres como espacio y punto. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 177 Comodín [xyz] (cualquier un caracter de la lista) Parecido al comodín ? existe la posibilidad de indicar que deben seleccionarse los archivos que tienen algo en una posición, pero no cualquier cosa como el símbolo ?, si no uno de unos cuantos caracteres dados. Para esta especificación se usa una lista de opciones, que se incluye entre símbolos [ y ], como se muestra en los siguientes ejemplos. Ejemplos: LitteFile archivoA.txt fileA.c fileG MadRamon 1.png archivoAB.txt fileA.cob fileH NuevoVacio.txt archivoE.txt fileA.txt fileI actual.txt archivoZ.txt fileB nuevoArchiv2.txt archivo A.txt archivoaB.txt fileC procesos.txt archivo.part.txt archivoab.txt fileD ramon.txt archivo.txt dato viejo fileE subdir1 archivo23.txt fechaActual.txt fileF e@abe:e/> echo file[BFD] Note que si el id ioma en que fileB fileD fileF está trabajando el usuario es e@abe:e/> echo archivo[aA2]*txt inglés el caracter archivo23.txt archivoA.txt archivoAB.txt archivoaB.txt entre la n y la o; ñ no está ni archivoab.txt con tilde están las vocales junto a las vocales sin tilde! En el primer caso de los ejemplos se indicó que se debían seleccionar los archivos cuyo nombre comiencen con file y luego tengan un caracter seleccionado de B, F o D, únicamente. En el segundo caso se indicó que se seleccionaran los archivos cuyo nombre comienza con archivo y luego tienen un caracter seleccionado de a, A y 2, luego tienen cualquier cosa -incluso nada- y finalmente el nombre termina en txt. Este segundo ejemplo muestra como el shell interpreta todos los símbolos comodín indistintamente, y se pueden combinar. Comodín [!xyz] (cualquier caracter que no esté en la lista) Muy semejante al comodín de lista [xyz], que selecciona un caracter del nombre que esté en la lista, existe el comodín lista negada [!xyz], que selecciona un caracter del nombre que no esté en la lista. Note que como casi cualquier caracter puede ser usado en los nombres de los archivos en UNIX, es posible que la lista haya que sobre-especificarla, porque de lo contrario, de pronto, selecciona mucho. Ejemplos: e@abe:e/> ls LitteFile MadRamon 1.png NuevoVacio.txt actual.txt archivo A.txt archivo.part.txt archivo.txt archivo23.txt archivoA.txt archivoAB.txt archivoE.txt archivoZ.txt archivoaB.txt archivoab.txt dato viejo fechaActual.txt AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow fileA.c fileA.cob fileA.txt fileB fileC fileD fileE fileF fileG fileH fileI nuevoArchiv2.txt procesos.txt ramon.txt subdir1 178 e@abe:e/> echo archivo[!aA2]*txt archivo A.txt archivo.part.txt archivo.txt archivoE.txt archivoZ.txt e@abe:e/> echo [!af]*.txt NuevoVacio.txt nuevoArchiv2.txt procesos.txt ramon.txt En el primer caso del ejemplo se indica que se seleccionen los archivos cuyo nombre comience con archivo y luego tengan un caracter que no sea ni a, ni A ni tampoco 2, y que luego tengan cualquier cosa y finalmente el nombre termine en txt; se nota como selecciona archivos cuyo nombre es archivo luego un espacio o archivo y luego un punto, o archivo luego E o Z, pero en ningún caso a, A o 2. En el segundo caso del ejemplo se indica que se seleccionen archivos cuyo nombre termine en .txt, y que casi nada del nombre importa, mientras no comience ni con a ni con f; se obserca como se seleccionan archivos .txt cuyos nombres comienzan con N, con n, con p o con r, nunca con a ni con f. Comodín [x-z] (cualquier caracter que esté en un rango) Muy parecido al comodín [xyz] donde se indica que se seleccione un Note pueden com binarse listas y rangos en una único caracter de una lista de posibilidades dada posibilidad por especificación. posibilidad existe otra sintaxis para indicarle al shell que debe seleccionar Pregunte cómo! archivos cuyos nombres concuerdan en una posición con un caracter dado un rango ascendente. La sintaxis es simplemente escribir [, el caracter donde comienza el rango, un símbolo menos (-), el caracter donde termina el rango, y el símbolo ]. Note que el caracter inicio del rango debe ser numéricamente menor (debe aparecer primero) que el de fin del rango en el código de página de representación del texto en el idioma que está configurado el usuario. Ejemplos: e@abe:e/> ls LitteFile archivoA.txt MadRamon 1.png archivoAB.txt NuevoVacio.txt archivoE.txt actual.txt archivoZ.txt archivo A.txt archivoaB.txt archivo.part.txt archivoab.txt archivo.txt dato viejo archivo23.txt fechaActual.txt e@abe:e/> echo file[C-F]* fileC fileD fileE fileF fileA.c fileA.cob fileA.txt fileB fileC fileD fileE fileF fileG fileH fileI nuevoArchiv2.txt procesos.txt ramon.txt subdir1 En el anterior muy sencillo ejemplo se indicó seleccionar los archivos cuyo nombre inicia con file, y que luego tienen un caracter cualquiera del rango que va de C a F, es decir C, o D, o E o F. Comodín [!x-z] (cualquier caracter que no esté en el rango De manera semejante al comodín [x-z] que permite seleccionar archivos existentes dado un caracter de una lista de opciones donde se indica el inicio de un rango que arma la lista y AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 179 donde se indica donde termina el rango donde termina la lista existe otra sintaxis donde se especifica que debe seleccionarse un único caracter que no está en un rango dado. Igual que en el caso del rango, el primer caracter usado debe ser numéricamente menor (debe aparecer primero) que el de fin del rango en el código de página de representación del texto en el idioma que está configurado el usuario. Ejemplos: e@abe:e/> ls LitteFile archivoA.txt fileA.c MadRamon 1.png archivoAB.txt fileA.cob NuevoVacio.txt archivoE.txt fileA.txt actual.txt archivoZ.txt fileB archivo A.txt archivoaB.txt fileC archivo.part.txt archivoab.txt fileD archivo.txt dato viejo fileE archivo23.txt fechaActual.txt fileF e@abe:e/> echo file[!C-F]* fileA.c fileA.cob fileA.txt fileB fileG fileH fileI fileG fileH fileI nuevoArchiv2.txt procesos.txt ramon.txt subdir1 Note que este ejemplo también es muy sencillo: se indica al shell que debe seleccionar los archivos existentes cuyo nombre comienza con file y que luego tienen un caracter que no está en el rango C a F -es decir el caracter no es C, ni D, ni E ni F- y que luego el nombre tiene cualquier cosa. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 180 El código de re torno de una secuencia de co mandos es el código de retorn o de los comandos del último únicamente. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 181 Ejecución de Comandos en Secuencia Muy a menudo necesitamos ejecutar en UNIX varios comandos en secuencia, donde no necesariamente unos dependen de otros. Por esta razón existe en los intérpretes de comandos la sintaxis comando ; comando donde se entran los comandos inmediatamente, en una sola línea, pero los comandos se ejecutan en secuencia, donde el segundo comando sólo se ejecuta cuando el primero termine, y sin importar si el primer comando –o el segundo- termina bien o mal. Ejemplo: root@ibmserver1:/> sleep 60 root lft0 Sep root pts/0 Sep root pts/1 Sep root pts/3 Sep root pts/3 Sep root@ibmserver1:/> ; who ; who am i 03 10:05 03 10:05 (:0.0) 04 13:46 (192.168.0.12) 04 13:55 (192.168.0.12) 04 13:55 (192.168.0.12) En la línea arriba mostrada, se entraron tres comandos en línea, pero sólo el primero (sleep 60) comienza ejecución. Tan pronto como el primero termine el segundo (who) comienza ejecución; y, cuando el segundo termine, el tercero (who am i) se ejecutará. Sólo cuando el último termine volverá a aparecer el indicador de mandatos del intérprete para recibir más comandos. Nótese como el intérprete no separa de manera alguna la ejecución –o lo que muestra la ejecución- de un comando de otro. En el ejemplo la última línea “root” parece repetida porque la última línea de who es casualmente la que muestra el comando who am i. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 182 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 183 Ejecución Condicional de Comandos A veces, se quieren ejecutar varios comandos en secuencia, pero con condiciones: Ejecutar un comando pero sólo si el comando anterior terminó perfectamente. Ejecutar un comando pero sólo si el comando anterior no terminó perfectamente. En UNIX se manejan muy fácilmente estas secuencias, pero hay que introducir un concepto en el que estos casos se basan: códigos de retorno. Códigos de Retorno de una Ejecución Todos los programas en UNIX o son hechos directamente en lenguaje C o son hechos indirectamente en lenguaje C. Este último caso es el de muchos programas: no son hechos en C pero sí en algún otro lenguaje de programación que fue hecho en C; esta es la situación de los programas hechos en Java, Perl, Python, AWK, Oracle PL/SQL, y muchos más. De las variables del se hablará más ad intérprete elan libro, muy pronto te en este . Pe no ta rs e qu e la ro puede s como ? se co va ri ab le s nsideran del ambiente, tema ya considerado. En C hay una sentencia clave con la que deberían terminar todos los programas: return. Esta sentencia recibe como parámetro un número entero que se supone recibe el sistema operativo. Como el diseño y desarrollo de UNIX y de C son muy cercanos, los sistemas UNIX siempre capturan el número entero que los programas en C entregan. Este valor en UNIX lleva el nombre de código de retorno, y puede leerlo tanto el sistema operativo como el programa padre que invoca a cada proceso. En el caso de los intérpretes de comandos como bash y ksh, cada ejecución de comandos guarda en la variable ? el código de retorno de la última invocación. Como esta variable ? no es una lista o arreglo, sólo un número entero, solo guarda el número entero retornado por la última invocación, y cualquier valor anterior se pierde definitivamente. En el caso del ejemplo mostrado en el apartado Ejecución de Comandos en Secuencia, como son tres comandos, los dos primeros códigos de retorno –de los comandos sleep y who- se pierden y sólo queda guardado el código de retorno del comando who am i. Ejecución Condicional: Ejecución sólo si el anterior ejecuta sin error Para poder ejecutar un comando si el comando anterior se ejecuta sin error primero hay que conocer que para los intérpretes Bourne (sh), Korn (ksh) y Bourne Again (bash) una ejecución se considera sin error si cuando termina un comando devuelve un cero (0) en la variable ?. Para ejecutar un comando2 únicamente si el comando1 termina sin error se usa: comando1 && comando2 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 184 Nótese que el comando1 puede tener opciones y argumentos, y el comando2 posiblemente también, la sintaxis sólo depende de los símbolos &&. Ejemplo: root@ibmserver1:/> whoami && echo "Ese soy yo!" root Ese soy yo! root@ibmserver1:/> Como se observa, como el comando whoami se ejecuta sin error el comando echo ejecuta inmediatamente –inmediatamente termina whoami-. Leer directamente de no ti en e se nt l teclado id o si un programa corre en multi-tarea y m un sistema ul Quién puede decir ti-usuario. quién tiene el teclado en un momento dado? Ejecución Condicional: Ejecución sólo si el anterior ejecuta con error Para ejecutar un comando si el comando anterior se ejecuta con error primero hay que conocer que para los mismos sh, ksh y bash, una ejecución se considera con error si cuando termina un comando devuelve un número cualquiera diferente de cero (0) en la variable ?. Para ejecutar un comando2 únicamente si el comando1 termina con error se usa: comando1 || comando2 Nótese que igual que con &&, el comando1 puede tener opciones y argumentos, y el comando2 posiblemente también, la sintaxis sólo depende de los símbolos ||. Ejemplo: root@ibmserver1:/> rmdir /tmp || echo "No pudo borrarse / tmp!" rmdir: 0653-611 Directory /tmp is not empty. No pudo borrarse /tmp! root@ibmserver1:/> Hay programas que necesitan leer directamente de de un a vi rt ua l teclado o liz ac ió n de l te cl ad o, y qu e escribir en la pant ne ce si ta n all o a l m e n o a de texto, s en una virtualización de text que estos program o. Se dice as la entrada estánd no usan o ar o no usan la salida estándar. Nótese cómo se ejecutó arriba el segundo comando (echo) debido a que el primer comando (rmdir) terminó con un error. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 185 Redirección: Archivos En UNIX hay un concepto muy poderoso: casi todo o es un archivo o puede trabajarse como un archivo. Por esta razón muchos programas fueron programados para que no asuman que reciben entrada -en especial texto- desde el teclado directamente, si no desde una especie de “archivo virtual individual” llamado la entrada estándar, y para que no escriban lo que producen -en especial texto- a la pantalla, si no a una especie de “archivo virtual individual” llamado la salida estándar. Archivos estandar: “entrada estandar”, “salida estandar”, “salida de errores estandar” Como se viene mencionando, la mayoría de los programas en Unix que necesitan información textual de entrada no leen directamente del teclado, si no que leen de un “archivo virtual individual” llamado “la entrada estandar” o, en inglés stdin. Este “archivo” es de lectura secuencial, no recibe escritura, y los programas asumen que está abierto antes de comenzar. Este “archivo” normalmente lo abre y lo pone a disposición de los programas que siguen el programa que recibe la conexión del usuario (en modo texto casi siempre es un proceso llamado getty, y para las conexiones remotas inetd o sshd). Los programas tampoco asumen que tienen una pantalla a disposición, si no que escriben sus avisos y el texto en general que producen en un “archivo virtual individual” llamado “la salida estandar” o, en inglés stdout. Este “archivo” es de escritura secuencial, no permite la lectura, y los programas asumen que está abierto Note que no puede usar un mismo archi vo para la antes de comenzar. Igual que con “la entrada estándar”, este archivo re di re cc ió n de la en tr normalmente lo abre y lo pone a disposición de los programas que siguen estándar y de la salida estándadara simultáneamente ! el programa que recibe la conexión del usuario. Los programas tampoco asumen que deben mandar los mensajes de error a un archivo -aunque algunos sí-, mientras que algunos no muy bien diseñados mezclan los mensajes de aviso, alerta o error con los demás textos en “la salida estándar”, la mayoría en UNIX escribe dichos textos adicionales en otro “archivo virtual individual” llamado “la salida estándar de errores”, o en inglés stderr. Este archivo, como “la salida estándar”, es de escritura secuencial, no permite la lectura, y los programas asumen que está abierto antes de comenzar. Igual que con los otros, este archivo normalmente lo abre y lo pone a disposición de los usuarios el programa que recibe la conexión del usuario. Ahora... en conjunto de qué se trata esto? Cuando un usuario se conecta de manera local, y en modo texto, un programa como getty “conecta” la entrada estándar con una “virtualización” del teclado local -para permitir la multitarea-, conecta la salida estándar con una “virtualización” de la pantalla textual local AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 186 para permitir la multitarea y la multiplexación con los mensajes urgentes del sistema-, y conecta la salida de errores estándar con una “virtualización” de la pantalla textual local -para permitir también la multitarea, la multiplexación con los mensajes de error del sistema, y para poder usar el mismo dispositivo físico que la salida estándar-. Al final del proceso, los programas locales de modo texto “parecen” estar leyendo lo que uno les escribe en el teclado, y parecen estar escribiendo mensajes directamente en la pantalla, tanto su salida normal como sus mensajes y avisos de error. Cuando un usuario se conecta de manera remota, y en modo texto, un programa como inetd o sshd “conecta” la entrada estándar con una “virtualización” de un socket de TCP/ IP, de manera que un texto que llega dentro de paquetes generados por Note un cliente sea recibido como texto en la entrada del programa -que parece m i s m oquea rnoc h ipuede usar un vo para la re di re cc ió n de estar leyendo del teclado remoto-. Adicionalmente el mismo programa la en tr ad a estándar y de la sa lid “conecta” la salida estándar con una “virtualización” de un socket de simultáneamente a estándar ! TCP/IP -casi siempre el mismo de la entrada- de manera que el texto que los programas que siguen sea “empacado” en un paquete de red y pueda aparecer en una pantalla en el cliente remoto. De igual manera se hace con la salida estándar de errores. Redirección de la entrada desde un archivo Muchas veces hay que darle o mucho texto a un programa para que lo procese -y no se desea tener que escribirlo todo directamente, o hay que darle como entrada de texto lo que hay en un archivo. Para ambos casos se inventó la redirección de la entrada estándar. Para hacer redirección de la entrada estándar en el intérprete shell simplemente se agrega < nombre_archivo a la sintaxis del comando que debe leer de un archivo y no de la virtualización del teclado. Note que el archivo debe existir antes de que inicie el comando, ya que la redirección la hace el shell antes de iniciar el comando, y además es el shell quien debe poder encontrar y abrir el archivo nombre_archivo para lectura. Ejemplo: e@abe:e/> write root < MiNombre.txt Message from e on abe (pts/0) [Sun Sep 2007] ... Ramon Barrios Lascar <EOT> e@abe:e/> cat MiNombre.txt Ramon Barrios Lascar 9 21:21:33 EST Note que no pu ede usar un mismo archi vo para la re di re cc ió n de la en tr ad a estándar y de la sa lida estándar de errores simultá neamente! En el ejemplo se puede notar como el comando write no tuvo que esperar a que el usuario escribiera el mensaje directamente -y lo terminara con control d-, si no que leyó, pero el shell ya le había preparado que lo que leería sería el archivo MiNombre.txt. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 187 Redirección de la salida hacia un archivo Más común que darle a un comando la entrada almacenada previamente en un archivo es necesitar almacenar lo que muestra -comúnmente texto- en un archivo, para poder revisarlo con calma, reportarlo a otro o simplemente porque aparece tan rápidamente en la ventana de texto que no es posible leerlo mientras va a apareciendo. Para hacer redirección de la salida estándar de un comando se usa una sintaxis muy sencilla que de pronto es conocida ya por los usuarios de otros ambientes: simplemente se agrega > nombre_archivo a la sintaxis del comando al que se le quiere redirigir la salida. Note que igual que con los otros casos, es el shell el que abre el archivo aún antes de ejecutar el comando al que se le redirige la salida. Atención: el shell abre el archivo para salida con la opción O_CREAT, lo que hace que si no existe lo crea, pero si ya existe lo destruye y luego lo crea nuevo! Ejemplos: [0 e@Moe ~] ps -u USER PID %CPU %MEM VSZ TIME COMMAND e 4971 0.1 0.1 27892 0:00.07 -bash [0 e@Moe ~] ps -u > datos.txt [0 e@Moe ~] cat datos.txt USER PID %CPU %MEM VSZ TIME COMMAND e 4971 0.0 0.1 27892 [0 e@Moe ~] date Mon Sep 10 09:48:04 COT 2007 [0 e@Moe ~] date > datos.txt [0 e@Moe ~] cat datos.txt Mon Sep 10 09:48:08 COT 2007 RSS 944 RSS 944 TT p1 TT p1 STAT STARTED S 9:47AM Note que no pu ede usar un mismo archi vo para la re di re cc ió n de la en tr ad a estándar y de la sa lida estándar simultáneamente ! STAT STARTED S 9:47AM 0:00.10 -bash En los ejemplos se observa cómo lo que genera un comando se almacena en un archivo -en el ejemplo datos.txt-, y en el segundo ejemplo se muestra cómo sin aviso el shell crea nuevo el archivo datos.txt, perdiéndose los contenidos anteriores del mismo. Redirección de los mensajes de error hacia un archivo Común tambien es la necesidad de almacenar los avisos de alerta, advertencia o mensajes de error que algunos comandos generan. En muchos casos sirve almacenar todo el texto generado por la ejecución de un comando en un único archivo, pero si el texto general generado por un comando es mucho, de pronto se necesita que los textos de los mensajes de error estén registrados en un archivo aparte. Para hacer la redirección de la salida estándar de errores de un comando se usa una sintaxis sencilla también: se agrega 2> nombre_archivo a la sintaxis normal del comando del AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 188 que se quieren “capturar” los mensajes de errores y almacenarlos en el archivo seleccionado. Note que igual que con los otros casos, es el shell el que abre el archivo aún antes de ejecutar el comando al que se le redirige la salida estándar de errores. Atención: el shell abre el archivo para salida con la opción O_CREAT, lo que hace que si no existe lo crea, pero si ya existe lo destruye y luego lo crea nuevo! Ejemplos: [0 e@Moe ~] rm /etc/hosts override rw-r--r-- root/wheel for /etc/hosts? y rm: /etc/hosts: Permission denied [1 e@Moe ~] rm /etc/hosts 2> mensajes.txt n [0 e@Moe ~] cat mensajes.txt [0 e@Moe ~] r--r-- root/wheel for /etc/hosts? En el ejemplo se observa cómo los mensajes no se muestran en la ventana de sesión del usuario, pero sí quedan almacenados en el archivo seleccionado mensajes.txt. Redirección de la entrada desde archivos “here” A veces, es necesario hacer que un comando lea la entrada estándar, pero no se quiere estar presente a la hora del comando para escribir del teclado dicha entrada estándar. Para esta situación, que la verdad no es tan común como las dos anteriores, existe la redirección de entrada desde “archivos here”. Para redirigir la entrada estándar de un comando, y que no la tome de un archivo, si no que la tome del comando escrito se usa la siguiente sintaxis: comando << TERMINADOR linea1 de texto linea2 de texto ... TERMINADOR Ejemplo: [0 e@Moe /Volumes] wc -l << FIN > Primera linea > Segunda linea > Tercera linea > Cuarta linea > FIN 4 En el ejemplo, el comando wc -l cuenta el número de líneas en un archivo, o en la entrada estándar, y en este caso la entrada estándar es todo lo escrito hasta que en una línea aparezca únicamente el texto indicado como terminador -en el ejemplo el texto FIN-. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 189 Redirección de la salida sin destruir Muy a menudo se necesita captura la salida de varios comandos, pero si se usa la redirección tradicional > lo que el último comando genere como salida será lo único que quede en el archivo. Para capturar acumulando o agregando, la salida estándar de un comando en un archivo simplemente en el shell se agrega a la sintaxis del comando >> nombre_archivo, donde nombre_archivo es donde se quiere guardar la salida, archivo que si no existe es creado nuevo antes de iniciar la ejecución del comando redirigido, o al que se le agrega al final del contenido si existía previamente. Ejemplos: [0 e@Moe /Volumes] ls nuevoRegistro.txt ls: nuevoRegistro.txt: No such file or directory [1 e@Moe /Volumes] ps -u >> nuevoRegistro.txt [0 e@Moe /Volumes] cat nuevoRegistro.txt USER PID %CPU %MEM VSZ RSS TT STAT STARTED e 4971 0.0 0.1 27892 896 p1 S 9:47AM [0 e@Moe /Volumes] date >> nuevoRegistro.txt [0 e@Moe /Volumes] cat nuevoRegistro.txt USER PID %CPU %MEM VSZ RSS TT STAT STARTED e 4971 0.0 0.1 27892 896 p1 S 9:47AM Mon Sep 10 18:20:30 COT 2007 TIME COMMAND 0:01.00 -bash TIME COMMAND 0:01.00 -bash Como se puede observar en el ejemplo, el se crea el archivo nuevoRegistro.txt con la ejecución del primer comando -el ps-, y con la ejecución del segundo obtiene nuevos contenidos, pero no se pierde lo ya guardado con el primer comando. Redirección de los mensajes de error sin destruir De igual manera como se pueden guardar los textos de salida estándar de los comandos, acumulando al final del archivo, sin perder lo anteriormente guardado, se puede redirigir la salida estándar de errores, también sin perder lo anteriormente guardado. Para redirigir la salida estándar de errores sin sobreescribir el archivo simplemente en el shell se agrega a la sintaxis del comando 2>> nombre_archivo, donde nombre_archivo es un archivo de texto que si no existe es creado antes de iniciar la ejecución del comando, pero si existe se abre para escritura en modo O_APPEND (agregar al final). Ejemplo: [0 e@Moe /Volumes] rm archivo1.txt 2>> ~/mensajes.txt [1 e@Moe /Volumes] rm archivo2.txt 2>> ~/mensajes.txt [1 e@Moe /Volumes] cat ~/mensajes.txt rm: archivo1.txt: No such file or directory rm: archivo2.txt: No such file or directory Como se nota en el ejemplo, con la ejecución del primer comando -rm archivo1.txt- se crea el archivo mensajes.txt, y con la ejecución del segundo comando se agregan contenidos al mismo. Si se observa el archivo generado mensajes.txt, sólo hay texto de mensajes de error AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 190 (como se recordará, el comando rm genera texto con los errores, con la ejecución normal no muestra ni un solo mensaje). Combinaciones de redirecciones Todos los tipos de redirección se pueden combinar -mientras tenga sentido-, y en muy pocos casos el órden como se combine importa, pero, no puede mencionarse un mismo archivo más de una vez. Para enviar la salida estándar de un comando a un archivo, y para, al mismo tiempo enviar la salida estándar de errores al mismo archivo se agrega a la sintaxis del comando > nombre_archivo 2>&1 Lo anterior debe interpretarse como “redirigir la salida a nombre_archivo, y los errores al primero”. Nótese que como se usa >, la ejecución destruye Note que los sis nombre_archivo porque lo crea nuevo. temas Para enviar la salida estándar de un comando a un archivo, sin destruirlo, y para, al mismo tiempo, enviar la salida estándar de errores al mismo archivo se agrega a la sintaxis del comando Unix diferencian las m ay las minúsculas en úsculas de lo de las variables de s nombres ambiente! >> nombre_archivo 2>>&1 Note que hay m ás su st it uc ió n de estilos de pregunte al instru va ri ab le s, ctor cuáles! AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 191 Substitución de Variables Se ha mencionado más de una vez que las variables del ambiente de un proceso afectan cómo hace un proceso ciertas tareas. En especial ciertas variables de ambiente afectan cómo funciona el -los?- intérprete de comandos, cómo ejecuta los comandos que se le dan y la apariencia que tiene. En un capítulo anterior titulado Ambiente de Trabajo: Procesos y Variables se mencionó cómo se listaban, creaban, modificaban y borraban variables del ambiente del shell. También se vió en dicho capítulo cómo se hace para “publicar” las variables de ambiente para que los procesos hijos -del shell- tengan unas copias. Las variables de ambiente existen en el shell, pero no hemos visto aún cómo se pueden usar directamente en el shell! Para usar el valor de una variable en el shell se escribe ${nombre_variable} en donde quiera el valor que contiene la variable en el intérprete. Si el nombre no se presta para confusiones puede usarse simplemente $nombre_variable; así si se tiene una variable llamada Host, y se quiere obtener o usar el valor en el momento se escribe ${Host} o simplemente $Host. A la hora de la ejecución el shell usará el valor dentro de la variable, y no la variable. Ejemplos: 0 root@abe:/> echo $Host 0 root@abe:/> Host=abe.iknow.com 0 root@abe:/> echo Mi servidor es ${Host} Mi servidor es abe.iknow.com 0 root@abe:/> printf "La maquina usada en los ejemplos es $Host\n" La maquina usada en los ejemplos es abe.iknow.com En el ejemplo se puede observar que la variable Host inicialmente es nula. Usar una variable inexistente o una variable nula en el intérprete de comandos no es error a menos que así se configure el shell. Como segundo paso se crea -o se llena, no lo sabemos- la variable con un nuevo valor y se usa primero con la sintaxis ${variable} y luego se usa con la sintaxis $variable. Aunque lo más común es usar $variable, la sintaxis completa ${variable} existe porque las sustuciones de variables son literales y en algunos casos se presta para confusiones: 0 root@abe:/> MES=Sept 0 root@abe:/> echo Estamos en ${MES}iembre Estamos en Septiembre 0 root@abe:/> echo Estamos en $MESiembre Estamos en Si se observa en detalle el ejemplo, cuando la variable no tiene texto alrededor el shell no tiene problemas en identificar el nombre de la misma y por ello extrae el valor y lo usa, pero después, como se usó la sintaxis sencilla, el shell cree que la variable es MESiembre -ya que es AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 192 un nombre válido de variable- y como la variable no existe la reemplaza en la ejecución por un nulo. Variables de ambiente importantes en el shell Existen ciertas variables importantes que modifican cómo hace su trabajo el shell y cómo interpreta lo que el usuario le escribe. Entre esas variables importantes se encuentran: Esta variable es ajustada por el proceso que hace la autenticación del usuario cuando se conecta -normalmente login-. Contiene la ruta al directorio inicial o personal del usuario. LOGNAME PATH Esta variable puede contener una lista de directorios separados por : (dos puntos) donde deben buscarse directorios dados como parámetros a cd sin ruta. PS1 PS2 ENV 1..9.. 0 TERM HOME Contiene el nombre del usuario con el que se autenticó el usuario actual -comúnmente lo mismo que retorna whoami, pero no siempre-. Esta variable debe contener una lista de directorios separados por : (dos puntos) donde deben buscarse los comandos entrados en el shell sin ruta. CDPATH Esta variable puede contener un texto o expresión que el shell usará como indicador de mandatos de primer nivel -lo que muestra casi siempre para solicitar instrucciones-. Esta variable puede contener un texto o expresión que el shell usará como indicador de mandatos de segundo nivel -lo que muestra cuando hay una instrucción de control sin completar, o una expresión sin terminar, como cuando hay que cerrar unas ’ o unas ”. El shell ksh busca esta variable cada vez que inicia -sea porque el usuario apenas se conecta o porque el usuario inicia ksh a mano. Si es un archivo ejecutable el shell ksh lo ejecuta justo apenas inicia. El shell almacena en la variable 1 el primer parámetro que se le pase, en la variable 2 el segundo parámetro que se le pase, y así sucesivamente. El shell almacena en la variable 0 el nombre del programa actual -el shell-. Si se está dentro de un shell script contiene el nombre del programa actual también, pero esta vez es el shell script. En esta variable se debe almacenar el nombre de la emulación de terminal actual. Con este valor los programas que controlan el cursor y hacen uso de atributos de pantalla encuentran -en un directorio específico en cada UNIX- los archivos necesarios para dicho control de cursor y de atributos de pantalla. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 193 Con esta variable se puede indicar al comando man dónde encontrar la documentación de los comandos. Debe ser una lista de directorios separados por : (dos puntos). MANPATH Con esta variable el shell sabe como separar las palabras (tokens) que componen la instrucción justo entrada. Es una lista de caracteres simplemente. De manera estándar inicia en espacio, tabulador, retorno de carro. ? RANDOM SECONDS IFS En esta variable el shell almacena el entero código de retorno del último comando ejecutado. Cada vez que se usa esta variable (que se obtienen sus contenidos) el shell genera un número pseudo-aleatorio entero pequeño. En esta variable el shell almacena el número de segundos que han pasado desde que inició -el shell-. Ejemplos: 0 root@abe:/> echo $HOME / 0 root@abe:/> echo $LOGNAME root 0 root@abe:/> echo $PATH /usr/bin:/etc:/usr/sbin:/usr/ucb:/usr/bin/X11:/sbin:/usr/java14/jre/bin:/usr/ java14/bin:/usr/local/bin:/opt/freeware/bin:/usr/local/sbin:/usr/local/bin:/ opt/freeware/sbin:/opt/freeware/bin:/usr/local/sbin:/usr/local/bin 0 root@abe:/> echo $CDPATH 0 root@abe:/> echo $PS1 $? $LOGNAME@$HOST:$PWD> 0 root@abe:/> echo $PS2 ... 0 root@abe:/> echo $ENV //.kshrc 0 root@abe:/> echo $1 0 root@abe:/> echo $0 -bash 0 root@abe:/> echo $TERM xterm 0 root@abe:/> echo $MANPATH :/usr/share/man:/opt/freeware/man 0 root@abe:/> echo $IFS 0 root@abe:/> echo $RANDOM 30151 0 root@abe:/> echo $SECONDS 8454 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 194 Note que la su bstitución de comandos no us a la entrada o la salida estándar de que necesita in l comando formación de otro. El she ll captura información y hace un reemplazo de text o literal. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 195 Substitución de Comandos Gran parte del enorme poder que tienen los sistemas UNIX está basado en una idea sencilla: cada herramienta o comando debería hacer una sola cosa pero hacerla lo mejor posible, así el comando listar usuarios no debería ordenarlos según un criterio, pero debería haber un comando ordenar que puede ordenar lo mejor posible cualquier cantidad de ítems, y debería haber una manera de combinarlos. Esta es la base de la filosofía Unix y es como trabajan todos los UNIX en general. Una manera de combinar comandos es a través de la “sustitución de comandos”. De qué se trata? de obtener los textos generados por algún comando y usarlos como parte de la sintaxis de otro comando. Para sustituir los textos generados por un comando y usarlos como parte de la sintaxis de otro comando se agrega a la sintaxis del segundo comando, en el sitio donde se necesita el texto del primer comando, la construcción `primer comando`. Note que la “comilla inversa” o acento grave es el símbolo a la izquierda del 1 en un teclado qwerty en inglés. Como este símbolo en algunos teclados es algo complicado de obtener, puede usarse la construcción $ (primer comando) en el mismo sitio de la sintaxis del segundo comando, y así obtener lo mismo. Este tipo de sustitución es más clara con unos ejemplos: Ejemplo: El usuario necesita todos los días crear un archivo de registro .log que contenga lo del día únicamente, por eso sería mejor que el archivo llevase dentro del nombre la fecha. La mejor manera es usando un comando que automáticamente obtenga la fecha y la “convierta” en un nombre de archivo. Note que la redirección no aplica porque el comando no necesita ni recibe entrada estándar -por ejemplo-. e@abe:e/> ls *log ls: 0653-341 The file *log does not exist. e@abe:e/> touch app_$(date +'%Y%m%d').log e@abe:e/> ls *log app_.log app_20070913.log En el ejemplo se observa cómo se aprovecha que puede usarse el comando date para obtener la fecha en el momento de ejecución y en algún formato práctico. Se usa substitución de comandos para “capturar” el texto generado por date y usarlo como parte de la sintaxis del comando touch. Podría haberse usado date +'%Y%m%d', usar las facilidades para “copiar y pegar” y luego escribir el comando touch con la sintaxis adecuada. Si se usa substitución de comandos el shell ejecuta en varias fases: Ejecuta primero lo que está entre $( ) o ` `, capturando el texto. Reemplaza en lo escrito por el usuario $( ) o ` ` y lo que lleva dentro por los textos capturados. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 196 Ejecuta el comando transformado. Nótese que pueden “anidarse” varias ejecuciones con substitución de comandos, pero usando las “comillas inversas” es difícil, usando $( ) es fácil. Pregunta: Cómo puedo guardar el directorio actual en una variable? Note que algunos teclados no tienen | si no un símbolo de barra “cortada” ¦. Si el teclado no tiene la barr a completa el símbolo de barr a totalmente equi cortada es valente y se puede usar. Nótese: algunos com reciben por entra andos no da estándar fácilmente, p ero en la documentació n pueden informar cómo. Muchos usan una sintaxis de “a brir archivo” con el “archivo” - AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 197 Redirección: Tuberías En algunos casos se necesita que un comando procese directamente los datos generados por otro (algo semejante a la substitución de comandos), pero los datos los puede usar el segundo comando -el procesador- tomándolos de un archivo, o mejor, de la entrada estándar. Este es el caso mencionado en querer una lista ordenada de los usuarios del sistema; hay un comando que genera la lista sin ordenar, y hay un comando que ordena cualesquiera ítems. Estos casos en general traducen a “conectar la salida estándar de un comando directamente a la entrada estándar de otro comando”. Para conectar la salida estándar de un primer comando con la entrada estándar de otro comando se usa la construcción primer comando | segundo comando. En los intérpretes shell Posix el símbolo de barra vertical (llamado comúnmente en inglés pipe) conecta la salida estándar del comando justo antes de él con la entrada estándar del comando justo después. Ejemplo: e@abe:e/> echo "Hola super usuario" | write root Message from e on abe (pts/0) [Wed Sep 19 00:41:51 EST 2007] ... Hola super usuario <EOT> e@abe:e/> echo "Cuerpo del mensaje More...de correo More... More...Ramon Barrios Lascar” | mail -s “Mensaje 2007-09-19" RamonBarriosLascar@gmail.com Note que en el intérprete shell los dos comandos se ejecutan inmediata y simultáneamente para poder hacer la conexión del archivo salida estándar de uno con el archivo entrada estándar del segundo. No use comandos que tengan alguna dependencia temporal. Comandos filtro En Unix se dice que un comando es un filtro cuando dicho comando lee o puede leer texto de la entrada estándar y cuando bota o puede botar “texto producido” por la salida estándar. Estos comandos se supone que de alguna manera transforman -como un paso de una cadena de producción- lo que reciben y lo pasan al siguiente comando de una cadena. Un comando que es filtro puede estar al comienzo de una secuencia de tuberías, en la mitad, o al final de una cadena de tuberías. Algunos comandos pueden usarse sólo para iniciar o terminar una secuencia de tuberías, pero entonces no se les denomina filtros. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 198 Unix no asume que lo que pasa de un comando a otro en una combinación de comandos por tubería es texto, no hace transformaciones, por lo que puede no ser texto y funciona, aunque la mayoría de los comandos lo que procesan y generan -al menos en las tuberías- es texto. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 199 Escapes Como se ha observado, el shell hace una interpretación bastante extensa del texto que se escribe en la línea de comandos, haciendo reemplazos contínuamente basándose principalmente en ciertos símbolos, por esa razón cuando se quieren usar los símbolos como parte de un comando hay el problema de hacer que el intérprete shell no los reemplace. El caso más común es el uso de los espacios. El caracter espacio es el separador de ítems usado principalmente, buscando éste el shell separa lo que se da después del nombre del comando en opciones, argumentos, y cada uno de los argumentos los distingue de los otros porque se separan por espacios. En especial la sintaxis para guardar un valor dentro de una variable de ambiente es variable=valor, pero qué si el valor que se necesita dentro de una variable está compuesta de varias variables? Cuando se usa el término “escape” dentro de esta sección se quiere decir “hacer que el significado no sea el común”; así que “escapar un espacio” es hacer que el espacio no tenga el significado como separador de ítems que normalmente tiene; “escapar un símbolo de pesos” es hacer que el símbolo pesos no signifique “usar valor de variable” que normalmente tiene, y así. En UNIX -realmente en el intérprete shell POSIX- hay tres maneras de hacer que un o unos caracteres no tengan el significado que normalmente tienen, es decir de “escaparlos”. Escape de un único caracter: símbolo \ Para quitarle el significado especial a un único caracter o símbolo -o lo contrario, para darle significado especial a un caracter que normalmente no tiene- se usa el caracter símbolo \ (en inglés backslash). Este símbolo cuando se antepone a un caracter especial le quita su significado especial y lo convierte en un caracter de texto simple: un * Note que pocos caract ya no significará “todos los caracteres posibles en un nombre de archivo”, tienen significado espeerciesal cuando llevan co mo prefijo a significará simplemente “asterisco”. Algunos caracteres normales se \. Deberá consul tarse una guía de C para sabe convierten en especiales cuando no lo son pero se les antepone un r cuáles son todos. símbolo \ -estos son los escapes del lenguaje C-. Ejemplos A: e@abe:e/> echo * LitteFile MadRamon 1.png MiNombre.txt NuevoVacio.txt actual.txt app_.log app_20070913.log archivo A.txt archivo.part.txt archivo.txt archivo23.txt archivoA.txt archivoAB.txt archivoE.txt archivoZ.txt archivoaB.txt archivoab.txt dato viejo fechaActual.txt fileA.c fileA.cob fileA.txt fileB fileC fileD fileE fileF fileG fileH fileI nuevoArchiv2.txt procesos.txt ramon.txt subdir1 e@abe:e/> echo \* * e@abe:e/> echo La variable con mi directorio es $HOME AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 200 La variable con mi directorio es /home/e e@abe:e/> echo La variable con mi directorio es \$HOME La variable con mi directorio es $HOME En el primer ejemplo se usa el símbolo * y como no se toma ningún cuidado especial el shell lo interpreta con su significado de siempre “todos los caracteres posibles en los nombres de los archivos” y como está sólo termina significando “todos los archivos”. Como echo repite simplemente el texto que se le de como argumentos simplemente muestra los nombres de todos los archivos. En el segundo ejemplo se le quita el significado especial al asterisco, usando \*, y como echo simplemente repite escribiendo a la salida estándar los argumentos que se le den, la salida obtenida es un simple *. En el tercer ejemplo se usa $HOME que normalmente obtiene el contenido Note que no hay la m de una variable -en este caso HOME-, que se da a echo, que muestra el texto, ob tener unas ' dent anera de incluyendo el contenido de la variable. En el cuarto ejemplo se varía un encerrado en ' ' ro de texto . poquito simplemente agregando \ al símbolo $, lo que logra que $ no sea especial -donde significa “obtener valor contenido en la variable que sigue”-, así que un $ es un simple $, por lo que al lado de un nombre de una variable no obtiene el valor de la variable, así que echo simplemente repite un texto, un símbolo pesos y un texto que casualmente es el nombre de una variable. Ejemplo B: e@abe:e/> echo "Texto compuesto de\ndos lineas" Texto compuesto de dos lineas e@abe:e/> echo "Mostrar es un backslash es especial: \\" Mostrar es un backslash es especial: \ En este nuevo ejemplo se usa \ a la inversa: el caracter n que normalmente no tiene nada de especial al tener un escape como prefijo se convierte en un símbolo especial -porque tiene un significado especial dentro de una cadena de texto en lenguaje C-, en este caso en un cambio a siguiente línea. El ejemplo termina mostrando dos líneas porque a mitad, un caracter del texto significa “cambio a siguiente línea”. En el segundo caso mostrado se demuestra cómo obtener un backslash que no tenga significado especial -donde “especial” quiere decir “hacer escape al caracter que sigue”-, hay que usar un backslash para quitare el significado especial al backslash que sigue! Escape de todos los significados especiales: ' Si son varios los símbolos o textos a los que se le quiere remover todo tipo de significados especiales tal vez sea más sencillo usarlos en otra sintaxis: encerrarlos entre un par de símbolos “comilla recta sencilla no tipográfica”, es decir hacer una construcción como 'texto'. Cuando un texto en la línea de comandos está encerrado entre ' ' todos los caracteres dentro del par de ' ' pierden su significado especial. Cuando se indica “todos” es todos, ni aún el símbolo \ tiene significado especial dentro de un par de ' '. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 201 Ejemplos: e@abe:e/> echo 'Texto comun y especial \*' Texto comun y especial \* e@abe:e/> echo 'Texto menos especial' Texto menos especial e@abe:e/> Variable='Varias palabras en una variable' e@abe:e/> echo $Variable Varias palabras en una variable e@abe:e/> echo '$Variable' $Variable Se observa cómo el comando echo muestra \* cuando éstos símbolos están encerrados en ' ya que ni \ ni * son especiales cuando así están encerrados. Como se ve en el segundo caso del ejemplo, los caracteres sin significado especial siguen siendo caracteres comunes cuando están dentro de las comillas rectas no tipográficas. En el tercer caso de los ejemplos se muestra cómo hacer que un texto de varias palabras se tome como un único ítem. Dentro de las comilla ' ni los espacios son especiales, en ése ejemplo, lo que se guarda en la variable es un único ítem, el que tenga espacios no tiene nada de especial. En el el último caso se muestra como la sustitución de variables no tiene efecto dentro de las comillas simples no tipográficias, porque el símbolo de pesos como cualquier otro caracter está sin significado especial mientras está dentro de ' '. Escape de no todos los significados especiales: " Cuando son varios los símbolos dentro de un texto que se entra en el indicador de mandatos del shell pero se quieren hacer ciertas excepciones se puede usar otro tipo de escape. Este otro tipo de escape del que se hace mención es el encerrar el texto entre " ". Cuando se encierra un texto entre " " la mayoría de los símbolos y caracteres pierden su significado especial, exceptuando por !, $, ‘, \, {, }. Así, ni los espacios, ni ?, ni *, ni ‘ tienen significado especial, son simples símbolos. Los caracteres que cuando tienen un prefijo \ toman significado especial dentro de las comillas dobles " " siguen convirtiéndose en especiales cuando tienen ese prefijo. Ejemplos: e@abe:e/> echo "Esta es una comilla ' verdad?" Esta es una comilla ' verdad? e@abe:e/> echo "Contenidos de \$HOME: $HOME" Contenidos de $HOME: /home/e e@abe:e/> echo "Para decir \"Todos los nombres\" se usa *" Para decir "Todos los nombres" se usa * En el primer caso de los ejemplos se nota cómo una comilla sencilla ‘ no tiene significado especial dentro de un par de comillas dobles (" "). En el segundo caso de los ejemplos se nota cómo el backslash (\) sigue teniendo dentro de " " el significado de siempre: hacer que lo que sigue no tenga significado especial si normalmente lo hace, hacer que lo que siga tenga significado especial si normalmente no lo hace. Se muestra en el tercer caso de los AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 202 ejemplos cómo obtener unas comillas literales (") dentro de un par de comillas " ", usando backslash. Se muestra también cómo el * no tiene significado especial dentro del par de " ". AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 203 Utilidades de Texto El Concepto Cuando inició el diseño y desarrollo de UNIX, por allá en la prehistoria de finales de la década de los sesentas lo imperativo en AT&T era que se obtuviera un sistema para procesar ingentes cantidades de texto que finalmente se convertirían en manuales técnicos de servicio. Por esta razón única, desde el comienzo se pensó en que UNIX tuviese múltiples comandos de manipulación de texto que pudieran combinarse para obtener lo que AT&T necesitaba -y lo que los usuarios querían hacer-. Un UNIX típico termina entonces siendo un sistema con ingentes cantidades de comandos cuyo “producido” es texto, casi siempre texto plano sin formato (inicialmente ASCII, pero después interpretable con “códigos de página”), y textos que pueden pasarse y mandarse de un comando a otro, en secuencias y cadenas. En un UNIX normal, sin instalaciones adicionales o agregados se dispone de centenares de comandos, muchos de ellos -decenas- son y existen únicamente para procesar texto. Estos comandos existen y han existido por décadas, y han sido optimizados a través del tiempo, por lo que es difícil encontrar implementaciones para lo mismo que sean tan o más eficientes. Dentro de lo que veremos en este capítulo están: Cómo ordenar texto -y archivos de texto-. Cómo filtrar texto -y archivos de texto-. Cómo cortar texto, juntar, combinar. Otras operaciones con texto -y archivos de texto-. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 204 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 205 Volcar texto a la salida estándar: cat cat Para volcar un texto a la salida estándar en UNIX normalmente hay simplemente que redirigirla, pero en muchos casos es práctico tener un comando. Este comando lleva por nombre cat (catenate), que lee la entrada estándar o los archivos dados como argumento y vuelca, sin pausa ni separación los contenidos de todos a la salida estándar. La sintaxis de cat es muy sencilla: cat [ -r ] [ -v [ -e ] [ -t ] ] [ archivo ... ] Donde: Los símbolos [ y ] indican que las opciones y los argumentos son opcionales, no hacen parte de la sintaxis. La opción r se usa para que cat reemplace en la salida varias líneas en blanco consecutivas por una sola. La opción v se usa para que cat reemplace en la salida los caracteres de control por ^octal donde octal es el número de tres octales que representa al caracter de control. Al mismo tiempo cat reemplaza en la salida otros caracteres no mostrables por M-x donde x es un caracter ASCII que resulta de apagar el bit más significativo del caracter no mostrable por un 0. Cuando se usa la opción v también se pueden usar las opciones e y t. La opción e se usa para que cat muestre un símbolo $ para representar el fin de cada línea. La opción t se usa para que cat reemplace en la salida el caracter tabulador por un ^I. Ejemplos: 0 root@abe:/etc> cat passwd AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 206 root:!:0:0::/:/usr/bin/bash daemon:!:1:1::/etc: bin:!:2:2::/bin: sys:!:3:3::/usr/sys: adm:!:4:4::/var/adm: uucp:!:5:5::/usr/lib/uucp: guest:!:100:100::/home/guest: nobody:!:4294967294:4294967294::/: lpd:!:9:4294967294::/: lp:!:11:11::/var/spool/lp:/bin/false invscout:!:6:12::/var/adm/invscout:/usr/bin/ksh snapp:!:200:13:snapp login user:/usr/sbin/snapp:/usr/sbin/snappd ipsec:!:201:1::/etc/ipsec:/usr/bin/ksh nuucp:!:7:5:uucp login user:/var/spool/uucppublic:/usr/sbin/uucp/uucico sshd:!:202:201::/var/empty:/usr/bin/ksh j:!:505:0:Ramon Barrios Lascar:/home/j:/usr/bin/ksh ldapdb2:!:205:14::/home/ldapdb2:/usr/bin/ksh e:!:501:0:Ramon Barrios Lascar:/home/e:/usr/bin/ksh 0 root@abe:/etc> cat -vte passwd root:!:0:0::/:/usr/bin/bash$ daemon:!:1:1::/etc:$ bin:!:2:2::/bin:$ sys:!:3:3::/usr/sys:$ adm:!:4:4::/var/adm:$ Note que el com ando uucp:!:5:5::/usr/lib/uucp:$ aún más opcione wc tiene s, opciones guest:!:100:100::/home/guest:$ qu e pu ed e re vi sa r en la nobody:!:4294967294:4294967294::/:$ documentación. lpd:!:9:4294967294::/:$ lp:!:11:11::/var/spool/lp:/bin/false$ invscout:!:6:12::/var/adm/invscout:/usr/bin/ksh$ snapp:!:200:13:snapp login user:/usr/sbin/snapp:/usr/sbin/snappd$ ipsec:!:201:1::/etc/ipsec:/usr/bin/ksh$ nuucp:!:7:5:uucp login user:/var/spool/uucppublic:/usr/sbin/uucp/uucico$ sshd:!:202:201::/var/empty:/usr/bin/ksh$ j:!:505:0:Ramon Barrios Lascar:/home/j:/usr/bin/ksh$ ldapdb2:!:205:14::/home/ldapdb2:/usr/bin/ksh$ e:!:501:0:Ramon Barrios Lascar:/home/e:/usr/bin/ksh$ Como se notará, en el primer caso de los ejemplos cat vuelca los contenidos del archivo a la salida estándar, sin hacer más. En el segundo caso de los ejemplos cat muestra los caracteres especiales como símbolos -el archivo no contiene caracteres especiales- y los fines de línea con unos símbolos $. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 207 Contar caracteres, palabras, líneas: wc wc 20 Contar texto es una de las operaciones más básicas. Uno de los comandos cuenta líneas, palabras y caracteres, y puede decírsele que cuente y reporte cualesquiera de los tres. Para todo lo mencionado se usa el comando wc (word count), que no sólo cuenta palabras como indicaría el nombre en inglés-. La sintaxis es muy sencilla: wc [ -c | -w | -l ] [ archivo ... ] Donde: Los símbolos [ y ] indican que las opciones y los argumentos son opcionales, no hacen parte de la sintaxis. El símbolo | indica “posibilidad”, se usa para mostrar las posibles opciones, no hace parte de la sintaxis. Pueden dársele entre cero y tres opciones. Pueden dársele cero o más archivos. Cuando no se dan archivos wc lee de la entrada estándar. La opción c es para que cuente y reporte los caracteres en la entrada estándar o los archivos dados. La opción w es para que cuente y reporte las palabras en la entrada estándar o los archivos dados. La opción l es para que cuente y reporte las líneas en la entrada estándar o los archivos dados. Si no se dan archivos cuenta y reporta lo leído por entrada estándar. Si se dan archivos no lee de la entrada estándar. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 208 Si se dan varios archivos cuenta y reporta por cada archivo y reporta un total al final del reporte. Ejemplos: 0 root@abe:/etc> wc sudoers 29 98 604 sudoers 0 root@abe:/etc> wc -l /etc/passwd /etc/group 18 /etc/passwd 29 /etc/group 47 total 0 root@abe:/etc> who | wc -l 1 El primer caso del ejemplo muestra cómo cuando no se dan opciones reporta tres números: el número de líneas, el número de palabras y el número de caracteres, en ése orden. El segundo caso de los ejemplos muestra cómo puede solicitarse una única estadística, en este caso el número de líneas, y como se indicaron dos archivos como argumentos primero se reporta por archivo y al final un total. El tercer caso de los ejemplos Note que el com ando muestra cómo pueden reportarse estadísticas de un texto que no está en aú n más opciones, nl tiene un archivo, en este caso, como no se indicaron argumentos el comando qu e pu ed e re vi sa ropciones en la documentación. wc lee de la entrada estándar, que termina siendo la salida estándar del comando anterior, que se conectó con el símbolo |. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 209 Numerar líneas de texto: nl 1 2 3 4 nl 5 6 7 8 9 10 A menudo hay que listar archivos -o texto que no necesariamente está en un archivo-. Esta operación a veces se usa para indicar dónde lógicamente se ubica algo, y es más fácil si se reporta usando números de línea. La manera más fácil de listar texto con las líneas numeradas es usando el comando nl (number lines). Este comando toma un archivo o si no se da el archivo la entrada estándar, y lo muestra con las líneas numeradas, posiblemente según unas opciones dadas. La sintaxis puede parecer complicada -por el número de opciones- pero la verdad es muy sencilla: nl [-b modo] [-n formato] [-s separador] [-w número] [-l número] [ archivo ] Donde: Los símbolos [ y ] indican que las opciones y los argumentos son opcionales, no hacen parte de la sintaxis. Pueden dársele cero o más opciones. Pueden dársele ninguno o un archivo. Cuando no se indica archivo el comando nl lee el texto de la entrada estándar. La opción b se usa para escoger el modo como se numeran las líneas. El modo a indica que se numeran todas las líneas, el modo t indica que se numeran las líneas que sean visibles -no contaría las líneas vacías o de sólo blancos y/o tabuladores, el modo ppatrón numera sólo las líneas que cumplen con un patrón -el patrón es una expresión regular-. El modo predeterminado es el modo t. La opción n se usa para escoger el modo como se muestran los números de líneas. El modo ln muestra los números justificados a la izquierda, y sin ceros a la izquierda, el modo rn muestra los números justificados a la derecha, y sin ceros a la izquierda, el modo rz muestra los números con un ancho fijo, completados con ceros a la izquierda. El modo predeterminado es el modo rn. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 210 La opción s se usa para especificar un separador entre los números y las líneas de la entrada. El separador predeterminado es un caracter tabulador. La opción w se usa para escoger un ancho de columna para los números de línea. El ancho de columna predeterminado es 6. La opción l se usa para indicar que varias líneas en blanco cuentan como una sola, así si se usa -l 3 el comando nl contaría hasta tres líneas en blanco seguidas como una sola. El valor predeterminado de la opción l es 1. Ejemplos: 0 root@abe:/etc> nl passwd 1 root:!:0:0::/:/usr/bin/bash 2 daemon:!:1:1::/etc: 3 bin:!:2:2::/bin: 4 sys:!:3:3::/usr/sys: 5 adm:!:4:4::/var/adm: 6 uucp:!:5:5::/usr/lib/uucp: 7 guest:!:100:100::/home/guest: 8 nobody:!:4294967294:4294967294::/: 9 lpd:!:9:4294967294::/: 10 lp:!:11:11::/var/spool/lp:/bin/false 11 invscout:!:6:12::/var/adm/invscout:/usr/bin/ksh 12 snapp:!:200:13:snapp login user:/usr/sbin/snapp:/usr/sbin/snappd 13 ipsec:!:201:1::/etc/ipsec:/usr/bin/ksh 14 nuucp:!:7:5:uucp login user:/var/spool/uucppublic:/usr/sbin/uucp/ uucico 15 sshd:!:202:201::/var/empty:/usr/bin/ksh 16 j:!:505:0:Jorge Valbuena:/home/j:/usr/bin/ksh 17 ldapdb2:!:205:14::/home/ldapdb2:/usr/bin/ksh 18 e:!:501:0:Ramon Barrios Lascar:/home/e:/usr/bin/ksh 0 root@abe:/etc> nl passwd group 1 root:!:0:0::/:/usr/bin/bash 2 daemon:!:1:1::/etc: 3 bin:!:2:2::/bin: 4 sys:!:3:3::/usr/sys: 5 adm:!:4:4::/var/adm: 6 uucp:!:5:5::/usr/lib/uucp: 7 guest:!:100:100::/home/guest: 8 nobody:!:4294967294:4294967294::/: 9 lpd:!:9:4294967294::/: 10 lp:!:11:11::/var/spool/lp:/bin/false 11 invscout:!:6:12::/var/adm/invscout:/usr/bin/ksh 12 snapp:!:200:13:snapp login user:/usr/sbin/snapp:/usr/sbin/snappd 13 ipsec:!:201:1::/etc/ipsec:/usr/bin/ksh 14 nuucp:!:7:5:uucp login user:/var/spool/uucppublic:/usr/sbin/uucp/ uucico 15 sshd:!:202:201::/var/empty:/usr/bin/ksh 16 j:!:505:0:Jorge Valbuena:/home/j:/usr/bin/ksh 17 ldapdb2:!:205:14::/home/ldapdb2:/usr/bin/ksh 18 e:!:501:0:Ramon Barrios Lascar:/home/e:/usr/bin/ksh 1 root@abe:/etc> nl -w 2 -s\)\ -n ln passwd AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 211 1 ) 2 ) 3 ) 4 ) 5 ) 6 ) 7 ) 8 ) 9 ) 10) 11) 12) 13) 14) 15) 16) 17) 18) root:!:0:0::/:/usr/bin/bash daemon:!:1:1::/etc: bin:!:2:2::/bin: sys:!:3:3::/usr/sys: adm:!:4:4::/var/adm: uucp:!:5:5::/usr/lib/uucp: guest:!:100:100::/home/guest: nobody:!:4294967294:4294967294::/: lpd:!:9:4294967294::/: lp:!:11:11::/var/spool/lp:/bin/false invscout:!:6:12::/var/adm/invscout:/usr/bin/ksh snapp:!:200:13:snapp login user:/usr/sbin/snapp:/usr/sbin/snappd ipsec:!:201:1::/etc/ipsec:/usr/bin/ksh nuucp:!:7:5:uucp login user:/var/spool/uucppublic:/usr/sbin/uucp/uucico sshd:!:202:201::/var/empty:/usr/bin/ksh j:!:505:0:Jorge Valbuena:/home/j:/usr/bin/ksh ldapdb2:!:205:14::/home/ldapdb2:/usr/bin/ksh e:!:501:0:Ramon Barrios Lascar:/home/e:/usr/bin/ksh En el primer caso de los ejemplos se muestra cómo es el listado predeterminado del comando nl. Se da un único archivo. En el segundo caso de los ejemplos se muestra cómo el comando nl ignora los archivos dados después del primero -puede compararse con el primer caso-. En el tercer caso de los ejemplos se muestra cómo los números de línea ocupan menos espacio porque se indicó que van en una columna de dos caracteres de ancho -con la opción w2-, se separan con un paréntesis y un espacio -con la opción s) -, y que los números se justifican a la izquierda -con la opción nln-. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 212 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 213 Paginar Texto: pg Para leer textos en un archivo o en la entrada estándar no siempre se usa vi. En especial vi no puede leer texto que no esté en un archivo -no puede leer textos de la entrada estándar-. Más flexible y rápido -y sin peligro de editar inadvertidamente el archivo- es usar el comando pg (paginate) que lee textos y los muestra por salida estándar (casi siempre por pantalla) por páginas que llenan la pantalla y luego se detiene para esperar comandos. La sintaxis de pg es: pg [ +número | +/patrón/ ] [ -e ] [ -f ] [ -s ] [ archivo ... ] Donde: Los símbolos [ y ] indican que las opciones y los argumentos son opcionales, no hacen parte de la sintaxis. El símbolo | indica “posibilidad”, se usa para mostrar las posibles opciones, no hace parte de la sintaxis. Pueden dársele cero o más opciones. Pueden dársele cero o más archivos. Cuando no se le dan archivos el comando pg lee de la entrada estándar. Con +número se indica que el comando pg debe comenzar a mostrar en cierto número de línea. Con +/patrón/ se indica que el comando pg debe comenzar a mostrar a partir de la primera línea que contenga el patrón de texto. Con la opción e se indica que el comando pg no debe esperar un Enter entre archivo y archivo. Con la opción f se indica que el comando pg no debe partir las líneas que no caben en la pantalla. Con la opción s se indica que el comando debe resaltar todos los mensajes e indicadores en la última línea de la pantalla. Ejemplos: Para mostrar un archivo reporte.txt por páginas se usaría: pg reporte.txt Para mostrar un archivo reporte.txt por páginas, comenzando con Agosto (estando este texto en una línea con las mayúsculas tal cual) se usaría: pg +/Agosto/ reporte.txt El comando pg es interactivo, con numerosos comandos mientras está funcionando. Este comando tiene un indicador de comandos en la última línea de la pantalla, donde recibe: AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 214 Un número, lo que hace que pg se salte a la página de ese número. +número, lo que hace que pg avance en el texto actual número páginas. -número, lo que hace que pg retroceda en el texto actual número páginas. l hace que pg avance una línea (el comando es una ele). númerol hace que pg salte a una parte del texto donde la línea número está de primera en la pantalla (el comando es número ele). +númerol hace que pg avance número líneas en el texto (el comando es mas número ele). -númerol hace que pg retroceda número líneas en el texto (el comando es menos número ele). $ hace que pg vaya a la última página del texto. No funciona cuando pg está leyendo la entrada estándar. /texto/ hace que pg busque avanzando texto. número/texto/ hace que pg busque avanzando texto, y se ubique en la número ocurrencia que encuentre. ?texto? hace que pg busque retrocediendo texto. número?texto? hace que pg busque retrocediendo texto, y se ubique en la número ocurrencia que encuentre. n hace que pg muestre el siguiente archivo de los argumentos. Puede usarse númeron para que muestre el número archivo siguiente (este modo es número ene). p hace que pg muestre el anterior archivo de los argumentos. Puede usarse númerop para que muestre el número archivo siguiente (este modo es número pe). s archivo hace que pg guarde el texto actual en el archivo nombrado. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 215 Obtener primeras líneas de texto: head head Muchas veces interesan de un texto sólo unas pocas líneas del inicio del mismo -por ejemplo es un listado de los usuarios que más consumen un recurso y nos interesan los más consumidores únicamente-. Para obtener las primeras líneas de un texto se usa el comando sencillo head. La sintaxis es de verdad sencilla: head [ -número | -n número | -c número ] [ archivo ... ] Donde: Los símbolos [ y ] indican que las opciones y los argumentos son opcionales, no hacen parte de la sintaxis. El símbolo | indica “posibilidad”, se usa para mostrar las posibles opciones, no hace parte de la sintaxis. Debe darse una opción. Pueden dársele cero o más archivos. Cuando no se dan archivos head lee de la entrada estándar. Cuando a head se le dan varios archivos muestra las primeras líneas del texto combinado de los archivos, no muestra las primeras líneas de cada texto. Cuando se usa -número el comando head muestra las primeras número líneas del (de los) archivo(s). Esta es la sintaxis “antigua” del comando. Cuando se usa -n número el comando head muestra lo mismo, las primeras número líneas del archivo. Cuando se usa -c número el comando head muestra los primeros número caracteres del archivo. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 216 Ejemplos: 0 root@abe:/etc> cat passwd root:!:0:0::/:/usr/bin/bash daemon:!:1:1::/etc: bin:!:2:2::/bin: sys:!:3:3::/usr/sys: adm:!:4:4::/var/adm: uucp:!:5:5::/usr/lib/uucp: guest:!:100:100::/home/guest: nobody:!:4294967294:4294967294::/: lpd:!:9:4294967294::/: lp:!:11:11::/var/spool/lp:/bin/false invscout:!:6:12::/var/adm/invscout:/usr/bin/ksh snapp:!:200:13:snapp login user:/usr/sbin/snapp:/usr/sbin/snappd ipsec:!:201:1::/etc/ipsec:/usr/bin/ksh nuucp:!:7:5:uucp login user:/var/spool/uucppublic:/usr/sbin/uucp/uucico sshd:!:202:201::/var/empty:/usr/bin/ksh j:!:505:0:Jorge Valbuena:/home/j:/usr/bin/ksh ldapdb2:!:205:14::/home/ldapdb2:/usr/bin/ksh e:!:501:0:Ramon Barrios Lascar:/home/e:/usr/bin/ksh 0 root@abe:/etc> head -n 5 passwd root:!:0:0::/:/usr/bin/bash daemon:!:1:1::/etc: bin:!:2:2::/bin: sys:!:3:3::/usr/sys: adm:!:4:4::/var/adm: 0 root@abe:/etc> head -c 50 passwd root:!:0:0::/:/usr/bin/bash daemon:!:1:1::/etc: bi En los ejemplos primero se muestra el archivo completo, usando cat. El segundo caso muestra el uso típico, con la opción n para obtener sólo algunas de las primeras líneas. El tercer caso de los ejemplos usa la opción c para obtener sólo algunos de los caracteres del inicio del texto, puede observarse que la tercera línea del texto no aparece completa. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 217 Obtener últimas líneas de texto: tail tail Así como muchas veces sólo nos interesan las primeras líneas de un texto -para lo que se usa head- otras muchas veces sólo nos interesan las últimas líneas de un texto. Para esto otro existe el comando tail, que muestra las últimas líneas de un texto o las líneas a partir de una posición hasta las última. La sintaxis de tail es parecida a la del comando head: tail [ -n signúmero | -c signúmero | -k signúmero ] [ -f ] [archivo ... ] o también: tail -r [ -n número ] [ archivo ... ] Donde: Los símbolos [ y ] indican que las opciones y los argumentos son opcionales, no hacen parte de la sintaxis. El símbolo | indica “posibilidad”, se usa para mostrar las posibles opciones, no hace parte de la sintaxis. Puede darse cero o una opción. Pueden dársele cero o más archivos. Cuando no se dan archivos tail lee de la entrada estándar. Cuando se dan varios archivos tail muestra los últimos contenidos de la combinación de todos los archivos, no muestra los últimos contenidos de cada archivo. El parámetro signúmero es un número individual, o +número o -número. Cuando se da un número individual tail muestra las últimas número unidades del texto (sean líneas, caracteres o kilobytes). Cuando se da +número el comando tail muestra las últimas unidades del texto a partir de la número unidad entrada (sean AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 218 líneas, caracteres o kilobytes). Cuando se da -número el comando muestra las últimas número unidades del texto (igual que cuando no se usa signo). La opción n se usa para que las unidades sean líneas, así que el comando tail mostrará las últimas líneas del texto. La opción c se usa para que las unidades sean caracteres, así que el comando tail mostrará los últimos caracteres del texto. La opción k se usa para que las unidades sean kilobytes, así que el comando tail mostrará los últimos kilobytes del texto. La opción f se usa para que tail no termine, se quedará leyendo indefinidamente y si encuentra más contenido en el final del texto irá mostrándolo. La opción r se usa para que las últimas líneas las muestre en sentido inverso. Sólo puede mostrar máximo los últimos 20KB del texto. Cuando no se dan opciones tail funciona como si se hubiera indicado -n10, es decir mostrará las últimas diez líneas del texto. Ejemplos: 0 root@abe:/etc> cat passwd root:!:0:0::/:/usr/bin/bash daemon:!:1:1::/etc: bin:!:2:2::/bin: sys:!:3:3::/usr/sys: adm:!:4:4::/var/adm: uucp:!:5:5::/usr/lib/uucp: guest:!:100:100::/home/guest: nobody:!:4294967294:4294967294::/: lpd:!:9:4294967294::/: lp:!:11:11::/var/spool/lp:/bin/false invscout:!:6:12::/var/adm/invscout:/usr/bin/ksh snapp:!:200:13:snapp login user:/usr/sbin/snapp:/usr/sbin/snappd ipsec:!:201:1::/etc/ipsec:/usr/bin/ksh nuucp:!:7:5:uucp login user:/var/spool/uucppublic:/usr/sbin/uucp/uucico sshd:!:202:201::/var/empty:/usr/bin/ksh j:!:505:0: Jorge Valbuena:/home/j:/usr/bin/ksh ldapdb2:!:205:14::/home/ldapdb2:/usr/bin/ksh e:!:501:0:Ramon Barrios Lascar:/home/e:/usr/bin/ksh 0 root@abe:/etc> tail -n 5 passwd nuucp:!:7:5:uucp login user:/var/spool/uucppublic:/usr/sbin/uucp/uucico sshd:!:202:201::/var/empty:/usr/bin/ksh j:!:505:0:Ramon Barrios Lascar:/home/j:/usr/bin/ksh ldapdb2:!:205:14::/home/ldapdb2:/usr/bin/ksh e:!:501:0:Ramon Barrios Lascar:/home/e:/usr/bin/ksh 0 root@abe:/etc> tail -n +5 passwd adm:!:4:4::/var/adm: uucp:!:5:5::/usr/lib/uucp: AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 219 guest:!:100:100::/home/guest: nobody:!:4294967294:4294967294::/: lpd:!:9:4294967294::/: lp:!:11:11::/var/spool/lp:/bin/false invscout:!:6:12::/var/adm/invscout:/usr/bin/ksh snapp:!:200:13:snapp login user:/usr/sbin/snapp:/usr/sbin/snappd ipsec:!:201:1::/etc/ipsec:/usr/bin/ksh nuucp:!:7:5:uucp login user:/var/spool/uucppublic:/usr/sbin/uucp/uucico sshd:!:202:201::/var/empty:/usr/bin/ksh j:!:505:0:Jorge Valbuena:/home/j:/usr/bin/ksh ldapdb2:!:205:14::/home/ldapdb2:/usr/bin/ksh e:!:501:0:Ramon Barrios Lascar:/home/e:/usr/bin/ksh En los ejemplos el primer caso muestra el archivo completo. El segundo caso de los ejemplos muestra cómo se usa tail para obtener las últimas líneas de un archivo (con la opción n número). El tercer caso muestra cómo se usa tail para obtener las líneas de un archivo desde la número dado hasta la última (con la opción n +número). AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 220 Note que el com ando cut no corta -como se pensaría dado el nombre-, realm en hace es selecciona te lo que r. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 221 Obtener columnas de texto: cut cut Otra necesidad en el procesamiento de texto que a veces surge es la de obtener una o más de las columnas de un texto -o quitar una de las columnas-. Para hacer algo así no se necesita una herramienta de programación, se necesita tan sólo conocer una utilidad sencilla de UNIX que lleva por nombre cut. Con cut se pueden obtener columnas de texto dado un separador -de columnas- o dadas las posiciones exactas de los caracteres. Cuando al comando cut se le indican unas columnas esas son las que se copiarán de la entrada -o de los archivos- a la salida estándar, las demás se ignoran. La sintaxis del comando cut es sencilla: cut [ -c columnas ] | [ -f columnas [ -d separador ] [ -s ] ] [ archivo ... ] Donde: Los símbolos [ y ] indican que las opciones y los argumentos son opcionales, no hacen parte de la sintaxis. El símbolo | indica “posibilidad”, se usa para mostrar las posibles opciones, no hace parte de la sintaxis. Debe darse una de las opciones c o f. Pueden dársele cero o más archivos. Cuando no se dan archivos cut lee de la entrada estándar. Las columnas que se especifican son las que aparecen en la salida estándar. Las columnas pueden especificarse como número individual -así 5 indica la quinta columna-; pueden especificarse como una lista de números separados por comas (,) -así 5,7,9 indican la columna quinta, séptima y novena-; pueden especificarse como un rango de números, donde 5-9 indican las columnas de la quinta a la novena, inclusive; y pueden usarse combinaciones. Cuando se usa un rango de columnas y no se indica el inicio el comando cut asume que se deben copiar desde la primera columna -así que -5 indica las columnas hasta la quita-, y cuando AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 222 se usa un rango pero no se especifica la última el comando cut asume que se deben copiar hasta la última -así que 5- indica las columnas desde la quinta hasta la última-. La opción c indica al comando cut que las columnas se están especificando por posición exacta de caracteres en el texto. El primer caracter del texto está en la posición 1. La opción f indica al comando cut que las columnas se están especificando visualmente, donde una columna se separa de la siguiente por exactamente un separador. El separador predeterminado es un tabulador. Cuando se usa la opción f pueden usarse las opciones d y s. La opción d se usa para indicar al comando cut cuál es el caracter separador de columnas. La opción s se usa para indicar al comando cut que no debe copiar a la salida las líneas del texto que no tienen el separador de columna en ninguna parte. Ejemplos: e@abe:e/> cat /etc/passwd root:!:0:0::/:/usr/bin/bash daemon:!:1:1::/etc: bin:!:2:2::/bin: sys:!:3:3::/usr/sys: adm:!:4:4::/var/adm: uucp:!:5:5::/usr/lib/uucp: guest:!:100:100::/home/guest: nobody:!:4294967294:4294967294::/: lpd:!:9:4294967294::/: lp:!:11:11::/var/spool/lp:/bin/false invscout:!:6:12::/var/adm/invscout:/usr/bin/ksh snapp:!:200:13:snapp login user:/usr/sbin/snapp:/usr/sbin/snappd ipsec:!:201:1::/etc/ipsec:/usr/bin/ksh nuucp:!:7:5:uucp login user:/var/spool/uucppublic:/usr/sbin/uucp/uucico sshd:!:202:201::/var/empty:/usr/bin/ksh j:!:505:0:Jorge Valbuena:/home/j:/usr/bin/ksh ldapdb2:!:205:14::/home/ldapdb2:/usr/bin/ksh e:!:501:0:Ramon Barrios Lascar:/home/e:/usr/bin/ksh e@abe:e/> cut -f1 -d: /etc/passwd root daemon bin sys adm uucp guest nobody lpd lp AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 223 invscout snapp ipsec nuucp sshd j ldapdb2 e e@abe:e/> ps -ef | head -n8 | cut -c-15,49UID PID CMD root 1 /etc/init root 69832 /usr/sbin/rsct/bin/rmcd -a IBM.LPCommands -r root 73906 /usr/sbin/syslogd root 82038 /usr/sbin/syncd 60 root 86030 /usr/ccs/bin/shlap64 root 94314 /usr/lib/errdemon root 114794 /usr/sbin/hostmibd En el primer caso de los ejemplos se usa cat para volcar a la pantalla el archivo completo. En el segundo caso de los ejemplos se usa cut para obtener sólo la primera columna del texto (con la opción f1, pero el texto tiene columnas separadas por el símbolo : se indica esto a cut con d:, ya que de manera predeterminada busca un tabulador). En el tercer caso de los ejemplos usa cut para obtener un listado parcial de procesos; en este caso como el texto generado por ps viene con columnas armadas con ancho exacto se usa cut con la opción c para indicar dichas columnas: primero hasta cierta posición, y luego desde cierta posición hasta el final. Nótese que cut no es usable fácilmente con columnas de ancho variable y que separan columna de columna usando algo variable; para estos casos es mejor usar otra herramienta. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 224 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 225 Combinar texto en columnas: paste paste Con el comando cat pueden combinarse dos o más textos o archivos de manera que queden uno seguido del otro, pero qué se usa cuando hay que combinar unos textos uno “al lado” del otro? Tampoco hay que usar una compleja herramienta de programación, hay que usar una herramienta sencilla que conoceremos enseguida: el comando paste. Este comando “junta” dos o más textos o archivos y los copia a la salida estándar de manera que los de la entrada se convierten en “columnas” de la salida estándar. La sintaxis del comando paste es: paste [ -d lista ] [ -s ] [ archivo1 archivo2 ... ] Donde: Los símbolos [ y ] indican que las opciones y los argumentos son opcionales, no hacen parte de la sintaxis. Pueden dársele cero o más archivos. El comando paste es útil de verdad con al menos dos archivos. Cualesquiera de los archivos de la entrada pueden ser reemplazados por -. El argumento - se usa para indicar dónde debe ir -en las columnas- el texto leído de la entrada estándar. La opción d se usa para dar una lista de caracteres individuales que deban usarse como separadores de columna. Así el primer caracter de la lista se usará para separar la primera columna de la segunda -de la salida-, el segundo caracter de la lista se usará para separar la segunda columna de la tercera -de la salida-. Si hay más caracteres en la lista que columnas en la salida los caracteres sobrantes se ignoran. Si hay menos caracteres en la lista, las últimas columnas son separadas usando repetidamente el último caracter de la lista. La opción s se usa para que paste no arme las columnas tomando igual cantidad de líneas de cada columna de texto, si no que arme las columnas tomando líneas AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 226 del primer archivo de texto hasta el final, luego tomando líneas del segundo archivo de texto hasta el final, y así sucesivamente. Ejemplos: e@abe:e/> cat Numeros.txt 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 e@abe:e/> cat Romanos.txt i ii iii iv v vi vii viii ix x Los dos primeros casos de los ejemplos simplemente muestran cómo son los contenidos de los archivos Numeros.txt y Romanos.txt. Se usa cat para volcar los contenidos a la salida. e@abe:e/> paste Numeros.txt Romanos.txt 1 i 2 ii 3 iii 4 iv 5 v 6 vi 7 vii 8 viii 9 ix 10 x 11 12 13 14 15 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 227 El tercer caso de los ejemplos muestra el funcionamiento predeterminado de paste: junta lado a lado los archivos dados, separando los contenidos con un tabulador intermedio. e@abe:e/> paste -d"|" Numeros.txt Romanos.txt | head -n 5 1|i 2|ii 3|iii 4|iv 5|v El cuarto caso de los ejemplos muestra cómo usar la opción d del comando paste para que el listado combinado generado tenga las columnas separadas por medio de otro caracter. Note cómo hay que escapar el símbolo | para que no tenga el significado de redirección tradicional. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 228 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 229 Combinar Texto en Columnas: join En los sistemas UNIX está disponible un comando que muchos usuarios ni siquiera imaginan que podría existir. El comando join de los sistemas Unix hace el equivalente a las sentencias SQL SELECT ... INNER JOIN, SELECT ... RIGHT OUTER JOIN, SELECT ... LEFT OUTER JOIN. Este comando combina archivos usando campos que estén presentes en los dos archivos que se usan como entrada. La sintaxis del comando join es: join [ -1 campo ] [ -2 campo ] [ -a núm | -v núm ] [ -e texto ] [ -o campos ] [ -t sep ] archivo1 archivo2 Donde: Los símbolos [ y ] indican que las opciones y los argumentos son opcionales, no hacen parte de la sintaxis. El símbolo | indica “posibilidad”, se usa para mostrar las posibles opciones, no hace parte de la sintaxis. Deben darse dos archivos ordenados. Uno de los archivos puede reemplazarse por un argumento -. Cuando uno de los argumentos es - el comando join lee la entrada estándar y lo combina con el otro argumento, que se asume es un archivo. La opción 1 necesita un número de campo o columna, columna que se usará como llave para hacer el join en el primer archivo, es decir en archivo1. Se supone que los valores en esta columna se encuentran también como valores en una columna del segundo archivo, es decir archivo2. El comando join asume que el archivo1 está ordenado según esta columna o campo. La opción 2 necesita un número de campo o columna, columna que se usará como llave para hacer el join en el segundo archivo, es decir en archivo2. Se supone que los valores en esta columna se encuentran también como valores en una columna del primer archivo, es decir archivo1. El comando join asume que el archivo2 está ordenado según esta columna o campo. La opción t se usa para especificar cuál es el caracter separador de columnas en ambos archivos de entrada (archivo1 y archivo2) y en la salida estándar generada. Si este caracter se repite seguido el comando join asume que hay columnas con campos vacíos. La opción e se usa para especificar un texto que se usará para presentar en la salida para reeemplazar -en caso de que se desee- los valores nulos en las columnas de la salida. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 230 La opción o se usa para indicar cuáles de las columnas de los archivos de entrada se incluirán en la salida generada por join. Cada columna deberá especificarse como 1.número o 2.número, donde 1.número indica que el comando join deberá copiar la columna númeroésima del primer archivo a la salida, y 2.número indica que el comando join deberá copiar la columna númeroésima del segundo archivo a la salida. La opción a se usa para hacer un OUTER JOIN, donde en la salida se incluirán líneas de uno de los archivos de entrada que no tienen campos comunes adicionales a las líneas que se incluyen que son las que tienen campos comunes. La opción a necesita un argumento 1 o 2, indicando de cuál de los archivos se toman las líneas adicionales. La opción v se usa para que en la salida se filtren las líneas de los archivos de entrada que tienen los campos comunes del join. La opción v no genera líneas para las líneas con campos comunes del join. La opción v necesita un argumento 1 o 2 que le indique las líneas de cuál de los archivos se copiarán a la salida. Si se incluyen la opciones v y a, como la opción v es más fuerte, se ignora la a. Ejemplos: e@abe:~> cat Celulares.list Ramón Barrios (315)313-7269 Jorge Valbuena (313) 571-6462 Jairo E. Soler (315) 797-1397 Carlos Castilla (313) 433-7386 Jorge Molina M. (315) 344-8150 Alessio Di Mare (311) 688-1162 Jorge Russo X. (311) 818-8709 Omar Villalba (313) 388-7017 Yeimy Fontalvo (300) 817-4126 e@abe:~> cat Empresas.txt Alessio Di Mare Redsis Jairo E. Soler Net.Solutions Jorge Molina M. SENA Jorge Russo Redsis Jorge Valbuena iKnow Ramón Barrios iKnow Yasser Barrios SupraImpresores Yeimy Fontalvo e@abe:~> join -11 -21 -t' ' -e 'N/D' Empresas.txt Celulares.txt Alessio Di Mare Redsis (311) 688-1162 Jairo E. Soler Net.Solutions (315) 797-1397 Jorge Molina M. SENA (315) 344-8150 Jorge Russo Redsis (311) 818-8709 Jorge Valbuena iKnow (313) 571-6462 Ramón Barrios iKnow (315)313-7269 Yeimy Fontalvo N/D (300) 817-4126 e@abe:~> join -t' ' -e '***' -o 0,2.2,1.2 Empresas.txt Celulares.txt Alessio Di Mare (311) 688-1162 Redsis AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 231 Jairo Jorge Jorge Jorge Ramón Yeimy E. Soler Molina M. Russo Valbuena Barrios Fontalvo (315) 797-1397 (315) 344-8150 (311) 818-8709 (313) 571-6462 (315)313-7269 (300) 817-4126 Net.Solutions SENA Redsis iKnow iKnow *** Los primeros dos casos de los ejemplos simplemente muestran los archivos como son. El primer archivo tiene dos columnas, está ordenado por la primera -nombre-, y tiene como separador un tabulador. El segundo archivo tiene dos columnas, está ordenado por la primera -nombre-, y tiene como separador también un tabulador. El tercer caso del ejemplo muestra un join usando la primera columna del primer archivo (-1 1), y la primera columna del segundo archivo (-2 1), indica que se use como separador un tabulador (el argumento de la opción t), y que los campos de las columnas de la salida que estén nulos se completan con N/D (el argumento de la opción e). En el caso cuarto de los ejemplos se muestra cómo no hay necesidad de indicar la primera columna en los archivos porque es el valor predeterminado para las opciones 1 y 2; también se dice que el separador es tabulador aunque es el valor predeterminado para la opción t; se escoge unas columnas -y un orden- para la salida (la columna del join, con el valor mágico 0, la segunda columna del segundo archivo con 2.2, y la segunda columna del primer archivo con 1.2); también se indicó que los campos nulos se muestren como *** (el valor de la opción e). AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 232 Expresiones re gu un cruce entre lares son ex matemáticas y un presiones lenguaje de pr og ra m ac ió n ba autómatas celular sa do en es. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 233 Filtrar líneas de texto: grep xyz xyz xyz xyz grep xyz xyz Una de las operaciones más comunes al trabajar con textos son las búsquedas. Muchas de esas búsquedas se hacen para efectos de filtrado: a veces se busca para filtrar lo que no contiene lo que se busca, a veces se busca para filtrar lo que sí contiene lo que se busca. En los sistemas UNIX hay múltiples maneras de hacer filtrados de texto, dentro de editores de texto, y a través de comandos de línea, es decir, por fuera de los editores. Una de las maneras es usando alguno de los comandos de una familia basada en “expresiones regulares”. El primero y central de la familia de comandos lleva por nombre grep (general regular expression print), comando que busca texto y filtra, para mostrar sólo líneas de texto que cumplan con la expresión regular dada. El comando grep tiene una sintaxis base sencilla, pero el primero de los argumentos debe ser una expresión regular que puede llegar a ser bastante complicada. La sintaxis de grep es: grep [-i] [-v] [-c] [-l] [-q] [-w] [-x] [ -e expr ] [ expr ] [ archivo ... ] Donde: Los símbolos [ y ] indican que las opciones y los argumentos son opcionales, no hacen parte de la sintaxis. Pueden dársele a grep cero o más archivos. Si a grep no se le dan archivos leerá de la entrada estándar. En la sintaxis expr es una expresión regular básica. Si en la sintaxis no se usa la opción e entonces la expresión es obligatoria, asumiéndose como la expresión regular al primer argumento. La opción i se usa para que grep ignore la diferencia entre mayúsculas y minúsculas (hace a grep case insensitive). La opción v se usa para que grep filtre negativamente, así seleccionará las líneas que no cumplan con la expresión regular. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 234 La opción c se usa para que en vez de copiar a la salida estándar las líneas que cumplen la expresión regular, simplemente reporta en la salida estándar cuántas de las líneas concuerdan o cumplen la expresión regular. Si se usa la opción v reportará cuántas líneas no cumplen la expresión regular. La opción l se usa para que grep reporte en la salida estándar los nombres de los archivos que contienen alguna línea -al menos- que cumple la expresión regular, y no reporte las líneas. La opción q se usa para que grep no reporte ni las líneas que cumplen, ni los archivos que las contienen. Con esta opción grep sólo reporta “verdadero” o “falso” como código de retorno. Como siempre, verdadero en el intérprete “verdadero” es un código de retorno cero (0) y “falso” es un código de retorno diferente de cero. La opción w se usa para que grep asuma que la expresión es una palabra, no una expresión regular. La opción x se usa para que grep asuma que la línea completa debe cumplir la expresión regular, no una parte de la misma únicamente para ser reportada. Ejemplos A: 0 root@abe:/home/e> cat Empresas.txt Alessio Di Mare Redsis Jairo E. Soler Net.Solutions Jorge Molina M. SENA Jorge Russo Redsis Jorge Valbuena V. iKnow Ramón Barrios Lascar iKnow Yasser Barrios Lascar SupraImpresores Yeimy Fontalvo 0 root@abe:/home/e> grep iknow Empresas.txt 1 root@abe:/home/e> grep iKnow Empresas.txt Jorge Valbuena V. iKnow Ramón Barrios Lascar iKnow 0 root@abe:/home/e> grep -i iknow Empresas.txt Jorge Valbuena V. iKnow Ramón Barrios Lascar iKnow En el primer caso de los ejemplos A se muestra el archivo completo, simple, con cat. El segundo caso de los ejempos A muestra cómo se hace una búsqueda o filtrado sencillo, con texto literal, usando grep. Se da como primer argumento el texto iknow, y como no se dan opciones, grep hace una búsqueda donde una línea completa se copiará a la salida estándar si en alguna parte aparece el texto literal dado como primer argumento. Como no se dan opciones grep diferenciará las mayúsculas de las minúsculas, y por ello el texto no se encuentra, y así no se muestra ni una línea en la salida. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 235 El tercer caso de los ejemplos A muestra el resultado de una búsqueda literal donde el texto sí se encuentra: las líneas se copian a la salida estándar tal como aparecen en el archivo dado. El cuarto caso de los ejemplos A muestra el uso de la opción i, que hace las búsquedas insensibles a las mayúsculas, entonces en este caso se da el primer argumento todo en minúsculas, pero como no importa lo encuentra aunque está un poquito diferente y las líneas se copian como están en el archivo. Ejemplos B: 0 root@abe:/home/e> grep -iv iknow Empresas.txt Alessio Di Mare Redsis Jairo E. Soler Net.Solutions Jorge Molina M. SENA Jorge Russo Redsis Yasser Barrios Lascar SupraImpresores Yeimy Fontalvo 0 root@abe:/home/e> grep -ni iknow Empresas.txt 5:Jorge Valbuena V. iKnow 6:Ramón Barrios Lascar iKnow En el primer caso de los ejemplos B muestra el uso combinado de las opciones i (para que no diferencie las mayúsculas de las minúsculas) y v (para hacer una búsqueda negada). Como a grep se le indica que la expresión es el literal iknow, sin diferenciar, pero usando la opción v, copiará a la salida las líneas que no cumplen con el patrón de búsqueda, así que se muestran las líneas que no contienen iknow. El segundo caso de los ejemplos B muestra el uso de la opción n, y como también se incluye la opción i la búsqueda será indiferente a las mayúsculas y minúsculas. En este caso se muestra el número de línea como prefijo de cada línea que cumple con el patrón de búsqueda (se muestra en número como prefijo, con un símbolo de dos puntos (:) como separador. Ejemplos C: 1 root@abe:/home/e> grep -e Mar -e Al *.tsv Celulares.tsv:Alessio Di Mare (311) 688-1162 Empresas.tsv:Alessio Di Mare Redsis En el caso de los ejemplos C se muestra el uso de la opción e: se da una única expresión de búsqueda, pero pueden darse varias veces la opción e. Cuando se usa varias veces se asume AND, es decir que para ser copiada a la salida una línea debe cumplir con todos los patrones de búsqueda simultáneamente. En el ejemplo se muestran las líneas que cumplen ambos patrones, sin importar el orden en que los cumplen. En el ejemplo también se puede notar cómo la presentación de los resultados en la salida estándar cambia cuando a grep se le dan como argumentos más de un archivo -en el ejemplo grep recibe dos archivos: AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 236 Celulares.tsv, y Empresas.tsv-. Cuando grep recibe más de un archivo de entrada como argumentos, a cada línea mostrada le agrega como prefijo el nombre del archivo de donde salió la línea, separándolo -el nombre- de la línea mostrada con un símbolo dos puntos (:). Expresiones re gu unes expresiones lares son concisas que describen una porción de texto. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 237 Expresiones Regulares Básicas (en grep) Las expresiones regulares son un lenguaje muy rico, pero a la vez pueden hacer cosas bastante complejas. Por ello, algunas herramientas -en este caso grep- implementan un subconjunto de las mismas, de manera que no se conviertan en algo demasiado complejo de usar. En el tópico anterior vimos unos ejemplos donde se usaban unos de los casos más básicos: los caracteres alfabéticos son parte de la simbología de las expresiones regulares básicas. A continuación se define la simbología usada en las expresiones regulares básicas. Un símbolo punto (.) representa un caracter único cualquiera, por ejemplo una letra, un número, un símbolo visible, aún un espacio; excepto un caracter de fin de línea o retorno de carro. Un símbolo asterisco (*) representa una secuencia del caracter o grupo inmediatamente anterior. La secuencia puede tener cero o más caracteres del inmediatemente precedente. Un símbolo acento circunflejo (^) si aparece al inicio de una expresión representa un anclaje al inicio de una línea o cadena de texto. Un símbolo pesos ($) si aparece al final de una expresión representa un anclaje al final de una línea o cadena de texto. Una lista de caracteres encerrada en [ ] representa un único caracter cualquiera de la lista de caracteres encerrada. Un rango de caracteres encerrado en [ ] representa un único caracter cualquiera del rango de caracteres encerrado. Un rango de caracteres comienza con un caracter, sigue con un símbolo menos (-), y termina con un caractere numéricamente superior o posterior al que comienza el rango. Una lista de caracteres encerrada en [^ ] representa un único caracter cualquiera que no esté en la lista de caracteres encerrada. Un rango de caracteres encerrado en [^ ] representa un único caracter cualquiera que no esté en el rango de caracteres encerrado. Un rango de caracteres comienza con un caracter, sigue con un símbolo menos (-), y termina con un caractere numéricamente superior o posterior al que comienza el rango. Los símbolos ., *, $, pierden su significado especial cuando están encerrados dentro de [ ]. El símbolo ^ no tiene el significado especial negativo dentro de [ ] si no es el primer caracter inmediatamente después de [. El símbolo menos AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 238 (-) que se usa para definir una lista no tiene dicho significado especial dentro de [ ] si está de primero o de último en los caracteres encerrados. Cuando se encierra una parte de la expresión regular entre pares \( \) la parte encerrada queda memorizada en un registro numerado, contando desde la izquierda los pares \(. Los registros numerados se recuperan o usan con \número. Note que como algunos -muchos?- de los símbolos de las expresiones regulares tienen significado especial en el shell, es mejor encerrarlos en ‘ ‘ ya que así el shell no los interpreta con el significado que normalmente les da. Ejemplos: 0 root@abe:/home/e> cat Celulares.tsv Alessio Di Mare (311) 688-1162 Carlos Castilla V. (313) 433-7386 Jairo E. Soler (315) 797-1397 Jorge Molina M. (315) 344-8150 Jorge Russo (311) 818-8709 Jorge Valbuena V. (313) 571-6462 Omar Villalba (313) 388-7017 Ramón Barrios Lascar (315)313-7269 Yeimy Fontalvo (300) 817-4126 0 root@abe:/home/e> grep '.R' Celulares.tsv Jorge Russo (311) 818-8709 0 root@abe:/home/e> grep '^R' Celulares.tsv Ramón Barrios Lascar (315)313-7269 0 root@abe:/home/e> grep '\(.\)\1' Celulares.tsv Alessio Di Mare (311) 688-1162 Carlos Castilla V. (313) 433-7386 Jorge Molina M. (315) 344-8150 Jorge Russo (311) 818-8709 Omar Villalba (313) 388-7017 Ramón Barrios Lascar (315)313-7269 Yeimy Fontalvo (300) 817-4126 0 root@abe:/home/e> grep -v '[09]' Celulares.tsv Alessio Di Mare (311) 688-1162 Carlos Castilla V. (313) 433-7386 Jorge Valbuena V. (313) 571-6462 En el primer caso de los ejemplos simplemente se usa cat para volcar a la salida todo el archivo Celulares.tsv. En el segundo caso de los ejemplos se indica a grep que debe copiar a la salida estándar las líneas que tienen un caracter cualquiera (.) y luego una R. Si se observa bien hay otra línea con una R, pero no tiene antes un caracter porque está al comienzo de la línea. En el tercer caso de los ejemplos se busca un caracter cualquiera, y al mismo tiempo se le memoriza -como es el primer grupo “capturado” entonces está en la memoria -oficialmente “registro”- número 1, seguido de los contenidos de la memoria -registro- número 1; esta construcción busca dos caracteres repetidos; y como muestra lo listado, efectivamente AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 239 funciona. El caso del cuarto ejemplo busca líneas que tengan un caracter que puede ser cero (0) o puede ser nueve (9), y con la opción v, lista las otras líneas, las que no cumplen. Esta sintaxis y construcción lista las líneas que no tienen “cero o nueve”, que según la lógica son las líneas que no tienen un cero y que no tienen un nueve. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 240 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 241 Filtrado avanzado de líneas de texto: egrep xyz xyz xyz xyz egrep xyz xyz xyz xyz Como algunas de las búsquedas posibles matemáticamente no son posibles con el juego de expresiones regulares básicas que grep soporta, y como no es conveniente complicar al comando grep, se creó un comando que soporta lo que se llama “expresiones regulares extendidas”, que permiten cosas que con las básicas no son posibles, y que además facilita lo que con grep es simplemente difícil. El comando lleva por nombre egrep (extended general regular expression print). Sintaxis del comando egrep: egrep [-h] [-i] [-l] [-n] [-s] [-v] [-w] [-x] [-f arch1] [-e expr] [ expr ] [ archivo ... ] Donde: Los símbolos [ y ] indican que las opciones y los argumentos son opcionales, no hacen parte de la sintaxis. Pueden dársele a egrep cero o más archivos. Si no se le dan archivos egrep lee de la entrada estándar. En la sintaxis expr es una expresión regular básica. Si en la sintaxis no se usa la opción e entonces la expresión es obligatoria, asumiéndose como la expresión regular al primer argumento. Como muchas de las expresiones incluyen caracteres especiales que pueden ser interpretados por el shell la expresión debería encerrarse entre ‘ ‘ . La opción i se usa para que egrep ignore la diferencia entre mayúsculas y minúsculas (hace a egrep case insensitive). La opción v se usa para que egrep filtre negativamente, así seleccionará las líneas que no cumplan con la expresión regular. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 242 La opción c se usa para que en vez de copiar a la salida estándar las líneas que cumplen la expresión regular, simplemente reporta en la salida estándar cuántas de las líneas concuerdan o cumplen la expresión regular. Si se usa la opción v reportará cuántas líneas no cumplen la expresión regular. La opción l se usa para que egrep reporte en la salida estándar los nombres de los archivos que contienen alguna línea -al menos- que cumple la expresión regular, y no reporte las líneas. La opción q se usa para que egrep no reporte ni las líneas que cumplen, ni los archivos que las contienen. Con esta opción egrep sólo reporta “verdadero” o “falso” como código de retorno. Como siempre, verdadero en el intérprete “verdadero” es un código de retorno cero (0) y “falso” es un código de retorno diferente de cero. La opción w se usa para que egrep asuma que la expresión es una palabra, no una expresión regular. La opción x se usa para que egrep asuma que la línea completa debe cumplir la expresión regular, no una parte de la misma únicamente para ser reportada. La opción f se usa para que egrep lea las expresiones regulares de un archivo dado su nombre (el argumento arch1 de la opción f). La o las expresiones regulares dentro del archivo deberán estar en líneas individuales cada una. La opción e permite dar una expresión regular con la que se intentará probar cada línea de cada uno de los archivos dados como argumentos. La opción sólo permite una expresión regular extendida, pero puede darse múltiples veces la opción e. Esta opción no es realmente necesaria, pero es práctica cuando se quieren dar varias expresiones simultáneamente o cuando la expresión regular a usar inicia con el símbolo menos (-). Ejemplos A: 0 root@abe:/home/e> cat Empresas.txt Alessio Di Mare Redsis Jairo E. Soler Net.Solutions Jorge Molina M. SENA Jorge Russo Redsis Jorge Valbuena V. iKnow Ramón Barrios Lascar iKnow Yasser Barrios Lascar SupraImpresores Yeimy Fontalvo 0 root@abe:/home/e> egrep iknow Empresas.txt 1 root@abe:/home/e> egrep iKnow Empresas.txt Jorge Valbuena V. iKnow Ramón Barrios Lascar iKnow 0 root@abe:/home/e> egrep -i iknow Empresas.txt Jorge Valbuena V. iKnow AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 243 Ramón Barrios Lascar iKnow En el primer caso de los ejemplos A se muestra el archivo completo, simple, con cat. El segundo caso de los ejempos A muestra cómo se hace una búsqueda o filtrado sencillo, con texto literal, usando egrep. Se da como primer argumento el texto iknow, y como no se dan opciones, egrep hace una búsqueda donde una línea completa se copiará a la salida estándar si en alguna parte aparece el texto literal dado como primer argumento. Como no se dan opciones egrep diferenciará las mayúsculas de las minúsculas, y por ello el texto no se encuentra, y así no se muestra ni una línea en la salida. El tercer caso de los ejemplos A muestra el resultado de una búsqueda literal donde el texto sí se encuentra: las líneas se copian a la salida estándar tal como aparecen en el archivo dado. El cuarto caso de los ejemplos A muestra el uso de la opción i, que hace las búsquedas insensibles a las mayúsculas, entonces en este caso se da el primer argumento todo en minúsculas, pero como no importa lo encuentra aunque está un poquito diferente y las líneas se copian como están en el archivo. Ejemplos B: 0 root@abe:/home/e> egrep -iv iknow Empresas.txt Alessio Di Mare Redsis Jairo E. Soler Net.Solutions Jorge Molina M. SENA Jorge Russo Redsis Yasser Barrios Lascar SupraImpresores Yeimy Fontalvo 0 root@abe:/home/e> egrep -ni iknow Empresas.txt 5:Jorge Valbuena V. iKnow 6:Ramón Barrios Lascar iKnow En el primer caso de los ejemplos B muestra el uso combinado de las opciones i (para que no diferencie las mayúsculas de las minúsculas) y v (para hacer una búsqueda negada). Como a grep se le indica que la expresión es el literal iknow, sin diferenciar, pero usando la opción v, copiará a la salida las líneas que no cumplen con el patrón de búsqueda, así que se muestran las líneas que no contienen iknow. El segundo caso de los ejemplos B muestra el uso de la opción n, y como también se incluye la opción i la búsqueda será indiferente a las mayúsculas y minúsculas. En este caso se muestra el número de línea como prefijo de cada línea que cumple con el patrón de búsqueda (se muestra en número como prefijo, con un símbolo de dos puntos (:) como separador. Ejemplos C: 1 root@abe:/home/e> egrep -e Mar -e Al *.tsv AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 244 Celulares.tsv:Alessio Di Mare Empresas.tsv:Alessio Di Mare (311) 688-1162 Redsis En el caso de los ejemplos C se muestra el uso de la opción e: se da una única expresión de búsqueda, pero pueden darse varias veces la opción e. Cuando se usa varias veces se asume AND, es decir que para ser copiada a la salida una línea debe cumplir con todos los patrones de búsqueda simultáneamente. En el ejemplo se muestran las líneas que cumplen ambos patrones, sin importar el orden en que los cumplen. En el ejemplo también se puede notar cómo la presentación de los resultados en la salida estándar cambia cuando a grep se le dan como argumentos más de un archivo -en el ejemplo grep recibe dos archivos: Celulares.tsv, y Empresas.tsv-. Cuando grep recibe más de un archivo de entrada como argumentos, a cada línea mostrada le agrega como prefijo el nombre del archivo de donde salió la línea, separándolo -el nombre- de la línea mostrada con un símbolo dos puntos (:). AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 245 Expresiones Regulares Extendidas (en egrep) Las expresiones regulares extendidas son un lenguaje aún más rico, con las que se pueden hacer búsquedas y comparaciones bastante complejas. Algunos de los comandos de Unix implementan las expresiones regulares básicas, pero algunas otras herramientas implementan las expresiones regulares extendidas (por ejemplo uno que no hemos revisado, sed), pero en especial el comando ya mencionado egrep. A continuación se define la simbología usada en las expresiones regulares extendidas. Un símbolo punto (.) representa un caracter único cualquiera, por ejemplo una letra, un número, un símbolo visible, aún un espacio; excepto un caracter de fin de línea o retorno de carro. Un símbolo asterisco (*) representa una secuencia del caracter o grupo inmediatamente anterior. La secuencia puede tener cero o más caracteres del inmediatemente precedente. Un símbolo interrogación (?) indica que el caracter o ítem inmediatamente anterior puede aparecer cero o una vez, máximo. Un símbolo más (+) indica que el caracter o ítem inmediatamente anterior puede aparecer una o más veces. Un símbolo acento circunflejo (^) si aparece al inicio de una expresión representa un anclaje al inicio de una línea o cadena de texto. Un símbolo pesos ($) si aparece al final de una expresión representa un anclaje al final de una línea o cadena de texto. Una lista de caracteres encerrada en [ ] representa un único caracter cualquiera de la lista de caracteres encerrada. Un rango de caracteres encerrado en [ ] representa un único caracter cualquiera del rango de caracteres encerrado. Un rango de caracteres comienza con un caracter, sigue con un símbolo menos (-), y termina con un caractere numéricamente superior o posterior al que comienza el rango. Una lista de caracteres encerrada en [^ ] representa un único caracter cualquiera que no esté en la lista de caracteres encerrada. Un rango de caracteres encerrado en [^ ] representa un único caracter cualquiera que no esté en el rango de caracteres encerrado. Un rango de caracteres comienza con un caracter, sigue con un símbolo menos (-), y termina con un caractere numéricamente superior o posterior al que comienza el rango. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 246 Los símbolos ., *, $, pierden su significado especial cuando están encerrados dentro de [ ]. El símbolo ^ no tiene el significado especial negativo dentro de [ ] si no es el primer caracter inmediatamente después de [. El símbolo menos (-) que se usa para definir una lista no tiene dicho significado especial dentro de [ ] si está de primero o de último en los caracteres encerrados. Cuando se encierra una parte de la expresión regular entre pares ede paréntess ( ) la parte encerrada se considera una subexpresión, que básicamente se trata como un ítem o elemento único. El símbolo barra vertical (|) dentro de las expresiones regulares extendidas sirve para indicar “alternativas”, de las cuales es posible escoger o concordar con una. Se pueden indicar cuántas repeticiones de un item se permiten o deben darse en una expresión regular si se usa la construcción {min,max} como sufijo de un item. Por ejemplo, a{2,5} indica que se necesita para concordancia un mínimo de dos aes y un máximo de cinco. Si se omite el primer número egrep asume cero (0), si se omite el segundo número no se asume un máximo. Así ? es equivalente a {0,1} o {,1}, + es equivalente a {1,}, y * es equivalente a {0,}. Ejemplos: e@abe:e/> cat Celulares.tsv Alessio Di Mare (311) 688-1162 Carlos Castilla V. (313) 433-7386 Jairo E. Soler (315) 797-1397 Jorge Molina M. (315) 344-8150 Jorge Russo (311) 818-8709 Jorge Valbuena V. (313) 571-6462 Omar Villalba (313) 388-7017 Ramón Barrios Lascar (315)313-7269 Yeimy Fontalvo (300) 817-4126 e@abe:e/> egrep '3.[15]' *.tsv Celulares.tsv:Alessio Di Mare (311) 688-1162 Celulares.tsv:Jairo E. Soler (315) 797-1397 Celulares.tsv:Jorge Molina M. (315) 344-8150 Celulares.tsv:Jorge Russo (311) 818-8709 Celulares.tsv:Ramón Barrios Lascar (315)313-7269 e@abe:e/> egrep '8[^-]' *.tsv Celulares.tsv:Alessio Di Mare (311) 688-1162 Celulares.tsv:Carlos Castilla V. (313) 433-7386 Celulares.tsv:Jorge Molina M. (315) 344-8150 Celulares.tsv:Jorge Russo (311) 818-8709 Celulares.tsv:Omar Villalba (313) 388-7017 Celulares.tsv:Yeimy Fontalvo (300) 817-4126 e@abe:e/> egrep '(^|[^a-zA-Z])[a-zA-Z]{5} ' *.tsv Celulares.tsv:Jairo E. Soler (315) 797-1397 Celulares.tsv:Jorge Molina M. (315) 344-8150 Celulares.tsv:Jorge Russo (311) 818-8709 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 247 Celulares.tsv:Jorge Valbuena V. Celulares.tsv:Yeimy Fontalvo Empresas.tsv:Jairo E. Soler Empresas.tsv:Jorge Molina M. Empresas.tsv:Jorge Russo Empresas.tsv:Jorge Valbuena V. Empresas.tsv:Yeimy Fontalvo (313) 571-6462 (300) 817-4126 Net.Solutions SENA Redsis iKnow El primer caso de los ejemplos simplemente muestra cómo es el archivo Celulares.tsv (usando cat). El segundo caso de los ejemplos usa egrep para buscar números celulares que sean 315 o 310, pero realmente no se fija en el segundo dígito, sólo en el primero y el tercero. Usa un tres (3) literal para la concordancia, luego un punto (.) para indicar “cualquier cosa”, note que no dice “cualquier dígito”, y usa [15], para indicar o un 1 o un 5. El tercer caso usa egrep para buscar los números ocho (8) que no esté seguidos por un menos (-), así que usa una algo artificial construcción 8[^-] es decir “ocho seguido de un caracter que no está en una lista, pero la lista sólo tiene un menos”. El cuarto y último de los casos de ejemplo busca una palabra de cinco letras, sea en mayúsculas o minúsculas; auque la construcción es como artificial se explica enseguida: [azA-Z] significa “una letra minúscula o mayúscula cualquiera”, siendo letra sólo lo válido en inglés. {5} significa “cinco repeticiones de lo inmediatamente anterior”. [a-zA-Z]{5} significa “cinco letras minúsculas o mayúsculas”. [a-zA-Z]{5} significa “cinco letras minúsculas o mayúsculas seguidas de un espacio”. (^|[^a-zA-Z]) significa “inicio de línea o algo que no es letra minúscula o mayúscula”. (^|[^a-zA-Z])[a-zA-Z]{5} significa “cinco letras minúsculas o mayúsculas al comienzo de línea o precedidas de algo que no es letra y seguidas de un espacio”. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 248 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 249 Ordenar líneas de texto: sort 8 1 3 2 4 3 1 4 10 6 sort 5 6 5 7 9 8 2 9 7 10 Quizás después de las búsquedas la operación más necesitada dentro de lo que se denomina “procesamiento de datos” (data processing) es lo que se llama ordenamiento. Es tan profundo el tema que aunque hay diversos algoritmos siempre hay gente trabajando en mejorar los algoritmos. Para ordenar texto columnar en UNIX se incluye un comando obviamente denominado sort. Es un comando sencillo muy potente que puede llegar a consumir -como cualquier rutina de ordenamiento- bastante CPU y bastante RAM. La sintaxis estándar de sort es: sort [ -A ] [ -b ] [ -c ] [ -d ] [ -f ] [ -i ] [ -k Llave ] [ -n ] [ -r ] [ -t separador ] [ -u ] [ archivo ... ] Donde: Los símbolos [ y ] indican que las opciones y los argumentos son opcionales, no hacen parte de la sintaxis. A sort pueden dársele cero o más archivos. Si no se le dan archivos sort lee la entrada estándar. La opción A indica a sort que debe usar únicamente los valores ASCII de los caracteres para hacer el ordenamiento. La opción b indica a sort que debe ignorar los espacios y tabuladores para buscar la primera o última columna de un campo. La opción c se usa para que sort no ordene, sólo reportará verdadero o falso, indicando si los archivos de entrada están ya ordenados según indiquen las opciones. Como siempre, el valor verdadero en el intérprete de comandos shell es un código de retorno cero (0). AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 250 La opción d se usa para que sort ordene según diccionario. En estos ordenamientos sólo se tienen en cuenta las letras, números y espacios. La opción f indica a sort que debe pasar todas las letras a comparar a mayúsculas. La opción i se usa para que sort ignore todo caracter no visible en las comparaciones. La opción k es la más importante ya que con la misma se define la llave de ordenamiento. Esta opción puede usarse múltiples veces. La opción k necesita una definición de campos y columnas así: [inicioCampo[.inicioColumna]][ModifInic][,[finCampo[.finColumna]]ModifFin]] Donde la llave inicia con un campo (dado el número inicioCampo), posiblemente en un caracter de ese campo (dado el número inicioColumna), tal vez con algún modificador (dado ModifInic). La llave termina con un campo (dado el número finCampo), posiblemente en un caracter de ese campo (dado el número finColumna), tal vez con un modificador (dado ModifFin). Los modificadores son los b, c, f, n, i, r, con el mismo significado que las opciones de la mismas letras. La opción n se usa para que sort haga un ordenamiento numérico. Los campos pueden tener espacios o tabuladores iniciales, pueden tener signos, decimales o radicales. La opción r se usa para que sort haga un ordenamiento en orden inverso, según digan las otras opciones. La opción t se usa para indicar a sort cuál es el separador de campo. La opción u (unique) indica a sort que debe reportar sólo una de las líneas iguales según la llave de ordenamiento. Ejemplos: e@abe:e/> cat Empresas.tsv Alessio Di Mare Redsis Jairo E. Soler Net.Solutions Jorge Molina M. SENA Jorge Russo Redsis Jorge Valbuena V. iKnow Ramón Barrios Lascar iKnow Yasser Barrios Lascar SupraImpresores Yeimy Fontalvo Se muestra en este caso simplemente cómo son los contenidos del archivo Empresas.tsv. e@abe:e/> sort -c Empresas.tsv && echo "Empresas.tsv está ordenado!" Empresas.tsv está ordenado! AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 251 Se usa la opción c en este segundo caso para decir a sort que revise si el archivo Empresas.tsv está ordenado. Como no muestra salida deberán usarse las facilidades del shell para revisar el código de retorno. e@abe:e/> sort -rA Empresas.tsv Yeimy Fontalvo Yasser Barrios Lascar SupraImpresores Ramón Barrios Lascar iKnow Jorge Valbuena V. iKnow Jorge Russo Redsis Jorge Molina M. SENA Jairo E. Soler Net.Solutions Alessio Di Mare Redsis En este tercer caso se usa la opción r para que el ordenamiento sea inverso. Se usó la opción A para que el ordenamiento no use la definición del idioma del Unix donde sort está corriendo. e@abe:e/> sort -t' ' -k 2 Empresas.tsv Yeimy Fontalvo Jairo E. Soler Net.Solutions Alessio Di Mare Redsis Jorge Russo Redsis Jorge Molina M. SENA Yasser Barrios Lascar SupraImpresores Jorge Valbuena V. iKnow Ramón Barrios Lascar iKnow En este cuarto caso se define que el separador de campos es un caracter tabulador, y se define como llave de ordenamiento la columna 2 (según el separador definido). Se nota como sort ordena primero las columnas en blanco, luego las columnas que inician en mayúscula y luego las columnas que inician en minúscula. e@abe:e/> sort -f -t' ' -k 2 Empresas.tsv Yeimy Fontalvo Jorge Valbuena V. iKnow Ramón Barrios Lascar iKnow Jairo E. Soler Net.Solutions Alessio Di Mare Redsis Jorge Russo Redsis Jorge Molina M. SENA Yasser Barrios Lascar SupraImpresores En este quinto caso se define que el separador de campos es un caracter tabulador, y se define como llave de ordenamiento la columna 2 (según el separador definido), también se indica usando la opción f que deben convertirse a mayúsculas las minúsculas antes de las comparaciones. Se nota como ordena primero las columnas en blanco, luego un ordenamiento alfabético, sin importar las minúsculas o mayúsculas. e@abe:e/> sort -f -t' Yeimy Fontalvo ' -k 2 -u Empresas.tsv AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 252 Jorge Valbuena V. iKnow Jairo E. Soler Net.Solutions Alessio Di Mare Redsis Jorge Molina M. SENA Yasser Barrios Lascar SupraImpresores En este sexto caso se muestra el resultado de la opción u. Sólo se diferencia del caso quinto en la inclusión de la opción u. En este caso se hace que sort sólo muestre la primera de las líneas que incluya el campo que se usa como llave de ordenamiento. e@abe:e/> sort -t' ' -k1.2 Empresas.tsv Jairo E. Soler Net.Solutions Ramón Barrios Lascar iKnow Yasser Barrios Lascar SupraImpresores Yeimy Fontalvo Alessio Di Mare Redsis Jorge Molina M. SENA Jorge Russo Redsis Jorge Valbuena V. iKnow En este caso séptimo se hace un ordenamiento usando la segunda letra del primer campo (k1.2) , definiendo de paso que el separador de campos es un caracter tabulador. e@abe:e/> cat Numeros.txt 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 El caso octavo simplemente muestra los contenidos de un nuevo archivo Numeros.txt usando cat. e@abe:e/> sort Numeros.txt 1 10 11 12 13 14 15 2 3 4 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 253 5 6 7 8 9 El caso noveno muestra cómo el ordenamiento predeterminado de sort no es el adecuado para números de longitud variable. e@abe:e/> sort -n Numeros.txt 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 El caso décimo muestra cómo la opción n es lo comúnmente más adecuado cuando sort tiene que comparar campos numéricos para hacer un ordenado. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 254 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 255 Transliterar caracteres: tr password p455w0rd tr A veces es necesario reemplazar -o eliminar- caracteres individuales de un texto. Para esta operación sencilla se usa el comando estándar tr (transliterate) que lee de la entrada estándar, reemplaza unos caracteres individuales por otros y el resultado lo genera en la salida estándar. La sintaxis del comando sencillo tr es: tr [ -c | -cds | -cs | -C | -Cds | -Cs | -ds | caracteres2 -s ] [ -A ] caracteres1 o también tr { -cd | -cs | -Cd | -Cs | -d | -s } [ -A ] caracteres Donde: Los símbolos [ y ] indican que las opciones y los argumentos son opcionales, no hacen parte de la sintaxis. Si se dan dos cadenas de caracteres como argumentos no es obligatorio dar alguna opción. Los símbolos { y } indican que las opciones y los argumentos son opcionales, no hacen parte de la sintaxis. Si se dan una cadena de caracteres como argumento es obligatorio dar alguna opción. El símbolo | indica “posibilidad”, se usa para mostrar las posibles opciones, no hace parte de la sintaxis. A tr pueden dársele una o dos cadenas -secuencias- de caracteres. Como tr entiende un subconjunto de las expresiones regulares extendidas las cadenas deberían estar encerradas entre ‘ ‘. La opción A se usa para indicar que tr debe usar ordenamiento puramente ASCII cuando se le den rangos de caracteres, no debe tener en cuenta los ordenamientos según el idioma en que está funcionando el UNIX donde corre. La opción C se usa para indicar que tr no debe tomar el valor de la cadena caracteres1 si no que debe tomar el valor del complemento de caracteres1. El complemento se define como los otros caracteres que componen el conjunto nacional según el idioma definido por la variable de ambiente LC_COLLATE. La opción c se usa para indicar que tr no debe tomar el valor de la cadena de caracteres1 si no que debe tomar del valor del complemento de caracteres1. El complemento se define como los otros caracteres que componen el juego de caracteres ASCII. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 256 La opción d hace que tr no reemplace caracteres si no que elimine caracteres al copiar la entrada estándar a la salida estándar. Cuando se usa junto con la opción c o la opción C no elimina de la entrada estándar los caracteres de caracteres1 si no los caracteres que no están en caracteres1. La opción s hace que tr reemplace toda una secuencia de caracteres por el primero de la secuencia (dados por caracteres1). Cuando se dan dos argumentos junto con la opción s se reemplazará toda una secuencia de caracteres (dados por caracteres1) por un caracter (tomado de caracteres2). Los valores en caracteres1 y caracteres2 pueden ser: un texto literal alfanumérico; o c1-c2, donde c1 aparece primero que c2 en el ordenamiento de texto según el idioma del UNIX donde se ejecuta tr; [C*número], equivalente a la repetición número veces del caracter C; [C*] cuando se usa en caracteres2 para hacer que esta secuencia de caracteres tenga la misma longitud que caracteres1; [:clase:] especifica uno cualquiera de todos los caracteres contenidos en una clase de alnum, alpha, blank, cntrl, digit, graph, lower, print, punct, space, upper, xdigit; [=C=] especifica uno cualquiera de todos los caracteres de una clase de caracteres idiomática, así en español [=e=] incluye e y é; \CarControl especifica un caracter de control de alert (\a), backspace (\b), form feed (\f), new line (\n), carriage return (\r), tab (\t), vertical tab (\v), backslash (\\); o un [ literal con \[ o un menos (-) literal con \-. Ejemplos: e@abe:e/> cat Celulares.tsv Alessio Di Mare (311) 688-1162 Carlos Castilla V. (313) 433-7386 Jairo E. Soler (315) 797-1397 Jorge Molina M. (315) 344-8150 Jorge Russo (311) 818-8709 Jorge Valbuena V. (313) 571-6462 Omar Villalba (313) 388-7017 Ramón Barrios Lascar (315)313-7269 Yeimy Fontalvo (300) 817-4126 En este primer caso simplemente se muestran los contenidos del archivo Celulares.tsv usando el comando cat. e@abe:e/> tr -d 3 < Celulares.tsv Alessio Di Mare (11) 688-1162 Carlos Castilla V. (1) 4-786 Jairo E. Soler (15) 797-197 Jorge Molina M. (15) 44-8150 Jorge Russo (11) 818-8709 Jorge Valbuena V. (1) 571-6462 Omar Villalba (1) 88-7017 Ramón Barrios Lascar (15)1-7269 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 257 Yeimy Fontalvo (00) 817-4126 En este segundo caso de los ejemplos se muestra primero el uso adecuado de tr: No lee archivos, únicamente lee de la entrada estándar. Se usa la opción d para indicar que tr debe buscar el caracter 3 y no incluirlo en la salida. e@abe:e/> tr -d 83 < Celulares.tsv Alessio Di Mare (11) 6-1162 Carlos Castilla V. (1) 4-76 Jairo E. Soler (15) 797-197 Jorge Molina M. (15) 44-150 Jorge Russo (11) 1-709 Jorge Valbuena V. (1) 571-6462 Omar Villalba (1) -7017 Ramón Barrios Lascar (15)1-7269 Yeimy Fontalvo (00) 17-4126 En este tercer caso de los ejemplos se usa la opción d con una cadena de dos caracteres, lo que indica que debe borrar de la salida cualquier aparición de cualquiera de los dos caracteres, aunque la cadena completa 83 no aparece en le texto origen. tr toma los caracteres individuales. e@abe:e/> tr '0123456789' 'OI2EAS6TB9' < Celulares.tsv Alessio Di Mare (EII) 6BB-II62 Carlos Castilla V. (EIE) AEE-TEB6 Jairo E. Soler (EIS) T9T-IE9T Jorge Molina M. (EIS) EAA-BISO Jorge Russo (EII) BIB-BTO9 Jorge Valbuena V. (EIE) STI-6A62 Omar Villalba (EIE) EBB-TOIT Ramón Barrios Lascar (EIS)EIE-T269 Yeimy Fontalvo (EOO) BIT-AI26 En este cuarto caso de los ejemplos se usan dos argumentos de igual longitud, así cada vez que se encuentre en la entrada el primer caracter del argumento1 se reemplaza por el primer caracter del argumento2 en la salida (0 se reemplaza por O), cada vez que se encuentre en la entrada el segundo caracter del argumento1 se reemplaza por el segundo caracter del argumento2 (1 se reemplaza por I), y así. e@abe:e/> tr '[:lower:]' '[:upper:]' < Celulares.tsv ALESSIO DI MARE (311) 688-1162 CARLOS CASTILLA V. (313) 433-7386 JAIRO E. SOLER (315) 797-1397 JORGE MOLINA M. (315) 344-8150 JORGE RUSSO (311) 818-8709 JORGE VALBUENA V. (313) 571-6462 OMAR VILLALBA (313) 388-7017 RAMÓN BARRIOS LASCAR (315)313-7269 YEIMY FONTALVO (300) 817-4126 En este quinto caso de los ejemplos se usan clases de caracteres para que tr reemplace los caracteres en minúsculas en la entrada por los equivalentes en mayúsculas en la salida. tr no AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 258 “conoce” las mayúsculas adecuadas de cada caracter en minúsculas. Pero la a minúscula aparece en la clase :lower: en la misma posición que la A mayúscula aparece en la clase :upper:. e@abe:e/> tr '[:digit:]' 'abcde' < Celulares.tsv Alessio Di Mare (dbb) 688-bb6c Carlos Castilla V. (dbd) edd-7d86 Jairo E. Soler (db5) 797-bd97 Jorge Molina M. (db5) dee-8b5a Jorge Russo (dbb) 8b8-87a9 Jorge Valbuena V. (dbd) 57b-6e6c Omar Villalba (dbd) d88-7ab7 Ramón Barrios Lascar (db5)dbd-7c69 Yeimy Fontalvo (daa) 8b7-ebc6 e@abe:e/> tr '[:digit:]' 'abcde*' < Celulares.tsv Alessio Di Mare (dbb) 688-bb6c Carlos Castilla V. (dbd) edd-7d86 Jairo E. Soler (db*) 797-bd97 Jorge Molina M. (db*) dee-8b*a Jorge Russo (dbb) 8b8-87a9 Jorge Valbuena V. (dbd) *7b-6e6c Omar Villalba (dbd) d88-7ab7 Ramón Barrios Lascar (db*)dbd-7c69 Yeimy Fontalvo (daa) 8b7-ebc6 En estos dos casos se muestra cómo funciona tr cuando la segunda secuencia de caracteres de los argumentos es más corta que la primera: sólo una parte de la clase -en los ejemploses reemplazada en la salida. e@abe:e/> tr '[:digit:]' 'abcd[e*]' < Celulares.tsv Alessio Di Mare (dbb) eee-bbec Carlos Castilla V. (dbd) edd-edee Jairo E. Soler (dbe) eee-bdee Jorge Molina M. (dbe) dee-ebea Jorge Russo (dbb) ebe-eeae Jorge Valbuena V. (dbd) eeb-eeec Omar Villalba (dbd) dee-eabe Ramón Barrios Lascar (dbe)dbd-ecee Yeimy Fontalvo (daa) ebe-ebce Es este otro caso se usa [C*] para que la segunda cadena de caracteres de los argumentos tenga la misma longitud de la primera, repitiéndo los últimos caracteres las veces que sea necesario. e@abe:e/> tr -s '[:digit:]' < Celulares.tsv Alessio Di Mare (31) 68-162 Carlos Castilla V. (313) 43-7386 Jairo E. Soler (315) 797-1397 Jorge Molina M. (315) 34-8150 Jorge Russo (31) 818-8709 Jorge Valbuena V. (313) 571-6462 Omar Villalba (313) 38-7017 Ramón Barrios Lascar (315)313-7269 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 259 Yeimy Fontalvo (30) 817-4126 Este otro caso muestra cómo hacer que los caracteres que se repitan en de la cadena de los argumentos en la entrada sean reemplazados por sólo uno en la salida, usando la opción s (squeeze) del comando tr. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 260 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 261 Utilidades avanzadas de archivos y directorios Utilidades, más utilidades Aunque en la línea de comandos del intérprete shell de UNIX hay unas tareas u operaciones que son más difíciles de hacer que en la interfaz gráfica cuando sólo hay que hacerlas o repetirlas una o dos veces, la mayoría de las tareas que haya que repetir muchas veces es muchísimo más fácil y rápido hacerlas combinando comandos. Así un UNIX típico o estándar incluye muchos, muchísimos comandos para todo. Como la entidad central que contiene datos en un UNIX es el archivo, la mayoría de los comandos de UNIX operan sobre archivos. En este apartado trataremos algunos de los muchos comandos necesarios para hacer operaciones sobre archivos, en especial sobre múltiples archivos. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 262 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 263 Búsqueda de archivos: find Dentro de toda la cantidad de herramientas con las que cuenta un operador Unix hay una que tienen reconocimiento especial ya que se le denomina “la navaja suiza del administrador UNIX”, esta herramienta lleva el nombre de find. El comando find navega recursivamente árboles de directorios y selecciona archivos y directorios según una serie de criterios que se le den, a los archivos y directorios seleccionados puede hacerle una serie de acciones que indique quien lo invoca. La sintaxis general de find es muy sencilla: find directorio ... -criterio ... -acción ... Donde: Sólo directorio es obligatorio según el estándar POSIX. En algunos sistemas UNIX ni un directorio como argumento es obligatorio, asumiendo en este caso el directorio actual. Pueden darse uno o más directorios, usando rutas relativas o absolutas. Como cada directorio es un argumento, deberán separarse por espacios como todo argumento en el shell -realmente deben separarse por $IFS-. find navega recursivamente -usando método infijo- cada uno de los directorios que se den como argumento. find no sigue los enlaces simbólicos. Los criterios son “de selección”, que indican cuáles de los archivos y directorios se seleccionarán para realizar en ellos, uno a uno las acciones. Como el criterio predeterminado es “todos” si no se da un criterio de selección find llevará a cabo las acciones para todos y cada uno de los archivos y directorios encontrados al navegar recursivamente cada uno de los directorios argumento. Las acciones indican qué hay que hacer con cada uno de los archivos y directorios seleccionados al navegar recursivamente los directorios iniciales dados, según los criterios de selección dados. La acción predeterminada, cuando no se dan las acciones es -print. Criterios de selección en find El comando find tiene muchísimos criterios posibles de selección, que, como se pueden observar, no necesitan de abrir o leer los archivos para revisar sus contenidos, porque todos usan los atributos externos visibles o legibles. Como ya se mencionó, el criterio predeterminado en find es “todos”. Los criterios se listan a continuación: ‣ Criterio -inum númeroInodo evalúa verdadero si el archivo o directorio que se está evaluando tiene númeroInodo como su inodo en disco. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 264 ‣ Critero -type tipo evalúa verdadero si el tipo de lo que se está evaluando -según los contenidos de su inodo- concuerdan. Los tipos son f (archivo), d (directorio), l (enlace simbólico), p (tubería), s (socket), b (dispositivo de bloque), c (dispositivo de caracter). ‣ Criterio -links número evalúa verdadero si el archivo o directorio que se está evaluando tiene el número exacto de nombres o enlaces fuertes. El criterio links -número evalúa verdadero si el archivo o directorio que se está evaluando tiene menos nombres o enlaces que número. El criterio -links +número evalúa verdadero si el archivo o directorio que se está evaluando tiene más nombres o enlaces que número. ‣ Criterio -user unUsuario evalúa verdadero si el archivo o directorio que se está evaluando tiene como propietario a unUsuario. El criterio -user puede ser usado con un número como parámetro si es un entero y no se resuelve como usuario en el sistema. ‣ Criterio -nouser evalúa verdadero si el archivo o directorio que se está evaluando tiene como propietario algo que no puede ser resuelto en el sistema no tiene un dueño válido definido-. ‣ Criterio -group unGrupo evalúa como verdadero si el archivo o directorio tiene como grupo a unGrupo. El criterio -group puede ser usado con un número como parámetro si es un entero y no se resuelve como grupo en el sistema. ‣ Criterio -nogroup evalúa verdadero si el archivo o directorio tiene como grupo algo que no puede ser resuelto en el sistema -no tiene un grupo válido definido-. ‣ Criterio -perms númeroOctal evalúa verdadero si el archivo o directorio tiene exactamente los permisos númeroOctal. El criterio -perms -númeroOctal evalúa verdadero si el archivo o directorio tiene activos al menos los permisos equivalentes a númeroOctal. ‣ Criterio -perms modo evalúa verdadero si el archivo o directorio tiene exactamente los permisos modo, como se usan en el comando chmod. El criterio perms -modo evalúa verdadero si el archivo o directorio tiene activos al menos los permisos que están en modo como se usan en el comando chmod. ‣ Criterio -size bloques evalúa verdadero si el tamaño del archivo o directorio cuando se redondea a bloques de 512 bytes -redondeo hacia arriba- es igual a bloques. El criterio -size -bloques evalúa verdadero si el tamaño del archivo o directorio cuando se redondea a bloques de 512 bytes -redondeo hacia arriba- es menor que bloques. El criterio -size +bloques evalúa verdadero si el tamaño AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 265 del archivo o directorio cuando se redondea a bloques de 512 bytes -redondeo hacia arriba- es mayor que bloques. ‣ Criterio -size bytesc evalúa verdadero si el tamaño del archivo o directorio es exactamente bytes Bytes. El criterio -size -bytesc evalúa verdadero si el tamaño del archivo o directorio es menor que bytes Bytes. El criterio -size +bytesc evalúa verdadero si el tamaño del archivo o directorio es mayor que bytes Bytes. ‣ Criterio -atime n evalúa verdadero si el tiempo de acceso del archivo o directorio menos el momento actual dividido entre 86400 (descartando residuos) es n. Note que 86400 segundos son 24 horas. Si el UNIX donde se use find no cumple con UNIX03 entonces -atime n evalúa verdadero si el tiempo de último uso del archivo o directorio está entre n-1 y n múltiplos de 24 horas. ‣ Criterio -ctime n evalúa verdadero si el tiempo de cambio de inodo del archivo o directorio menos el momento actual dividido entre 86400 (descartando residuos) es n. Note que 86400 segundos son 24 horas. Si el UNIX donde se use find no cumple con UNIX03 entonces -ctime n evalúa verdadero si el tiempo de cambio de inodo del archivo o directorio está entre n-1 y n múltiplos de 24 horas. ‣ Criterio -mtime n evalúa verdadero si el tiempo de modificación del archivo o directorio menos el momento actual dividido entre 86400 (descartando residuos) es n. Note que 86400 segundos son 24 horas. Si el UNIX donde se use find no cumple con UNIX03 entonces -mtime n evalúa verdadero si el tiempo de modificación del archivo o directorio está entre n-1 y n múltiplos de 24 horas. ‣ Criterio -amin n evalúa verdadero si el tiempo de acceso del archivo o directorio está entre n y n-1 minutos. El criterio -amin -n evalúa verdadero si el tiempo de acceso del archivo o directorio es menor a n minutos. El criterio -amin +n evalúa verdadero si el tiempo de acceso del archivo o directorio es mayor a n minutos. ‣ Criterio -cmin n evalúa verdadero si el tiempo del último cambio del inodo del archivo o directorio está entre n y n-1 minutos. El criterio -cmin -n evalúa verdadero si el tiempo del último cambio del inodo del archivo o directorio es menor a n minutos. El criterio -cmin +n evalúa verdadero si el tiempo del último cambio del inodo del archivo o directorio es mayor a n minutos. ‣ Criterio -mmin n evalúa verdadero si el tiempo de modificación del archivo o directorio está entre n y n-1 minutos. El criterio -mmin -n evalúa verdadero si el tiempo de modificación del archivo o directorio es menor a n minutos. El criterio -mmin +n evalúa verdadero si el tiempo de modificación del archivo o directorio es mayor a n minutos. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 266 ‣ Criterio -newer archivo evalúa verdadero si el tiempo de modificación del archivo o directorio es posterior al de modificación del archivo de referencia dado como archivo. ‣ Criterio -name ‘especificación’ evalúa verdadero si el archivo o directorio lleva por nombre o su nombre cumple con la evaluación de shell ‘especificación’. Oficialmente especificación no va entre comillas sencillas, pero como se usan los mismos comodines que en el shell lo común es evitar que éste último los interprete encerrándolos en comillas sencillas ‘ ‘. ‣ “Criterio” -depth hace que find navegue recursivamente los directorios a la manera posfija, evaluando primero los contenidos de los directorios, antes que el directorio mismo. ‣ Criterio -fstype tipoFs evalúa verdadero si el archivo o directorio está contenido en un sistema de archivos de tipo tipoFs. ‣ Criterio -prune evalúa siempre verdadero. Hace que find detenga la recursividad si el argumento como parámetro es un directorio. ‣ “Criterio” -xdev hace que find navegue recursivamente sin cambiarse de sistema de archivos y se mantenga en el mismo sistema de archivos que cada uno de los parámetros. Acciones en find El comando find tiene muchas menos acciones que criterios. Acciones son “lo que puede hacer find con cada uno de los archivos o directorios seleccionados”. La acción predeterminada -cuando no se indican acciones- en find es -print. Las acciones se listan a continuación: ‣ La acción -print hace que find reporte en la salida estándar los nombres de los archivos o directorios que va seleccionando. Si el argumento de directorio inicial está dado como una ruta absoluta -print listará nombres como rutas absolutas, de lo contrario usará nombres como rutas relativas. ‣ La acción -ls hace que find reporte en la salida estándar los nombres de los archivos o directorios que va seleccionado, con detalles adicionales. Si el argumento de directorio inicial está dado como una ruta absoluta -ls listará nombres como rutas absolutas, de lo contrario usará nombres como rutas relativas. El comando find reporta, en orden, el número de inodo, el tamaño en Kilobytes, los permisos, el número de nombres, el usuario, el grupo, el tamaño en Bytes, el tiempo de última modificación y el nombre. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 267 ‣ La acción -exec ComandoCompleto hace que find ejecute ComandoCompleto con cada archivo seleccionado. ComandoCompleto debería terminar en \; o ‘;‘ para evitar la interpretación del shell. Si dentro de ComandoCompleto se encuentra el par {} el comando find reemplazará el nombre del archivo o directorio seleccionado para hacer la ejecución del comando. Devuelve verdadero si ComandoCompleto pudo ejecutarse y terminó con código de retorno cero (0) por lo que puede usarse como un criterio. ‣ La acción -ok ComandoCompleto hace que find pregunte si ejecuta ComandoCompleto para cada archivo seleccionado. ComandoCompleto debería terminar en \; o ‘;‘ para evitar la interpretación del shell. Si dentro de ComandoCompleto se encuentra el par {} el comando find reemplazará el nombre del archivo o directorio seleccionado para hacer la ejecución del comando. Devuelve verdadero si ComandoCompleto pudo ejecutarse y terminó con código de retorno cero (0) por lo que puede usarse como un criterio. Operadores lógicos en find Además de tener infinidad de criterios de selección y acciones sobre los archivos y directorios seleccionados, find tiene operadores lógicos, que permiten combinar los criterios de selección. Se tienen: ‣ Operador lógico -a (AND). Evalúa a verdadero si ambos criterios (el de antes de -a y el de después de -a) evalúan a verdadero. El segundo criterio nunca ejecuta si el primero evalúa a falso. ‣ Operador lógico -o (OR). Evalúa a verdadero si alguno de los criterios (el de antes de -o y el de después de -o) evalúa a verdadero. El segundo criterio nunca ejecuta si el primero evalúa a verdadero. ‣ Operador lógico ! (NOT). Evalúa a verdadero si el criterio que le sigue evalúa a falso. ‣ Paréntesis de agrupación \( y \). Ejemplos: e@abe:e/> find . . ./.profile ./.sh_history ./procesos.txt ./actual.txt ./dato viejo ./LitteFile ./.ssh ./ramon.txt ./MadRamon 1.png AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 268 ./.Xauthority ./subdir1 ./subdir1/Antiguo_SubDir ./subdir1/MadRamon 1.png ./subdir1/smit.log ./subdir1/LitteFile ./nuevoArchiv2.txt ./fechaActual.txt ./NuevoVacio.txt ./archivoAB.txt ./archivoA.txt ./fileA.txt ./fileA.c ... Este primer caso de los ejemplos simplemente muestra cómo listar recursivamente una estructura de árbol en UNIX usando find. Sólo se le da un directorio inicial, en este caso el actual (.). e@abe:e/> find . -ls 64 4 drwxr-xr-x 65 1 -rw-r--r-66 9 -rw------182 3 -rw-r--r-67 1 -rw-r--r-177 1 -rw-r--r-72 0 -rw-r--r-4 1 drwxr-xr-x 183 1 -rw-r----180 18 -rw-r--r-185 1 -rw------12288 1 drwxr-xr-x 12352 1 drwxr-xr-x Antiguo_SubDir 12289 18 -rw-r--r-MadRamon 1.png 12290 10 -rw-r--r-smit.log 12291 0 -rw-r--r-LitteFile 68 1 -rw-r--r-nuevoArchiv2.txt 4 1 1 1 1 1 1 2 1 1 1 3 2 e root e e e e e e e e e e e system system system system system system system system system system system system system 4096 248 8770 2413 29 29 0 256 760 17804 147 256 256 Sep Apr Sep Aug Aug Aug Aug Aug Aug Aug Aug Aug Aug 16 11 18 18 16 14 14 14 18 14 19 16 15 20:34 08:53 09:23 21:40 23:02 23:15 23:15 19:18 23:09 23:16 17:02 17:37 21:05 . ./.profile ./.sh_history ./procesos.txt ./actual.txt ./dato viejo ./LitteFile ./.ssh ./ramon.txt ./MadRamon 1.png ./.Xauthority ./subdir1 ./subdir1/ 1 e system 17804 Aug 16 17:37 ./subdir1/ 1 e system 10181 Aug 16 17:37 ./subdir1/ 1 e system 0 Aug 16 17:37 ./subdir1/ 1 e system 1 Aug 18 21:31 ./ ... En este segundo caso de los ejemplos se nota el uso de la acción -ls que incluye los detalles de los archivos seleccionados, como se mencionó en las notas acerca del comando. Como no se da un criterio de selección, el comando find muestra todos los archivos y directorios del inicial hacia abajo (recursivamente). e@abe:e/> find . -inum 211 -ls 211 1 -rw-r--r-- 1 e system AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 31 Sep 14 09:13 ./Romanos.txt 269 Este tercer caso de los ejemplos muestra el uso de la opción de selección -inum que selecciona un archivo o directorio dado su número de inodo -único por sistema de archivos-. e@abe:e/> find . -type d -print . ./.ssh ./subdir1 ./subdir1/Antiguo_SubDir Este cuarto caso muestra el uso de la opción de selección -type, que con el argumento d hace que find sólo seleccione los directorios. También se agrega la opción de acción -print que muestra los nombres de lo seleccionado. Como es la acción predeterminada en esta situación no cambia para nada la salida del comando find. e@abe:e/> find . -perm 64 4 drwxr-xr-x 4 1 drwxr-xr-x 12288 1 drwxr-xr-x 12352 1 drwxr-xr-x Antiguo_SubDir -111 -ls 4 e 2 e 3 e 2 e system system system system 4096 256 256 256 Sep Aug Aug Aug 16 14 16 15 20:34 19:18 17:37 21:05 . ./.ssh ./subdir1 ./subdir1/ ... Este quinto caso de los ejemplos muestra el uso de la opción de selección -perm, que cuando se le da un número debe ser octal, y si se le da con un símbolo menos (-) asumirá “al menos estos permisos, tal vez otros adicionales”. Como se le da 111 el comando find entiende --x--x--x, que con el menos (-) asume “que al menos tenga --x--x--x”. Lista con detalles lo seleccionado y se nota que éstos sí cumplen con el criterio. e@abe:e/> find /tmp /home -links +2 /tmp /tmp/bos find: 0652-081 cannot change directory : The file access permissions do not find: 0652-081 cannot change directory : The file access permissions do not /tmp/vgdata /tmp/ejemplo /home find: 0652-081 cannot change directory : The file access permissions do not to </tmp/lost+found>: allow the specified action. to </tmp/wsmdata.196726>: allow the specified action. to </home/lost+found>: allow the specified action. ... El sexto caso de los ejemplos muestra cómo cuando un usuario usa find, el comando no puede ir donde el usuario manualmente no puede ir (usando cd). En este caso se muestra cómo usar dos directorios para iniciar una búsqueda (simplemente separándolos con espacios), y cómo buscar según el número de nombres (en este caso los que tengan más de dos nombres). AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 270 e@abe:e/> find /tmp /home -links +2 2> /dev/null /tmp /tmp/bos /tmp/vgdata /tmp/ejemplo /home /home/e /home/e/subdir1 /home/j /home/ldapdb2 /home/ldapdb2/sqllib /home/ldapdb2/sqllib/function /home/ldapdb2/sqllib/spmlog /home/ldapdb2/ldapdb2 /home/ldapdb2/ldapdb2/NODE0000 /home/ldapdb2/ldapdb2/NODE0000/SQL00001 ... El séptimo caso de los ejemplos muestra cómo cuando un usuario usa find, el comando no puede ir donde el usuario manualmente no puede ir (usando cd). Para evitar la mezcolanza de lo reportado por find con los mensajes de error se usa redirección, se mandan los mensajes de error al “archivo” /dev/null. e@abe:e/> find /tmp /home ! -user e -ls 2> /dev/null 2 8 drwxrwxrwt 10 bin bin 8192 10 1 drwxr-xr-x 2 root system 256 tmp/.oslevel.datafiles 11 0 -rw-r--r-- 1 root system 0 tmp/.oslevel.datafiles/.oslevel.hold 26 1 -rw-r--r-- 1 root system 62 tmp/.oslevel.datafiles/.oslevel.mlinfo.cache 29 1 -rw-r--r-- 1 root system 5 tmp/.oslevel.datafiles/.oslevel.cache.sum 52 3 -rw-r--r-- 1 root system 3068 tmp/.ctinst.log 106 13 -rwxr--r-- 1 test02 testgrp1 12292 tmp/.DS_Store 120 1 -rw-r--r-- 1 root system 406 tmp/.sr_migrate.log 4 0 -rw------- 1 root system 0 tmp/.strload.mutex 14 49 -rw-r--r-- 1 root system 49464 tmp/.tmpfile.123028 23 1 -rw-r--r-- 1 root system 29 File1.txt 17 4 -rw-r--r-- 1 root system 3584 tlist159808 8 0 -rw-r----- 1 root system 0 Spmi_shm_hook 18 888 -rw-r----- 1 root system 909172 client-2.2.7-4.aix4.3.ppc.rpm Sep 18 09:22 /tmp Aug 9 13:15 / Apr 10 13:18 / Aug 9 12:33 / Aug 9 12:33 / Aug 17 10:37 / Aug 9 23:56 / Apr 10 08:47 / Apr 10 11:05 / Apr 10 15:41 / Aug 9 10:42 /tmp/ Apr 13 00:38 /tmp/ Apr 10 20:48 /tmp/ Aug 9 11:55 /tmp/samba- ... AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 271 En este octavo caso de los ejemplos se usa find con un operador lógico NOT (el símbolo !), donde unido con -user e indicia “seleccionar los que su dueño no es e”, como tal vez no pueda entrar a buscar en ciertos directorios, los mensajes de error se redireccionan a /dev/null (con 2>). e@abe:e/> find /home -size +10 find: 0652-081 cannot change directory to </home/lost+found>: : The file access permissions do not allow the specified action. /home/e/.sh_history /home/e/MadRamon 1.png /home/e/subdir1/MadRamon 1.png /home/e/subdir1/smit.log /home/e/ibmserver2-lslpp-L.txt find: 0652-081 cannot change directory to </home/j/.ssh>: : The file access permissions do not allow the specified action. /home/ldapdb2/sqllib/db2dump/db2diag.log /home/ldapdb2/sqllib/db2dump/ldapdb2.nfy ... En este noveno caso de los ejemplos se muestra el uso de la opción de selección -size. Con ésta se dice a find que seleccione los archivos que miden más de 5KB (10 bloques de 512B). El comando reporta que no pudo entra a algunos subdirectorios del inicial /home. e@abe:e/> find /home -mtime -1 -ls 2> /dev/null 66 9 -rw------- 1 e system e/.sh_history 9166 Sep 18 09:29 /home/ En el décimo caso se le dice a find que seleccione los archivos -o directorios- debajo de / home que han sido modificados hace menos de un día (con la opción de selección -mtime -1), que les liste los detalles (con la acción -ls), y los mensajes de error los mandamos al archivo /dev/null. e@abe:e/>find /home -type f -a -user e -ok rm {} \; find: 0652-081 cannot change directory to </home/lost+found>: : The file access permissions do not allow the specified action. rm /home/e/.sh_history (?) n rm /home/e/dato viejo (?) y rm /home/e/LitteFile (?) ... En el caso once de los ejemplos se le dice a el comando find que seleccione los archivos que cumplen dos criterios: que sean de tipo f (es decir que sean archivos), usando el criterio de selección -type f y (AND) que tengan como dueño al usuario e. Con cada uno de los seleccionados deberá ejecutar un rm, pero deberá preguntar antes de ejecutar, para ello usando la acción -ok rm {} \;. Se nota cómo find reemplaza el nombre de lo encontrado o seleccionado en la posición donde está el par de símbolos {} en el comando armado para la acción -ok. Se nota también cómo \; pertenece a la sintaxis pero no se usa a la hora de ejecutar el comando. Se nota finalmente cómo es la pregunta que find hace, y cómo se AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 272 puede responder usando y -para dar un sí y que find ejecute el comando que armó-, o usando otra cosa -en los ejemplos n- para que find no ejecute el comando que armó. Ejemplo Especial: Para buscar los archivos que cuyo nombre tiene alguna característica y que contienen cierto texto se usa: find /directorio/inicial -name ‘*.extensión’ | xargs grep -l ‘texto a buscar’ Esta construcción ubica simplemente los archivos a los que “amerita” revisarles sus contenidos (usando el comando find, que no revisa contenidos), y luego de ubicados se los pasa a grep que los abre y sí revisa línea por línea para verificar si dentro de los contenidos se encuentra el texto a buscar (grep abre y revisa los contenidos, pero no ubica los archivos). Esta construcción reporta el nombre de cada archivo que contenga el “texto a buscar”, y la línea donde el texto se encontró. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 273 Ejecución de comandos en cantidades de archivos: xargs 1 2 3 4 5 xargs 6 7 8 comando arg1 arg2 arg3 arg4 arg5 ... 9 10 Como muchas veces un administrador usa find para ejecutar un comando en muchísimos archivos, casi siempre a través de la acción -exec del comando find, y como find ejecuta al comando una vez por cada uno de los archivos seleccionados, y si find selecciona miles de archivo el comando se ejecutará -o al menos se intentará ejecutar- miles de veces. Como muchos o muchísimos de los comandos de UNIX pueden ejecutarse dándole muchos -tal vez centenares- de argumentos, es muy ineficiente ejecutar miles de veces un comando con un argumento, en vez de una vez con miles de argumentos. En muchos caso puede usarse la construcción comandoEjecutar -opciones $(find / directorio /criterios -print), pero si find selecciona miles de archivos la línea de comandos dentro de $( ... ) quedará muy muy larga, posiblemente generando error, ya que la línea de comandos del intérprete shell soporta secuencias muy largas, pero no infinitas. Para sobreponerse a todas las situaciones mencionadas los UNIX incluyen un comando llamado xargs que: Recibe nombres de archivos por entrada estándar y con los mismos “arma” líneas de comandos largas. Conoce las limitaciones de las líneas de comandos del UNIX donde ejecuta para no sobrepasar los topes. Permite especificar cómo deben ser las líneas de comandos que arma. La sintaxis del comando xargs es: xargs [ -E marcaFin ] [ -I comodín ] [ -L mínimo ] [ -n máximo ] [ -p ] [ -s maxCars ] [ -t ] comando Donde: Los símbolos [ y ] indican que las opciones y los argumentos son opcionales, no hacen parte de la sintaxis. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 274 El comando xargs necesita una lista de nombres en la entrada estándar. El comando xargs combina comando con cierto número de argumentos que ha leído de la entrada estándar así: La opción I se usa para indicar a xargs un texto en el comando que deberá reemplazarse por cada uno de los nombres leídos de la entrada estándar. Si no se usa se asume el texto predeterminado {}. La opción L se usa para indicar a xargs cuántos nombres deberá usar mínimo para cada invocación del comando. La opción n se usa para indicar a xargs cuántos nombres deberá usar máximo de lo leído de la entrada estándar para cada invocación del comando. Si el comando no tiene el texto de reemplazo ni se usó la opción I xargs tratará de incluir el máximo de nombres posibles sin sobrecargar los límites de la línea de comandos del UNIX donde se está ejecutando. Es posible que la última ejecución se ejecute con pocos nombres debido a que xargs va consumiendo la entrada estándar. La opción p se usa para que xargs pregunte antes de cada invocación del comando. La opción s se usa para indicar a xargs que no se limite en el número de nombres a usar en cada invocación, si no que cada invocación no supere un número máximo de caracteres dado por el argumento de la opción s. La opción t se usa para hacer trazado (debug) de las ejecuciones de xargs. Ejemplos: e@abe:e/> echo file[C-H]* | xargs compress -v fileC: Compression: 55.18% This file is replaced fileD: Compression: 55.18% This file is replaced fileE: Compression: 55.18% This file is replaced fileF: Compression: 55.14% This file is replaced fileG: Compression: 55.14% This file is replaced fileH: Compression: 55.18% This file is replaced with with with with with with fileC.Z. fileD.Z. fileE.Z. fileF.Z. fileG.Z. fileH.Z. En el primer caso de los ejemplos se usa artificialmente xargs para ejecutar un comando sobre muchos archivos, en este caso se le da compress -v a xargs y el arma una línea de comandos con posiblemente muchísimos argumentos, toda la línea comenzando con compress -v. Si la línea de comandos es demasiado grande, el tomaría muchos de los argumentos que va leyendo de la entrada estándar y armaría la línea de comandos más grande posible comenzando con compress -v. Armaría una segunda, y así, hasta consumir toda la entrada estándar. e@abe:e/> echo file[C-H]* | xargs -t compress -v compress -v fileC fileD fileE fileF fileG fileH fileC: Compression: 55.18% This file is replaced with fileC.Z. fileD: Compression: 55.18% This file is replaced with fileD.Z. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 275 fileE: fileF: fileG: fileH: Compression: Compression: Compression: Compression: 55.18% 55.14% 55.14% 55.18% This This This This file file file file is is is is replaced replaced replaced replaced with with with with fileE.Z. fileF.Z. fileG.Z. fileH.Z. En el segundo caso de los ejemplos se le da la misma entrada a xargs, pero se usa la opción t para poder observar cómo es la línea de comandos que compress usaría -que xargs arma-. e@abe:e/> echo file[C-H]* | xargs -t compress -v fileC fileD fileE fileC: Compression: 55.18% This file fileD: Compression: 55.18% This file fileE: Compression: 55.18% This file compress -v fileF fileG fileH fileF: Compression: 55.14% This file fileG: Compression: 55.14% This file fileH: Compression: 55.18% This file -n3 compress -v is replaced with fileC.Z. is replaced with fileD.Z. is replaced with fileE.Z. is replaced with fileF.Z. is replaced with fileG.Z. is replaced with fileH.Z. En el tercer caso de los ejemplos se usa xargs con la misma entrada, pero esta vez además de usar t para observar los comandos que xargs arma, se usa la opción n con un 3 para que xargs arme líneas de comandos con máximo tres ítems tomados de la entrada estándar. e@abe:e/> find . -name 'file[C-H]*' | xargs -L 1 -I _ echo mv _ _-Compr mv ./fileG.Z ./fileG.Z-Compr mv ./fileH.Z ./fileH.Z-Compr mv ./fileC.Z ./fileC.Z-Compr mv ./fileD.Z ./fileD.Z-Compr mv ./fileE.Z ./fileE.Z-Compr mv ./fileF.Z ./fileF.Z-Compr En el cuarto caso de los ejemplos se usa el comando xargs en una situación típica: combinado con find. En este caso find busca y selecciona -y reporta- unos ciertos archivos, que pasa a xargs a través de redirección, el que armará unas líneas de comandos. Con la opción -L xargs no armará líneas de comandos imposiblemente grandes, tomará tantos ítems de la entrada estándar como le dice el argumento de L, en esta caso un item. Con la opción -I se indica a xargs que use algo como comodín para ubicar en la línea de comandos el texto del ítem que recién tomó de la entrada estándar. En este caso se usa un _. Luego se arma una línea de comandos con el ítem. Para no necesariamente ubicarlo al final de lo dado a xargs como argumento se usa el símbolo de reemplazo, en este caso un _. El símbolo de reemplazo puede usarse hasta cinco veces en una línea de reemplazo generada por xargs. Como se ve xargs deberá armar algo como echo mv Nombre1 Nombre1-Compr, y se nota que en realidad es así, porque se observan unas líneas de salida mv Nombre1 Nombre1-Compr. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 276 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 277 Comprimir archivos 1: compress & uncompress compress uncompress Hace tres décadas unos investigadores y desarrolladores inventaron un algoritmo para comprimir la información digital por medio de la codificación de las repeticiones binarias en los archivos, podo después en UNIX se desarrollaron un par de comandos: uno toma un archivo y si tiene sentido lo reemplaza por otro comprimido con el nombre ligeramente cambiado -este comando se denomina compress- y el otro toma una comprimido y lo reemplaza por la versión sin comprimir, ajustándole el nombre -este otro comando se denomina uncompress-. El primer comando tiene la sintaxis: compress [ -c ] [ -f | -F ] [ -v ] [ archivo ... ] El segundo comando tiene la sintaxis: uncompress [ -c ] [ -f | -F ] [ -v ] [ archivo ... ] Donde: Los símbolos [ y ] indican que las opciones y los argumentos son opcionales, no hacen parte de la sintaxis. El símbolo | indica “posibilidad”, se usa para mostrar las posibles opciones, no hace parte de la sintaxis. Si a cualquiera de los dos comandos (compress o uncompress) no se le dan archivos como argumento, intentarán leer de la entrada estándar y escribir en la salida estándar. La opción c se usa para que tanto compress como uncompress escriban en la salida estándar (independientemente de se dio archivo como argumento). Así no intentan escribir archivos. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 278 La opción f (o la opción F, son exactamente equivalentes) forza la creación del archivo comprimido o descomprimido, según el caso. El comando compress no intenta crear el archivo comprimido si ve que el intento de compresión no comprime, que el archivo quedaría igual o más grande. La opción v se usa para que compress (o uncompress) reporte en la salida estándar de errores la estadística de compresión por archivo. Ambos comandos intentan crear un archivo con el mismo dueño, grupo, permisos y fechas que el original, pero si no corren como root no podrán crear archivos con usuario diferente del bajo el que ejecutan. Nótese que ninguno de los comandos trabajan archivos empaquetados, así, que si se les dan cinco archivos generarán cinco archivos más pequeños, no uno sólo que contiene copias comprimidas de los cinco. Ejemplos: e@abe:e/> find . -size 64 4 drwxr-xr-x 66 11 -rw------182 3 -rw-r--r-177 3 -rw-r--r-180 18 -rw-r--r-12289 18 -rw-r--r-MadRamon 1.png 12290 10 -rw-r--r-smit.log 191 3 -rw-r--r-194 3 -rw-r--r-195 3 -rw-r--r-196 3 -rw-r--r-197 3 -rw-r--r-198 3 -rw-r--r-199 3 -rw-r--r-217 104 -rw-r----lslpp-L.txt +2000c -ls 4 e system 1 e system 1 e system 1 e system 1 e system 1 e system 4096 10418 2413 2245 17804 17804 1 e system 10181 Aug 16 17:37 ./subdir1/ 1 1 1 1 1 1 1 1 system system system system system system system system e e e e e e e e 2245 2245 2245 2245 2245 2245 2245 105515 Sep Sep Aug Sep Aug Aug 18 18 18 9 14 16 Sep 9 Sep 9 Sep 9 Sep 9 Sep 9 Sep 9 Sep 9 Sep 15 10:56 10:56 21:40 18:06 23:16 17:37 18:06 18:06 18:06 18:06 18:06 18:06 18:06 18:14 . ./.sh_history ./procesos.txt ./fileH ./MadRamon 1.png ./subdir1/ ./fileB ./fileC ./fileD ./fileE ./fileF ./fileG ./fileI ./ibmserver2- En este primer caso de los ejemplos se buscan archivos “que ameritan ser comprimidos”, únicamente, usando find con el criterio -size. e@abe:e/> compress -v $(find . -size +2000c) . is not a regular file. It is not changed. ./MadRamon: A file or directory in the path name does not exist. 1.png: A file or directory in the path name does not exist. ./subdir1/MadRamon: A file or directory in the path name does not exist. 1.png: A file or directory in the path name does not exist. compress: 0653-054 ./subdir1/smit.log.Z already has a .Z suffix. It is not changed. ./.sh_history: Compression: 50.65% This file is replaced with ./.sh_history.Z. ./ibmserver2-lslpp-L.txt: Compression: 77.47% This file is replaced with ./ ibmserver2-lslpp-L.txt.Z. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 279 En este segundo caso de ejemplo se combina find con compress usando substitución de comandos para que se vayan comprimiendo los archivos que find encontró. Se usa compress con la opción v para que reporte las estadísticas de compresión de cada archivo que se va comprimiendo. e@abe:e/> find . -name '*Z' -exec uncompress -v {} \; ./procesos.txt.Z: This file is replaced with ./procesos.txt. ./fileH.Z: This file is replaced with ./fileH. ./fileB.Z: This file is replaced with ./fileB. ./subdir1/smit.log.Z: This file is replaced with ./subdir1/smit.log. ./fileC.Z: This file is replaced with ./fileC. ./.sh_history.Z: This file is replaced with ./.sh_history. ./fileD.Z: This file is replaced with ./fileD. ./fileE.Z: This file is replaced with ./fileE. ./fileF.Z: This file is replaced with ./fileF. ./fileG.Z: This file is replaced with ./fileG. ./fileI.Z: This file is replaced with ./fileI. ./ibmserver2-lslpp-L.txt.Z: This file is replaced with ./ibmserver2-lslppL.txt. En el tercer caso de ejemplo se usa la acción -exec del comando find para invocar uncompress en cada archivo comprimido -que se sabe que tiene el nombre terminado en Z. Se usa uncompress con la opción v para que reporte los archivos conforme los va descomprimiendo. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 280 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 281 Comprimir archivos 2: gzip & gunzip gzip gunzip Como tanto compress como uncompress están basados en el algoritmo patentado LZW (en este momento el algoritmo es propiedad de Unisys-, Jean-Loup Gailly y Mark Adler lanzaron el 31 de octubre de 1992 un nuevo par de programas diseñados para reemplazarlos, todo bajo el auspicio del proyecto GNU. Este nuevo par de programas usan un algoritmo ahora llamado DEFLATE, que es una combinación de LZ77 y codificación Huffman. Como este par de comandos hacen parte del proyecto GNU, ambos son de código abierto. Igual que compress, gzip está diseñado para comprimir archivos individuales, y gunzip está diseñado para descomprimir los archivos creados por gzip. Nótese que gunzip reconoce los archivos creados con compress y puede descomprimirlos. Igual que compress, gzip toma un archivo y lo reemplaza por otro comprimido, con el nombre ligeramente cambiado agregándole .gz, y gunzip toma un archivo .gz comprimido y lo descomprime, generando un archivo sin la extensión .gz. La sintaxis de ambos comandos es sencilla: gzip [ -c ] [ -f ] [ -v ] [ -dígito | --fast | --best ] [ archivo ... ] y gunzip [ -c ] [ -f ] [ -v ] [ -t ] [ -l ] [ archivo ... ] Donde: Los símbolos [ y ] indican que las opciones y los argumentos son opcionales, no hacen parte de la sintaxis. El símbolo | indica “posibilidad”, se usa para mostrar las posibles opciones, no hace parte de la sintaxis. Si a cualquiera de los dos comandos (gzip o gunzip) no se le dan archivos como argumento, intentarán leer de la entrada estándar y escribir en la salida estándar. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 282 La opción c se usa para que tanto gzip como gunzip escriban en la salida estándar (independientemente de se dio archivo como argumento). Así no intentan escribir archivos. La opción f (o la opción F, son exactamente equivalentes) forza la creación del archivo comprimido o descomprimido, según el caso. El comando gzip no intenta crear el archivo comprimido si ve que el intento de compresión no comprime, que el archivo quedaría igual o más grande. La opción dígito (que recibe de 1 a 9) se usa para seleccionar un método de compresión: el más rápido es 1, que posiblemente genera un archivo poco comprimido, es equivalente a la opción -fast; el más lento es 9, que posiblemente genera un archivo mucho más pequeño, pero consumiendo más RAM y CPU en el proceso, es equivalente a -best. Lo predeterminado es 6. La opción v se usa para que gzip (o gunzip) reporte en la salida estándar de errores la estadística de compresión por archivo. La opción l se usa en gunzip no para descomprimir archivos, si no para reportar estadísticas de compresión por archivo. La opción t se usa para que gunzip haga pruebas de integridad en los archivos comprimidos y reporte lo que encuentre incongruente. Ambos comandos intentan crear un archivo con el mismo dueño, grupo, permisos y fechas que el original, pero si no corren como root no podrán crear archivos con usuario diferente del bajo el que ejecutan. Note que como gzip comprime individualmente los archivos, es muy común primero empacar archivos con tar y comprimir lo que este genera. Estos archivos salidos de la combinación de los dos comandos casi siempre se encuentran con extensiones .tar.gz o tgz y se denominan tarballs. Ejemplos: e@abe:e/> find . -size 64 4 drwxr-xr-x 221 3 -rw-r--r-182 3 -rw-r--r-177 3 -rw-r--r-180 18 -rw-r--r-1.png 12289 18 -rw-r--r-MadRamon 1.png 12290 10 -rw-r--r-smit.log 191 11 -rw------10:57 ./.sh_history 193 3 -rw-r--r-- +2000c -ls 4 e 1 e 1 e 1 e 1 e system system system system system 4096 2245 2245 2245 17804 1 e system 17804 Aug 16 17:37 ./subdir1/ 1 e system 10181 Aug 16 17:37 ./subdir1/ 1 e system 10456 Sep 18 1 e system AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow Sep 18 11:19 . Sep 9 18:06 ./fileH Sep 9 18:06 ./fileB Sep 9 18:06 ./fileC Aug 14 23:16 ./MadRamon 2245 Sep 9 18:06 ./fileD 283 194 3 -rw-r--r-195 3 -rw-r--r-196 3 -rw-r--r-197 3 -rw-r--r-198 104 -rw-r----ibmserver2-lslpp-L.txt 217 3 -rw-r--r-procesos.txt 1 1 1 1 1 e e e e e system system system system system 1 e system 2245 2245 2245 2245 105515 Sep 9 Sep 9 Sep 9 Sep 9 Sep 15 18:06 18:06 18:06 18:06 18:14 ./fileE ./fileF ./fileG ./fileI ./ 2413 Aug 18 21:40 ./ En este primer caso de los ejemplos se buscan archivos “que ameritan ser comprimidos”, únicamente, usando find con el criterio -size. e@abe:e/> gzip -v $(find . -size +2000c) gzip: . is a directory -- ignored ./fileH: 72.8% -- replaced with ./fileH.gz ./fileB: 72.8% -- replaced with ./fileB.gz ./fileC: 72.9% -- replaced with ./fileC.gz ./MadRamon: No such file or directory 1.png: No such file or directory ./subdir1/MadRamon: No such file or directory 1.png: No such file or directory ./subdir1/smit.log: 72.3% -- replaced with ./subdir1/smit.log.gz ./.sh_history: 72.5% -- replaced with ./.sh_history.gz ./fileD: 72.9% -- replaced with ./fileD.gz ./fileE: 72.8% -- replaced with ./fileE.gz ./fileF: 72.8% -- replaced with ./fileF.gz ./fileG: 72.8% -- replaced with ./fileG.gz ./fileI: 72.8% -- replaced with ./fileI.gz ./ibmserver2-lslpp-L.txt: 87.0% -- replaced with ./ibmserver2-lslppL.txt.gz ./procesos.txt: 71.6% -- replaced with ./procesos.txt.gz En este segundo caso de ejemplo se combina find con gzip usando substitución de comandos para que se vayan comprimiendo los archivos que find encontró. Se usa gzip con la opción v para que reporte las estadísticas de compresión de cada archivo que se va comprimiendo. e@abe:e/> find . -name '*gz' -exec gunzip -l {} \; compressed uncompr. ratio uncompressed_name 633 2245 72.8% ./fileB compressed uncompr. ratio uncompressed_name 631 2245 72.9% ./fileC compressed uncompr. ratio uncompressed_name 2902 10456 72.5% ./.sh_history compressed uncompr. ratio uncompressed_name 2842 10181 72.3% ./subdir1/smit.log compressed uncompr. ratio uncompressed_name 631 2245 72.9% ./fileD compressed uncompr. ratio uncompressed_name 633 2245 72.8% ./fileE compressed uncompr. ratio uncompressed_name 633 2245 72.8% ./fileF compressed uncompr. ratio uncompressed_name AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 284 633 compressed 633 compressed 13669 compressed 716 compressed 633 2245 uncompr. 2245 uncompr. 105515 uncompr. 2413 uncompr. 2245 72.8% ratio 72.8% ratio 87.0% ratio 71.6% ratio 72.8% ./fileG uncompressed_name ./fileI uncompressed_name ./ibmserver2-lslpp-L.txt uncompressed_name ./procesos.txt uncompressed_name ./fileH En el cuarto caso se usa la opción de acción -exec del comando find para ejecutar gunzip -l en cada archivo comprimido y obtener unas estadísticas de compresión por archivo. e@abe:e/> find method crc defla c58ff355 defla 4ee49376 defla db9b9031 defla 44d5bb72 defla 4401742b defla ae144046 defla 7cc54b0d defla d675841c defla 58651c7f defla e3f19b59 L.txt defla e1b6233a defla f2d5d36e . -name '*gz' -print | xargs gunzip -vl date time compressed uncompr. ratio Sep 9 18:06 633 2245 72.8% Sep 9 18:06 631 2245 72.9% Sep 18 10:57 2902 10456 72.5% Aug 16 17:37 2842 10181 72.3% Sep 9 18:06 631 2245 72.9% Sep 9 18:06 633 2245 72.8% Sep 9 18:06 633 2245 72.8% Sep 9 18:06 633 2245 72.8% Sep 9 18:06 633 2245 72.8% Sep 15 18:14 13669 105515 87.0% Aug 18 21:40 Sep 9 18:06 716 633 25189 2413 2245 146525 uncompressed_name ./fileB ./fileC ./.sh_history ./subdir1/smit.log ./fileD ./fileE ./fileF ./fileG ./fileI ./ibmserver2-lslpp- 71.6% ./procesos.txt 72.8% ./fileH 82.8% (totals) En el quinto caso se usa una combinación de find con xargs con la esperanza de que haya sólo una ejecución de gunzip -vl. Así (con las opciones v y l)se obtiene un reporte más detallado por archivo, pero como es una única ejecución, el reporte es más conciso (y tiene totales). e@abe:e/> find . -name '*gz' -print | xargs gunzip -v ./fileB.gz: 72.8% -- replaced with ./fileB ./fileC.gz: 72.9% -- replaced with ./fileC ./.sh_history.gz: 72.5% -- replaced with ./.sh_history ./subdir1/smit.log.gz: 72.3% -- replaced with ./subdir1/smit.log ./fileD.gz: 72.9% -- replaced with ./fileD ./fileE.gz: 72.8% -- replaced with ./fileE ./fileF.gz: 72.8% -- replaced with ./fileF ./fileG.gz: 72.8% -- replaced with ./fileG ./fileI.gz: 72.8% -- replaced with ./fileI ./ibmserver2-lslpp-L.txt.gz: 87.0% -- replaced with ./ibmserver2-lslppL.txt ./procesos.txt.gz: 71.6% -- replaced with ./procesos.txt ./fileH.gz: 72.8% -- replaced with ./fileH En el sexto caso se usa una combinación parecida, pero no un reporte de compresión (con gunzip -l), si no una descompresión de los archivos, aunque también reporta, porque se incluyó la opción v de gunzip. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 285 Empacar archivos: tar tar A fines de la década de 1980 se notaba cómo la utilitad básica para llevar a cabo copias de respaldo a cinta de la época era inadecuada e insuficiente. Por esta razón central se dió un nuevo desarrollo que terminó tomando la forma del comando tar (tape archive). Este comando y el formato que se desarrolló para que el mismo manejara se dirigieron originalmente a ser almacenados directamente en dispositivos en burto (raw devices), no en archivos como es muy común ahora. Esta utilidad y su formato se estandarizaron en POSIX. 1-1988 y luego en POSIX.1-2001. Aunque originalmente fue una herramienta y un formato para copias de respaldo en dispositivos puramente secuenciales ahora es más común como un formato para el transporte de múltiples archivos como un todo. La mayoría de las utilidades tar de los sistemas UNIX trabajan lo que ahora se denomina “formato USTAR” (Uniform Standard Tape Archive), formato que permite almacenar múltiples -muchísimos- archivos, con sus metadatos dentro de uno solo. Como los archivos tar tienen un encabezado por archivo almacenado dentro de él, y este encabezado tiene unos limitantes, conviene saber cuáles son estos límites: básicamente porciones de nombre de máximo cien caracteres y archivos individuales de máximo 8GB. Note que tar archiva pero no comprime, dejando esta tarea a alguna otra utilidad o al dispositivo o medio de almacenamiento. La sintaxis de tar es bastante compleja, pero de manera resumida se tiene: tar { -c | -r | -x | -u } [ -R ] [ -D ] [ -C directiorio ] [ -L ListaInclusión ] [ -X ListaExclusión ] [ -p ] [ -v ] [ archivo ... ] Donde: Los símbolos [ y ] indican que las opciones y los argumentos son opcionales, no hacen parte de la sintaxis. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 286 El símbolo | indica “posibilidad”, se usa para mostrar las posibles opciones, no hace parte de la sintaxis. La opción c se usa para crear un nuevo archivo de respaldo, copiando los archivos mencionados en ListaInclusión o como argumentos archivo, comenzando desde el inicio del archivo de respaldo (no agrega). La opción r se usa para agregar archivos a un archivo de respaldo, copiando los archivos mencionados en ListaInclusión o como argumentos archivo, comenzando desde el fin del archivo de respaldo (agrega). Esta opción es válida para archivos de sistema de archivo únicamente, no es válida si el destino de copia es una cinta de respaldo. La opción x se usa para extraer archivos de una copia de respaldo (restaurar), copiando los archivos mencionados en ListaInclusión o como argumentos archivo, al directorio actual, teniendo en cuenta la ruta de directorio almacenada en el archivo de copia de respaldo. La opción u se usa para agregar archivos a un archivo de copia de respaldo, pero únicamente si no existen ya dentro de la copia de respaldo, o si la copia dentro de la copia de respaldo tiene fecha de modificación anterior. Los archivos que se copia se mencionan en ListaInclusión o son mencionados como argumento archivo (actualiza la copia de respaldo). Esta opción es válida para archivos de sistema de archivo únicamente, no es válida si el destino de copia es una cinta de respaldo. La opción t se usa para que tar lea el medio o archivo de copia de respaldo, pero que no intente crear los archivos (no intente recuperar). Se usa básicamente junto con la opción v para listar los contenidos de un medio o archivo de copia. La opción R se usa para forzar a tar para que procese recursivamente los archivos mencionados en ListaInclusión o dados como argumentos archivo. La opción D se usa para forzar a tar para que no procese recursivamente los archivos mencionados en ListaInclusión o dados como argumentos archivo. La opción C se usa para que tar se cambie de directorio antes de procesar (agregar o extraer) los archivos que siguen como parámetro. tar se cambia al directorio dado como argumento de la opción C. La opción L con un nombre de archivo como argumento para dar a tar una lista de archivos y directorios a procesar. Esta lista puede usarse como archivos a copiar al medio de respaldo o como archivos a recuperar del medio de respaldo. El archivo dado como argumento a la opción L debe tener un nombre de archivo a procesar por línea. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 287 La opción X tiene un uso parecido a la opción L: se usa con un nombre de archivo como argumento para dar a tar una lista de archivos y directorios a excluir de todo procesamiento. Esta lista puede usarse como archivos a excluir de la copia al medio de respaldo o como archivos a no recuperar del medio de respaldo. El archivo dado como argumento a la opción L debe tener un nombre de archivo a excluir por línea. La opción p indica a tar que debe procesar los atributos completos de los archivos: si está copiando a un medio de respaldo deberá copiar dueño, grupo, permisos, fechas y demás; si está recuperando deberá intentar recuperar dueño, grupo, permisos, fechas y demás. La mayoría de sistemas UNIX impiden modificar el usuario dueño de los archivos a menos que se esté trabajando como root. La opción v se usa para que tar vaya reportando los nombres y los detalles de los archivos conforme los copia a o desde un medio o archivo de copia de respaldo. La opcón f es quizás la más importante: se usa para indicar a tar dónde debe almacenar la copia de respaldo con todo, o de dónde debe extraer lo que se quiere recuperar. El argumento de la opción f debe ser un dispositivo de almacenamiento secuencial como una cinta (nombre que varía enormemente entre las diferentes variantes de UNIX) o un archivo tradicional. Si al comando tar no se le da la opción f intentará leer (cuando usa las opciones t o x) o escribir (cuando se usa con c, u o r) a o desde un dispositivo de copia de respaldo predeterminado según el UNIX donde esté en ejecución -conclusión: siempre use la opción f para indicarle a tar el medio de almacenamiento de las copias de respaldo-. Ejemplos: e@abe:e/> ls -rw-r--r--rw-r--r--rw-r--r--rw-r--r--rw-r--r--rw-r--r--rw-r--r--rw-r--r--rw-r--r--rw-r--r-- -l archivo* 1 e system 1 e system 1 e system 1 e system 1 e system 1 e system 1 e system 1 e system 1 e system 1 e system 0 0 0 0 105 919 105 105 220 220 Sep Sep Sep Sep Sep Sep Sep Sep Sep Sep 09 09 09 09 09 09 09 09 09 09 19:21 19:21 18:14 19:21 18:05 18:05 18:07 18:07 18:06 18:06 archivo A.txt archivo.part.txt archivo.txt archivo23.txt archivoA.txt archivoAB.txt archivoE.txt archivoZ.txt archivoaB.txt archivoab.txt El primer caso de los ejemplos simplemente muestra un listado de los archivos que se tienen antes de iniciar el trabajo directamente con tar. e@abe:e/> tar -cvpf empaque.tar archivo* a archivo A.txt 0 blocks. a archivo.part.txt 0 blocks. a archivo.txt 0 blocks. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 288 a archivo23.txt 0 blocks. a archivoA.txt 1 blocks. a archivoAB.txt 2 blocks. a archivoE.txt 1 blocks. a archivoZ.txt 1 blocks. a archivoaB.txt 1 blocks. a archivoab.txt 1 blocks. e@abe:e/> ls -l *tar -rw-r--r-1 e system 10240 Sep 18 23:38 empaque.tar El segundo caso de los ejemplos muestra cómo se usa tar para crear un archivo de respaldo: básicamente a través de las opciones c y f. En el ejemplo se agregan las opciones v y p para que además tar liste los nombres de los archivos conforme los va copiando al respaldo y para que guarde todos los detalles como el dueño y los permisos para poderlos recuperar después. e@abe:e/> gzip -v9 *tar empaque.tar: 92.5% -- replaced with empaque.tar.gz El tercer caso de los ejemplos simplemente usa gzip para comprimir la copia de respaldo creada con tar. e@abe:e/> rm archivo* && ls -l archivo* ls: 0653-341 The file archivo* does not exist. El cuarto caso de los ejemplos se deshace -borrando- de los archivos originales. Comprueba también que se perdieron. e@abe:e/> gunzip -c empaque.tar.gz | tar -tvp tar: /dev/rmt0: There is a request to a device or address that does not exist. El quinto caso de los ejemplos muestra cómo tar no lee la entrada estándar -así que no recibe del comando “anterior”-. e@abe:e/> gunzip -c empaque.tar.gz | tar -tvpf -rw-r--r-- 501 0 0 Sep 09 19:21:29 2007 -rw-r--r-- 501 0 0 Sep 09 19:21:29 2007 -rw-r--r-- 501 0 0 Sep 09 18:14:20 2007 -rw-r--r-- 501 0 0 Sep 09 19:21:29 2007 -rw-r--r-- 501 0 105 Sep 09 18:05:31 2007 -rw-r--r-- 501 0 919 Sep 09 18:05:39 2007 -rw-r--r-- 501 0 105 Sep 09 18:07:36 2007 -rw-r--r-- 501 0 105 Sep 09 18:07:45 2007 -rw-r--r-- 501 0 220 Sep 09 18:06:16 2007 -rw-r--r-- 501 0 220 Sep 09 18:06:06 2007 archivo A.txt archivo.part.txt archivo.txt archivo23.txt archivoA.txt archivoAB.txt archivoE.txt archivoZ.txt archivoaB.txt archivoab.txt El sexto caso de los ejemplos muestra cómo tar puede leer de la entrada estándar o escribir en la salida estándar si se usa la opción f con un menos (-) como argumento. e@abe:e/> gunzip -c empaque.tar.gz | tar -xvpf x archivo A.txt, 0 bytes, 0 media blocks. x archivo.part.txt, 0 bytes, 0 media blocks. x archivo.txt, 0 bytes, 0 media blocks. x archivo23.txt, 0 bytes, 0 media blocks. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 289 x x x x x x archivoA.txt, 105 bytes, 1 media blocks. archivoAB.txt, 919 bytes, 2 media blocks. archivoE.txt, 105 bytes, 1 media blocks. archivoZ.txt, 105 bytes, 1 media blocks. archivoaB.txt, 220 bytes, 1 media blocks. archivoab.txt, 220 bytes, 1 media blocks. En el séptimo caso de los ejemplos se usa la misma combinación de gunzip para descomprimir y de tar con la opción x y f- para recuperar los archivos contenidos en una copia de respaldo comprimida. Como se incluye la opción p, tar recuperará con todos los atributos de archivo -incluso con el dueño adecuado a menos que no se use el usuario root para recuperar-. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 290 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 291 Comandos varios Existen muchísimos comandos útiles en UNIX. Muchos son muy prácticos a la hora de hacer scripts de shell. Comando host El sencillo comando host se usa básicamente para hacer ejercicio del sistema de resolución de nombres de un sistema UNIX. La sintaxis básica es: host dirección o host nombre Ejemplos: e@abe:e/> host moe Moe.lan is 192.168.1.8, Aliases: moe, ramon e@abe:e/> host 192.168.1.254 gateway is 192.168.1.254, Aliases: gw Comando hostname El sencillo comando hostname se usa para configurar o consultar el nombre de la máquina UNIX actual. La sintaxis es: hostname o hostname NuevoNombre Ejemplo: e@abe:e/> hostname abe Comando uptime El comando uptime muestra la información de “vida” del sistema donde se corre. El comando muestra la hora en que se ejecuta, cuánto lleva el sistema desde que se inició, el número de usuarios conectados con sesión interactiva, y la carga promedio en el último período de 1 minuto, 5 minutos y 15 minutos. La carga promedio es el número de procesos en estado activo durante el período. Ejemplo: e@abe:e/> uptime 12:00AM up 1 day, 9:20, 10 users, AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow load average: 0.24, 0.10, 0.10 292 Comando du El comando du (disk usage) se usa para obtener cuánto espacio en disco ocupan unos archivos y/o directorios. Cuando se indican directorios el comando calcula cuánto ocupan en disco los archivos contenidos dentro del directorio mas lo que ocupa el directorio en sí. La sintaxis de du es: du [ -a | -s ] [ -k | -m | -g ] [ -H ] [ archivo ... ] Donde: La opción a se usa para que du reporte por cada archivo contenido en los directorios dados como argumentos, o en directorio actual si no se da como argumento. El comando du reporta siempre por cada uno de los argumentos dados, aunque sean archivos. La opción s se usa para que du reporte un resumen total del espacio ocupado por todos los argumentos dados. El comando reportará el resumen del directorio actual si no se le dan argumentos. La opción k se usa para que el reporte generado por du esté dado en kilobytes. La opción m se usa para que el reporte generado por du esté dado en megabytes. La opción g se usa para que el reporte generado por du esté dado en gigabytes. La opción H se usa para que du siga los enlaces simbólicos y tenga en cuenta el espacio ocupado por lo apuntado por el enlace simbólico. Si no se dan ni k ni m ni g el comando du reportará en bloques de 512B sin importar el formato en que estén almacenados los archivos en disco. Si a du no se le dan argumentos (ni archivos ni directorios) usará el directorio actual como argumento. Ejemplos: e@abe:e/> du 0 ./.ssh 0 ./subdir1/Antiguo_SubDir 64 ./subdir1 640 . e@abe:e/> du -ms /tmp /etc du: /tmp/lost+found: The file access permissions do not allow the specified action. du: /tmp/wsmdata.196726: The file access permissions do not allow the specified action. 122.36 /tmp du: /etc/tunables: The file access permissions do not allow the specified action. 16.36 /etc AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 293 Comando sum El comando sum muestra la suma de chequeo y cuántos bloques mide cada uno de los archivos dados como parámetros. Normalmente se usa para verificar que un archivo recién transmitido transmitió y se recibió bien. Si a sum no se le dan archivos como argumentos usará la entrada estándar. La sintaxis básica de sum es: sum [ archivo ... ] Ejemplos: e@abe:e/> sum Meses.txt /etc/passwd 46778 1 Meses.txt 41837 1 /etc/passwd El comando sum usa un algoritmo estándar aparecido en BSD Unix 4.3. Comando cksum El comando cksum muestra la suma de chequeo calculada según un algoritmo más moderno de 32 bits y cuántos bytes mide cada uno de los archivos dados como parámetros. Normalmente se usa para verificar que un archivo recién transmitido transmitió y recibió bien. Si a cksum no se le dan archivos como argumentos usará la entrada estándar. La sintaxis de cksum es: cksum [ archivo ... ] Ejemplos: e@abe:e/> cksum Meses.txt /etc/passwd 1927595220 175 Meses.txt 3518703885 676 /etc/passwd El comando cksum usa el algoritmo estándar de verificación CRC que se usa para verificar las tramas ethernet. Comando true El comando true devuelve un código de retorno verdadero siempre. No muestra ningún tipo de salida. Sintaxis: true Ejemplo: e@abe:e/> true && echo Devuelve VERDADERO Devuelve VERDADERO Existe un comando false que siempre devuelve un código de retorno falso. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 294 Comando yes El comando yes genera una infinita cantidad de líneas de texto yes cuando se ejecuta. La idea es usarlo redirigido a un comando que está esperando una respuesta positiva. Según el idioma en que se esté trabajando es posible que genere otro texto como respuesta. Sintaxis: yes [ texto ] Si se da un texto como argumento, el comando yes genera infinitas líneas repitiendo el texto dado como argumento. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 295 Uso avanzado del intérprete de comandos: Uso del intérprete como un lenguaje de programación Una de las más poderosas características de UNIX no es una característica de UNIX, es una característica del intérprete de comandos estándar en UNIX. El intérprete estándar de comandos de UNIX (sea Bourne Shell, Bourne Again Shell, o sea Korn Shell, o sean los otros) siempre recibe los comandos y características que permiten la programación. Aunque existen características, sentencias y comandos que tienen sentido cuando se está en medio de un código programado, todas las sentencias y comandos del intérprete pueden ser usadas en todo momento; es decir, no hay que hacer que el shell esté en un modo especial para programar, ni hay ciertas características que funcionan es cuando el shell las encuentra en un archivo programado. Desarrollo de shell scripts El desarrollo de pequeñas -o grandes- rutinas programadas, o utilidades específicas a una instalación se beneficia enormemente de lo que se denominan shell scripts. Estos son archivos de texto que contienen comandos UNIX, y que muy comúnmente harán uso de comandos que se constituyen en las sentencias de control de un lenguaje de programación muy fácil y a la vez muy poderoso. Como todos los comandos -instalados originalmente o noque haya disponibles en un sistema UNIX son usables desde el intérprete de comandos entonces dentro de un archivo de comandos del intérprete de comandos se pueden usar, así todos los comandos que hayan en un sistema son usables por el lenguaje, como si fueran originales. Hay dos detalles básicos que hacen más fácil el uso de un shell script: Que sea ejecutable. Si un script del shell no es ejecutable pero es legible por el usuario el mismo lo podrá usar, pero solo si lo usa con el nombre del intérprete como prefijo: ksh /nombre/archivo/script o aún sh /nombre/script; pero será más cómodo si al script sólo hay que invocarlo por su nombre, sin necesidad de el mencionado prefijo. Que el sistema pueda encontrarlo en el PATH. Si un shell script no está encontrable en alguno de los directorios de la variable PATH del usuario al usuario le tocará invocarlo por su nombre completo: /nombre/shellscript; pero será más cómodo para el usuario si el sistema lo encuentra fácil: shellscript. Pregunta: cómo se hace que un script de shell sea al mismo tiempo legible y ejecutable? Pregunta: cómo se ajusta la variable PATH del usuario permanentemente? AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 296 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 297 Pruebas lógicas: test Una de los más básicos elementos dentro de un ambiente de programación son las pruebas lógicas. El lenguaje del shell tiene la posibilidad de hacer pruebas lógicas de una manera muy sencilla: a través del comando test. El comando test recibe una o más condiciones lógicas y devuelve un código de retorno cero (0) considerado como verdadero si la prueba lógica da verdadero, y devuelve diferente de cero si la prueba lógica da falso. La sintaxis básica es muy sencilla: test pruebaLógica o [ pruebaLógica ] Donde: El comando test es equivalente a [. El comando test ignora el ] final. Si se usa la sintaxis [ ] hay que recordar que es un comando con argumentos, así que los espacios son obligatorios. El comando test devuelve verdadero a través de un código de retorno cero (0), no genera mensajes por salida. El comando test devuelve falso a través de un código de retorno diferente de cero, no genera mensajes por salida, a menos que haya errores de sintaxis. Existen muchas clases de pruebas lógicas, que se detallan a continuación. Pruebas lógicas básicas El comando test tiene una serie de operaciones lógicas básicas, que aunque tienen un “aspecto extraño” cuando se usan con test tienen mucho “mejor apariencia” cuando se usan con la sintaxis [ ]: ‣ expresión devuelve verdadero si expresión devuelve verdadero. ‣ comando devuelve verdadero si comando devuelve verdadero (0). ‣ ! expresión (~) devuelve verdadero si expresión devuelve falso. ‣ cadena1 = cadena2 (≡) devuelve verdadero si cadena1 (de texto) es igual a cadena2 (de texto). ‣ cadena1 == cadena2 (≡) devuelve verdadero si cadena1 (de texto) es igual a cadena2 (de texto). AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 298 (≢) devuelve verdadero si cadena1 (de texto) es diferente de cadena2 (de texto) ‣ cadena1 != cadena2 ‣ expr1 -a expr2 ‣ expr1 -o expr2 ‣ expr1 -eq expr2 ‣ (≠) devuelve verdadero si el valor numérico de expr1 no es igual al valor numérico de expr2. ‣ expr1 -gt expr2 ‣ expr1 -lt expr2 ‣ (≥) devuelve verdadero si el valor numérico de expr1 es mayor o igual que el valor numérico de expr2. • (≤) devuelve verdadero si el valor numérico de expr1 es menor o igual que el valor numérico de expr2. (⊼) devuelve verdadero si expr1 es verdadero y expr2 es verdadero también. Si expr1 es falso expr2 nunca se ejecuta. (⊻) devuelve verdadero si expr1 es verdadero o si expr2 es verdadero. Si expr1 es verdadero expr2 nunca se ejecuta. (=) devuelve verdadero si el valor numérico de expr1 es igual al valor numérico de expr2. expr1 -ne expr2 (>) devuelve verdadero si el valor numérico de expr1 es mayor que el valor numérico de expr2. (<) devuelve verdadero si el valor numérico de expr1 es menor que el valor numérico de expr2. expr1 -ge expr2 expr1 -le expr2 Ejemplos: e@abe:e/> [ $(whoami) = "root" ] && echo "Estoy conectado como root!" e@abe:e/> [ $(whoami) != "root" ] && echo "No estoy conectado como root!" No estoy conectado como root! Los dos primeros casos de los ejemplos muestran el uso de la prueba lógica “igual que” y “no igual que” en el comando test. Como el comando test no muestra salida (sólo muestra salida de errores cuando hay errores de sintaxis) se usan las construcciones lógicas del shell de ejecución condicional (&&) para generar un mensaje en caso de que se necesite. e@abe:e/> ps PID TTY TIME CMD 73924 pts/0 0:00 -bash 233706 pts/0 0:00 ps 315406 pts/0 0:00 -ksh e@abe:e/> echo $$ 315406 e@abe:e/> [ $$ -gt 1000 ] && echo "Mi numero de proceso es mayor que mil" Mi numero de proceso es mayor que mil AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 299 El caso tres de los ejemplos muestra el uso del operador lógico numérico “mayor que” del comando test. Igual que antes se usa ejecución condicional en el shell para generar un mensaje con echo. e@abe:e/> groups system staff security audit perf shutdown e@abe:e/> groups | wc -w 6 e@abe:e/> [ $(groups | wc -w) -lt 10 ] && echo "Mi usuario esta en menos de diez grupos" Mi usuario esta en menos de diez grupos El caso cuatro de los ejemplos muestra el uso combinado de sustitución de comandos dentro de test y del uso del operador “menor que “del comando test. Como en todos los ejemplos, se usa ejecución condicional en el shell para generar un mensaje con echo. Pruebas lógicas con cadenas de texto Además de las básicas (como cadena1 = cadena2), el comando test implementa también: devuelve verdadero si cadena no es nula. ‣ “cadena” ‣ -n “cadena” devuelve verdadero si cadena tiene longitud mayor que cero. ‣ -z “cadena” devuelve verdadero si cadena tiene longitud exactamente igual a cero. Ejemplos: e@abe:e/> [ $(whoami) ] && echo "Tengo usuario!" Tengo usuario! El primer caso de los ejemplos muestra el uso de “cadena” en el comando test. e@abe:e/> [ -n "$LOGNAME" ] && echo "Estoy conectado!" Estoy conectado! El segundo caso de los ejemplos muestra el uso del operador lógico n del comando test. Pruebas lógicas con archivos Mucha de la funcionalidad del lenguaje de programación del shell gira alrededor de las necesidades del administrador del sistema. Así, como la administración normalmente manipula archivos, el comando básico test tiene implementadas unas series de pruebas con archivos: ‣ -r archivo devuelve verdadero si el usuario tiene permiso de lectura sobre el archivo. ‣ -w archivo devuelve verdadero si el usuario tiene permiso de escritura sobre el archivo. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 300 ‣ -x archivo devuelve verdadero si el usuario tiene permiso de ejecución sobre el archivo. devuelve verdadero si archivo existe y es un archivo común. ‣ -f archivo ‣ -d directorio ‣ -c archivo devuelve verdadero si archivo existe y es un directorio. devuelve verdadero si archivo existe y es dispositivo de caracteres. ‣ -b archivo devuelve verdadero si archivo existe y es dispositivo de bloque. ‣ -s archivo devuelve verdadero si archivo existe y tiene tamaño mayor que cero. ‣ devuelve verdadero si el descriptor de archivo número está asociado a una terminal. Si no se da número asume 1 (la salida estándar). -t número Ejemplos: e@abe:e/> [ -r /etc/passwd ] && echo "/etc/passwd debe ser legible." /etc/passwd debe ser legible. e@abe:e/> [ -w /etc/passwd ] || echo "/etc/passwd no debe ser escribible" e@abe:e/> ls -l /etc/passwd -rw-rw-r-1 root system 676 Sep 17 14:40 /etc/passwd El primer caso de los ejemplos muestra cómo se puede probar si el usuario actual -con el que se ejecuta test- tiene permisos para leer o escribir un archivo (o directorio). e@abe:e/> [ -d /etc/security -a -x /etc/security ] && echo "Puedo entrar a / etc/security" Puedo entrar a /etc/security El segundo caso muestra cómo comprobar que se tiene un directorio y que se tienen permisos para entrar al mismo (usando los operadores de prueba lógica d y x), además muestra el uso del operador lógico a (AND). e@abe:e/> [ -b /dev/hdisk3 ] && echo "El dispositivo hdisk3 existe" El dispositivo hdisk3 existe El tercer caso muestra cómo comprobar la disponibilidad de un cierto dispositivo de bloques en el sistema (el caso se basa en un dispositivo disco en AIX). e@abe:e/> [ -t ] && echo "Estoy trabajando en una terminal interactiva" Estoy trabajando en una terminal interactiva El cuarto caso muestra cómo comprobar si se está trabajando interactivamente. En caso de que haya una redirección [ -t ] devuelve falso. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 301 Operadores y Operaciones: expr El intérprete de comandos implementa un lenguaje de programación, y como podremos imaginar hay tres cosas básicas que manejar en cualquier lenguaje de programación: valores lógicos, información textual e información numérica. El shell realmente no está hecho para alto procesamiento matemático, ya que las operaciones deben realizarse apoyadas en un comando que veremos a continuación: expr. El comando expr recibe unos operandos y operaciones como argumentos, realiza la operación y la reporta por salida estándar, así que deberán usarse las facilidades del shell para capturar la salida si la queremos usar, en especial si la necesitamos almacenada en alguna variable. La sintaxis es muy sencilla: expr operando operador operando ... Donde: El comando necesita hacer las operaciones sobre varios argumentos, así que hay que separárselos con espacios. Las operaciones básicas son suma (+), resta (-), multiplicación (*), división entera (/), módulo o residuo (%). Como el * de la multiplicación es también un comodín del shell, hay que “escaparlo” para que el shell no lo interprete como “todos los archivos”, usando \*. retorna el valor de oper1 si no es nulo y no es cero, en ambos casos retornando el valor de oper2. Como el símbolo | es especial en el shell entonces habrá que usarlo “con escape” \|. oper1 | oper2 retorna el valor de oper1 si ambos valores son diferentes de nulo y de cero, de lo contrario devuelve cero. Como el símbolo & es especial en el shell, entonces habrá que usarlo “con escape” \&. cadena : exprReg2 match cadena exprReg2 length cadena index cadena1 cadena2 oper1 & oper2 retorna cuántos caracteres de cadena cumplen con la expresión regular exprReg2, asumiendo que está anclada al comienzo (como si tuviera un símbolo ^). Si no concuerda retorna un cero (0). Si se usan paréntesis para captura devuelve lo capturado. Como las expresiones comúnmente tienen símbolos con significado especial en el shell normalmente exprReg2 está encerrada en ' '. Para captura se usan paréntesis con escape \( \). exactamente equivalente a cadena : exprReg2. retorna la longitud -en caracteres- de cadena. retorna la primera posición en cadena1 donde cualquier caracter en cadena2 existe. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 302 retorna la subcadena tomada de cadena iniciada en la posición inicio y con longitud cuántos caracteres. substr cadena inicio cuántos Ejemplos: e@abe:e/> i=1 e@abe:e/> i=$(expr $i + 1) e@abe:e/> echo $i 2 El caso uno de los ejemplos muestra cómo realizar operaciones matemáticas básicas con las variables del shell: usando variable=$(expr operaciones ...). Nótese cómo debe usarse sustitución de comandos, sustitución de variables y espacios para separar los operandos y los operadores. e@abe:e/> CADENA="Nombre Propio" e@abe:e/> echo "Longitud =" $(expr length $CADENA) expr: 0402-050 Syntax error. Longitud = e@abe:e/> echo "Longitud =" $(expr length "$CADENA") Longitud = 13 El caso dos de los ejemplos muestra cómo es fácil cometer un error de sintaxis con expr. En nuestro ejemplo, la variable de texto contiene dos palabras, pero la operación length de expr espera un único operando -argumento- por lo que devuelve Syntax error. Se usan las comillas dobles para que el shell pase un único argumento al comando expr, pero que al mismo tiempo, la variable esté evaluada. e@abe:e/> CADENA="Nombre Propio" e@abe:e/> set -o vi e@abe:e/> echo "Longitud =" $(expr length '$CADENA') Longitud = 7 En el caso tres de los ejemplos se muestra cómo se evalúa la longitud de $CADENA no la longitud de los contenidos de la variable CADENA si se usan comillas sencillas!. e@abe:e/> RESP=s e@abe:e/> if expr "$RESP" : "[yYsS]" >/dev/null then echo RESP comienza con "y", "Y", "s" o "S" fi RESP comienza con y, Y, s o S El caso cuatro de los ejemplos muestra cómo usar el operador : (match) de expr. Si la primera cadena argumento concuerda con la expresión regular del segundo argumento expr devuelve la longitud de lo que concuerda y además retorna un cero (verdadero), así que el if se cumple. Como de pronto no conviene ver el 1 que reporta expr, se hace redirección a / dev/null. e@abe:e/> if VAL=$(expr "$RESP" : '\([yYsS]\)') then AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 303 echo "RESP begins with 'y', 'Y', 's' o 'S'" echo "VAL=$VAL" fi RESP begins with 'y', 'Y', 's' o 'S' VAL=S El quinto caso de los ejemplos muestra que se puede capturar la salida de expr para usarla después. En este caso se usa una expresión regular que contiene \( \) para capturar el texto de la concordancia. e@abe:e/> expr 7 / 2 3 El sexto caso muestra cómo expr sólo hace cálculos con enteros. e@abe:e/> expr index abcdef fd 4 El séptimo caso muestra el uso de la operación index del comando expr. e@abe:e/> expr substr "Goodnight Ladies" 11 6 Ladies El octavo caso de los ejemplos muestra el uso de la operación substr el comando expr. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 304 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 305 Comandos de control de flujo: if, then, else & fi Todo lenguaje de programación necesita sentencias de control de flujo. Como en el shell todo se basa en comandos, lo que aquí tenemos son comandos de control de flujo, el primero que veremos de los mismos es if. Hay varios estilos de la sintaxis: if comandoCondición then Comandos si verdadero ... fi o también if comandoCondición then Comandos si verdadero ... else Comandos si falso .. fi pero también if comandoCondición then Comandos si verdadero ... elif comandoCondicion2 Comandos si Condición2 verdadera ... else Comandos si falso ... fi Donde: La sentencia de control if ejecuta comandoCondición y analiza el código de retorno. Si devuelve verdadero (es decir 0), ejecuta lo anidado (Comandos si verdadero). Si hay una parte else y el comandoCondición devuelve falso (es decir no 0) ejecuta lo anidado (Comandos si falso). La sentencia de control if puede simular una sentencia “case ... select” de otros lenguajes de programación a través de la parte elif comandoCondición2. La sentencia de control if termina con un fi. Ejemplos: if [ "$VAL" = "Y" ] More...then AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 306 More... echo More...elif [ More...then More... echo More...else More... echo More...fi VAL igual S VAL igual Y "$VAL" = "S" ] VAL igual S VAL igual a otra cosa En el caso uno de los ejemplos se observa el uso más típico del comando test: combinado como comandoCondición con el comando if. e@abe:e/> if grep -q root /etc/passwd More...then More... echo root existe en /etc/passwd More...fi root existe en /etc/passwd En el caso dos de los ejemplos se observa cómo cualquier comando es válido para usar con if, aunque hay que verificar que el comando si devuelve códigos de retorno que tengan sentido. En el caso del ejemplo, grep devuelve verdadero si la expresión regular del primer argumento está o se encuentra entre las líneas de los archivos dados. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 307 Comandos de control de flujo: for, do & done Normalmente una computadora es útil para tareas repetitivas. Una tarea que no se repite no amerita programación la verdad. Existen varias maneras de llevar a cabo tareas repetitivas en el shell. La primera manera que veremos es la de repetir una tarea un número finito dado de veces, usando una ligera variación en un valor en cada una de las repeticiones. Para este estilo de repeticiones existe el comando for en el shell. La sintaxis es muy sencilla: for variable in lista do comandos ... done Donde: El comando for creará una nueva variable si no existe. El comando for inicia tomando el primer valor de lista, asignándolo a variable y ejecutando todos los comandos anidados. El comando for prosigue tomando el siguiente valor de lista, asignándolo a variable y ejecutando todos los comandos anidados. El comando for termina con la ejecución donde variable tiene el último valor de lista. La secuencia de comandos del shell continúa en la línea que sigue a done. Ejemplos: e@abe:e/> for i in 1 2 3 4 More...do More... echo $i More...done 1 2 3 4 El caso del ejemplo muestra lo básico del comando for. Nótese cómo la lista se le da literal, expandida, for no recibe un rango y fabrica los elementos. e@abe:e/> for FIL in *.tsv More...do More... echo "Archivo: $FIL" More...done Archivo: Celulares.tsv Archivo: Empresas.tsv AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 308 En el segundo caso de los ejemplos se observa cómo puede aprovecharse que las sustituciones de comodines del shell generan listas de nombres de archivos, así que pueden usarse con el comando for. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 309 Comandos de control de flujo: while, do & done Otro estilo de estructura de ejecución repetitiva no tiene los elementos prefabricados, así que no se sabe inicialmente cuántas repeticiones habrá que hacer. Lo que sí se sabe es cuándo hay que seguir repitiendo o cuándo hay que parar. Para este estilo de repetición existe el comando de shell while. Es también muy sencillo (tal vez más que for): while comandoCondición do comandos ... done Donde: El comando while ejecuta al comandoCondición y analiza si el código de retorno es verdadero. Mientras el código de retorno de comandoCondición sea verdadero el comando while ejecutará todos los comandos anidados. Cada vez que termina un ciclo de comandos anidados el comando while reejecuta comandoCondición, analizando nuevamente si el código de retorno es verdadero. Cuando el comandoCondición retorne diferente de verdadero el comando while dejará de ejecutar los comandos anidados y terminará. La ejecución continúa en la línea que sigue a done. Ejemplos: e@abe:e/> while who | grep -q root More...do More... write root << FIN More... Hola root More...FIN More... sleep 30 More...done e@abe:e/> El caso de los ejemplos ejecuta un comando who, y un comando grep que busca a root dentro de la lista de usuarios generada por who. El comando ejecutará los anidados write y sleep mientras se encuentre a root conectado como usuario. Estando dentro de un ciclo for o un ciclo while puede romperse usando el comando break. Este incondicionalmente se sale del ciclo y continúa en la línea que sigue al done: e@abe:e/> i=1 e@abe:e/> while true do printf $i AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 310 i=$(expr $i + 1) [ $i -eq 5 ] && break echo -- done 1 2 3 4 En el ejemplo se muestra el uso del comando break. Nótese cómo se sale inmediatamente del ciclo while, ni siquiera pasa por el comando echo que sigue. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 311 Manipulación de variables: let Como la manipulación aritmética de variables usando sustitución de variables y sustitución de comandos apoyándose en expr es supremamente incómoda, los intérpretes que cumplen POSIX -como Korn Shell- incluyen el comando let. El comando let permite el trabajo aritmético con variables sin necesidad de estar usando el prefijo $ por ejemplo, además sabe reconocer las expresiones aún cuando no están separadas por espacios. La sintaxis de let es sencilla: let expresión o let variable=expresión o también (( expresión )) Donde: El comando let y la construcción (( )) son equivalentes. El comando let devuelve verdadero si las operaciones de las expresiones pudieron ejecutarse y no resultaron en cero (0). El comano let soporta muchos operadores, a saber: ‣ -expr el negativo de expr ‣ !expr 0 cuando expr es diferente de cero, de lo contrario 1 ‣ ~expr el complemento de expr ‣ expr1 * expr2 producto de expr1 y expr2 ‣ expr1 / expr2 cociente de expr1 entre expr2 ‣ expr1 % expr2 residuo de dividir expr1 entre expr2 ‣ expr1 + expr2 suma de expr1 más expr2 ‣ expr1 - expr2 diferencia de expr1 con expr2 ‣ expr1 << expr2 desplazamiento de expr2 bits a la izquierda de expr1 ‣ expr1 >> expr2 desplazamiento de expr2 bits a la derecha de expr1 ‣ expr1 <= expr2 1 si expr1 es menor o igual que expr2, de lo contrario 0 ‣ expr1 < expr2 1 si expr1 es menor que expr2, de lo contrario 0 ‣ expr1 > expr2 1 si expr1 es mayor que expr2, de lo contrario 0 ‣ expr1 >= expr2 1 si expr1 es mayor o igual que expr2, de lo contrario 0 AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 312 ‣ expr1 == expr2 1 si expr1 es igual que expr2, de lo contrario 0 ‣ expr1 != expr2 1 si expr1 no es igual que expr2, de lo contrario 0 ‣ expr1 & expr2 AND de los bits de expr1 con los bits de expr2 ‣ expr1 | expr2 OR de los bits de expr1 con los bits de expr2 ‣ expr1 ^ expr2 XOR de los bits de expr1 con los bits de expr2 ‣ expr1 && expr2 1 si tanto expr1 como expr2 son no-cero, de lo contrario 0 ‣ expr1 || expr2 1 si alguno de expr1 o expr2 es no-cero, de lo contrario 0 ‣ var = expr asigna el valor de expr a la variable var ‣ var += expr var agrega el valor de la expresión expr al valor actual de la variable ‣ var -= expr resta el valor de la expresión al valor actual de la variable ‣ var *= expr multiplica el valor de la variable por el valor de la expresión ‣ var /= expr divide el valor de la variable entre el valor de la expresión ‣ var %= expr asigna a la variable el valor de dividirla por el valor de la expresión ‣ var <<= expr desplaza el valor de la variable expr bits a la izquierda ‣ var >>= expr desplaza el valor de la variable expr bits a la derecha ‣ var &= expr asigna a la variable el resultado de var & expr ‣ var |= expr asigna a la variable el resultado de var | expr ‣ var ^= expr asigna a la variable el resultado de var ^ expr Ejemplos: e@abe:e/> let i=1 e@abe:e/> let i+5*4 e@abe:e/> echo $i 1 e@abe:e/> let i=i+5*4 e@abe:e/> echo $i 21 e@abe:e/> let i=5 j=4 e@abe:e/> if (( i*j<25 )) More...then More... echo "i*j es menor que 25" More...fi i*j es menor que 25 Como se observa en los ejemplos, el comando let permite definir variables. De paso las variables quedan definidas como enteras. El comando let deja hacer operaciones aunque el AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 313 valor se pierda, se nota que no reporta resultados por salida estándar; este estilo de uso sólo tiene aplicación real cuando sirve de comandoCondición para if o para while. Más adelante se muestra cómo hacer operaciones con let permite ahorrarse $ en la sustitución de variables, y permite ahorrarse $( ) para la sustitución de comandos. Además, no importan tanto los espacios entre operando y operador. En los ejemplos también se muestra cómo se pueden definir y redefinir varias variables en una sola invocación del comando let. Posteriormente se muestra cómo usar la sintaxis alterna (( )) equivalente a let. Esta sintaxis no solo es más clara, si no que no es necesario hacer escape de los símbolos que let usa para aritmética como | o >. AIX/Unix 5 Basics for Operators Ramón Barrios Lascar iKnow 314