Linux Principios Básicos de Uso Del Sistema 1

February 14, 2017 | Author: Alberto Bollo | Category: N/A
Share Embed Donate


Short Description

Download Linux Principios Básicos de Uso Del Sistema 1...

Description

Linux Principios básicos de uso del sistema Este libro sobre GNU/Linux se dirige a cualquier informático que desee dominar los principios básicos de este sistema operativo o que quiera organizar y consolidar los conocimientos adquiridos con la práctica. Presenta de forma detallada los principios básicos del sistema y describe con precisión los comandos fundamentales para usar la línea de comandos shell, con ayuda de muchos ejemplos: el árbol de Linux, el manejo de archivos, el editor de texto, los permisos de acceso, la gestión de procesos, el shell Bash, los scripts Bash, la gestión de las cuentas de usuario, las herramientas Linux, etc. Los conceptos presentados en este libro son esenciales para entender el funcionamiento del sistema GNU/Linux para usuarios, y a su vez indispensables para el lector que quiera avanzar después en la administración de sistemas. Se puede utilizar como libro de referencia para que el lector adquiera la independencia necesaria tanto en entornos gráficos como en línea de comandos. Con esta nueva edición descubrirá las novedades y particularidades de las últimas distribuciones Linux disponibles.

Los capítulos del libro: Prefacio – Introducción – Inicio de sesión y primeros comandos – Documentación – El árbol de Linux – Manipulación de archivos – Edición de archivos de texto - Vi – Permisos de acceso a los archivos – Administración de procesos – Shell Bash – Programación y scripts Bash – Administración de la cuenta de usuario – Herramientas de Linux – Configuración básica del sistema Nicolas PONS Nicolas Pons dirige una consultoría informática y dispone de la certificación del LPI (Linux Professional Institute). Asimismo, es responsable pedagógico y docente en un centro de formación. Su sólida experiencia en la administración y desarrollo de sistemas, junto a su capacidad pedagógica, hacen que el lector tenga entre sus manos una obra realmente práctica sobre los principios básicos para el manejo de un sistema Linux.

prefacio Bienvenidos a este libro sobre el uso del sistema operativo GNU/Linux. Hoy en día, el uso de los sistemas informáticos es omnipresente, llega a tal punto que en una entrevista de trabajo se puede llegar a dudar de la capacidad de uno para conducir un vehículo, ¡pero se asume que ya sabe "usar" un sistema informático! Dicho esto, aunque la mayoría de lectores tenga el permiso B1, la cosa no está tan clara cuando se trata de manejar un vehículo de dos ruedas o un semirremolque... Aparquemos ese coche con el que nos sentimos tan seguros -no he dicho llevarlo al chatarrero- y aprendamos a manejar ese cachivache llamado Linux.

Aprendo a conducir... "Nunca he cogido un volante y lo de las marchas me da miedo". Si es su caso, ha encontrado el manual adecuado para dar los primeros pasos. Como si fuera un profesor de autoescuela, le acompañaré a lo largo de manual aportando detalles de cada concepto básico. Al principio no tendrá que preocuparse por cambiar de marcha, lo iremos añadiendo a medida que vayan pasando los capítulos. "Sé conducir desde hace tiempo porque aprendí lo básico con la ayuda de un familiar en la recta que hay delante de casa." Estupendo, muy valiente, pero puede ser peligroso cuando haya que hacer viajes largos o si aparece algún obstáculo. En ese caso le enseñaré los trucos para aparcar a la primera, o le recordaré que antes de adelantar hay que poner el intermitente... Aunque podamos alcanzar los 90 km/h en tercera, si entendemos un poco de mecánica nos daremos cuenta rápidamente de que lo mejor es cambiar de marcha. "Me saqué el carnet y conduzco bien pero hasta ahora mis trayectos han sido casatrabajo-supermercado-casa." Pues saquemos el mapa y disfrutemos conduciendo por carreteras secundarias o por autovías. Será mucho más agradable y útil cuando haya un atasco en hora punta. "¡Soy un gran conductor y sé todo lo que hay que saber!" Yo también podría decirlo pero debo confesar que nunca me acuerdo en qué lado de la calle puedo aparcar cuando veo esa maldita señal de estacionamiento alterno... Por suerte llevo siempre el manual en la guantera. Paso a paso... Antes de coger el volante veremos qué tenemos entre manos y detallaremos los términos utilizados en el resto del libro ubicándolos en su contexto histórico. Iremos del desarrollo del motor Linux a los acabados que nos ofrece el concesionario con los folletos para ensalzar la calidad del producto. Y como no puede esperar a escuchar el ruido del motor y no hay nada mejor que ir al grano, a partir del segundo capítulo le daré las llaves para arrancar, y una vez en marcha empezaremos a tocar alguno de los botones del salpicadero. Para no perderse por el camino y dado que el modelo tiene un montón de opciones, lo ideal será conocer, gracias al tercer capítulo, que la documentación está en un lugar concreto. ¡Así le ahorraré tirarse un cuarto de hora para cambiar una bombilla mientras se machaca el índice en el interruptor hasta encontrar la lengüeta adecuada! Los capítulos cuatro, cinco y seis servirán para visitar ciudades con una densa red de carreteras. Después de consultar el mapa, vamos a pasar por el laberinto de caminos e incluso aprenderemos a crear nuestro propio mundo... o simplemente a modificar el ya existente. El capítulo siete explicará que no estamos solos en carretera, incluso podemos crear un circuito privado e invitar a los amigos a utilizarlo, y si se quiere, podemos utilizar varios vehículos a la vez; de ello hablaremos en el capítulo ocho.

Cuando se sienta cómodo al volante, veremos las lucecitas y botones del salpicadero que no conoce pero que son de gran utilidad para nuestra comodidad. En los capítulos nueve y diez veremos cómo ajustar la altura del asiento, encender las luces antiniebla y el limitador de velocidad automático. ¡Los amantes del tunning deben leer el capítulo once para que su coche deje de ser uno más! Por último, el capítulo doce será la caja de herramientas y si le gusta la mecánica, tras ello encontrará los fundamentos de este arte en el último capítulo que puede que le conduzca a hacer unas prácticas en un taller. Los camioneros, una gran familia... Con la esperanza de no haberle perdido con mis metáforas, sepa que si un día tiene una avería en carretera bastará con extender el pulgar: siempre habrá un amable conductor que le ayudará. ¡Buen viaje!

Historia de Unix En 1969, Ken Thompson, desarrollador de los laboratorios Bell (que forman parte de AT&T), inventó el sistema Unix. K. Thompson había trabajado previamente en el sistema Multics que permitía, entre otras cosas, ocultar el sistema al usuario e incluso al programador; el objetivo era poder desarrollar nuevas aplicaciones haciendo abstracción del sistema. Cuando Bell Labs se retiró del proyecto Multics, empezó a desarrollar su propio sistema en un equipo DEC PDP-7 salvado de la quema. Conservó ciertas ideas desarrolladas por Multics y añadió sus propias innovaciones: acababa de nacer Unix.

UNIX es la abreviatura conservada de UNICS y significa UNiplexed Information and Computing System. A su vez, Dennis Ritchie inventó un nuevo lenguaje de programación: el lenguaje C. En línea con Unix, este lenguaje pretendía ser amigable, flexible y sin restricciones. Los laboratorios Bell, que conocían las herramientas desarrolladas, respaldaron a este dúo con una prima en 1971 para la elaboración de un sistema de automatización de escritorio de uso interno. En realidad, los sistemas desarrollados hasta entonces estaban codificados en lenguaje ensamblador, próximo a la arquitectura de hardware, lo que les confería un alto rendimiento, pero obligaba también a reescribir el programa cuando el hardware obsoleto era reemplazado por equipos más recientes. Comprendiendo que los avances tecnológicos podían paliar una pérdida de rendimiento y que las técnicas de compilación habían experimentado grandes progresos, D. Ritchie y K. Thompson dieron prioridad a

la portabilidad del sistema. Al escribir la totalidad del sistema Unix en lenguaje C, consiguieron hacer funcionar el sistema en muchos equipos de tipos diferentes a partir de 1974. Así, un compilador de C desarrollado para cada equipo bastaba para hacer posible el uso del mismo entorno en diferentes equipos; esto no se había hecho nunca y abría grandes posibilidades. El desarrollo de aplicaciones ya independientes del hardware disminuía considerablemente los costes de diseño para el usuario cuando era necesario renovar un equipo que se había quedado anticuado. Además, los programadores podían fabricarse cajas de herramientas de software y transferirlas de un equipo a otro sin tener que reinventarlo todo. Bajo el impulso de AT&T Unix se desarrolló rápidamente. En 1980, este sistema estaba ya muy extendido en las universidades y en los centros de investigación. La universidad de California en Berkeley (que utilizaba Unix desde hacía varios años) aportó diferentes mejoras a este sistema operativo, actualmente más conocido por el acrónimo de BSD (Berkeley Software Distribution). De hecho, los desarrollos "Berkeley" se publicaron paralelamente a los realizados por el grupo de trabajo de Unix de AT&T. Actualmente, la mayor parte de los sistemas operativos de tipo Unix en el mercado son una mezcla del código original de AT&T y de las "mejoras de Berkeley".

GNU Debido a la imposibilidad de obtener y modificar el código fuente del controlador de la impresora nueva que llegó a su departamento, Richard Matthew Stallman (conocido con el acrónimo de rms), entonces joven investigador en el laboratorio de Inteligencia Artificial del MIT (Massachusetts Institute of Technology), se concienció de los riesgos vinculados con software propietario; para oponerse a la comercialización del software y más particularmente a la falta de disponibilidad del código fuente, inició entonces un movimiento para el desarrollo de software libre de derechos en 1984.

Desarrollador con talento, Richard Stallman es también el creador del editor de texto GNU Emacs, del compilador C de GNU y del depurador GNU; su sitio Web personal se encuentra en la dirección: http://www.stallman.org. Este movimiento se tradujo en la creación de un proyecto que consistía en reescribir completamente un sistema operativo libre. El modelo seguido era Unix, Unix y Richard Stallman llamó a su proyecto GNU, que significa GNU’s Not Unix. El proyecto GNU conoció rápidamente un gran éxito y muchas herramientas y aplicaciones de Unix se desarrollaron a partir de cero (from scratch).

Sin embargo, el núcleo libre de este sistema, llamado "Hurd", no se desarrolló tan rápidamente. El proyecto GNU se limitó durante cierto tiempo a ser una gama de herramientas completa de Unix sin núcleo.

El uso de acrónimos recursivos como "GNU" es habitual en el mundo del software libre . De forma general, los programadores de software libre tienen un gran sentido del humor y utilizan a menudo el guiño para dar nombre a sus aplicaciones. Así, la versión GNU del shell Bourne de Unix se llama el Bash, de Bourne Again SHell (o también Born Again SHell). Asimismo, el nombre Hurd significa Hird of Unix-Replacing Daemon y Hird significa a su vez Hurd of Interfaces Representing Depth, ¡lo que forma un doble acrónimo recursivo!

1. FSF Richard Stallman creó la Free Software Foundation con el objetivo de recoger fondos destinados a financiar el software libre. Para él, el término "libre" se refiere a la libertad, y no al precio. No se opone al hecho de vender programas, siempre que el código fuente esté disponible y todo programador esté autorizado a modificar y redistribuir el software. Con este espíritu, R. Stallman creó en 1985 la FSF (Free Software Foundation http://www.fsf.org) para promover el apoyo financiero de su proyecto.

2. CopyLeft y GPL Para llevar a buen puerto su proyecto y permitir la difusión del software libre, Richard Stallman implementó una licencia específica. Esta licencia evita que cualquiera, tras modificar unas pocas líneas de un software libre, se apropie del código fuente y establezca un copyright. Los fundamentos del software libre se agrupan bajo cuatro libertades:    

La libertad de ejecutar el software para cualquier uso, comercial o no, y por cualquier persona u organización. La libertad de estudiar el funcionamiento del software y de adaptarlo a nuestras necesidades. Para ello, el acceso al código fuente es un requisito. La libertad de distribuir copias, gratuitas o no. La libertad de mejorar el software, publicar esas mejoras para que toda la comunidad pueda disfrutar de ellas. Y como mencionamos en el punto 2, el acceso al código fuente es un requisito fundamental.

A esto, la licencia GPL (General Public License) creada por Richard Stallman añade la obligación de seguir bajo licencia libre; esta noción se llama "copyleft" (copia permitida) en oposición a "copyright" (derechos de autor) e implica que cualquier software que utilice una parte del código regido por la GPL se someta automáticamente y por completo a los términos de la GPL.

Así, todo programa desarrollado bajo los términos de esta licencia será totalmente libre de uso sin que pueda apropiárselo nadie porque deberá seguir siendo GPL. Según esto, se podría redefinir el acrónimo GPL como Guaranteed Public for Life (garantía de seguir siendo público de por vida).

La FSF publicó el 29 de junio de 2007 la versión 3 de la GPL que permite adaptarse mejor a determinadas evoluciones de la informática. Trata en particular del problema del software libre embebido cuyo código fuente sí está disponible, pero que no puede funcionar modificado en los equipos (appliances) sin una firma digital específica; la GPL3 prevé que los constructores deben dar todos los elementos necesarios al funcionamiento de una versión modificada de un software bajo esta licencia sobre los hardware vendidos. Una variación a esta restricción es no poder acceder a un servicio web por el mero hecho de modificar la aplicación utilizada a pesar de la licencia libre; eso ya no es posible con la versión 3 de la GPL. Otro elemento clave de esta versión de la licencia es la protección de los usuarios de software libre contra las patentes de software; así, ya no son posibles acuerdos como el llevado a cabo entre Novell y Microsoft, que contienen la autorización para los clientes de Novell de utilizar el software libre que depende de patentes de Microsoft. Toda la información sobre esta última versión de la licencia libre GPL está disponible en la página http://gplv3.fsf.org Sin embargo, no hay que confundir un software bajo GPL con un software perteneciente al dominio público; este último no siempre tiene un copyright, cualquiera puede apropiarse de él tras una modificación menor. Asimismo, un "freeware" no es un software libre porque el código fuente de la aplicación no está disponible. Finalmente, existen otras licencias para los programas libres, con copyleft o no, como la X Consortium, la Artistic o bien la licencia BSD que, a diferencia de la GPL, no impone la difusión de las modificaciones aportadas.

Condiciones generales de uso Copyright - ©Editions ENI

Linux Cuando utilizaba el sistema operativo Minix, desarrollado por Andrew S. Tanenbaum con el objetivo de mostrar a sus estudiantes el funcionamiento de un sistema de tipo Unix, en un proyecto de estudios sobre el modo protegido de los procesadores Intel 386, Linus Torvalds empezó a desarrollar su propio núcleo Unix para añadirle nuevas funcionalidades. Por tanto, Linux (Linus’s Unix) nació en 1991 gracias a un estudiante de la universidad de Helsinki. El éxito de Linux se basa en una idea ingeniosa de su creador, L. Torvalds: colocar su proyecto bajo los términos de la licencia GPL y proponer a todos los programadores y otros hackers de Internet que le ayudaran.

El término "hacker" no debe confundirse con el de "cracker", que designa a un individuo que intenta introducirse de forma ilegal en un sistema informático para utilizar sus recursos o alterar sus datos. El término hacker representa aquí a los primeros programadores en los sistemas Unix convertidos sin duda en verdaderos "gurús" en su dominio y no al pirata informático malintencionado. Fue en un grupo de discusión (Usenet) dedicado al sistema Minix donde L. Torvalds anunció públicamente su proyecto, que por entonces sólo era ”un pasatiempo sin pretensiones”: From: [email protected] (Linus Benedict TorValds) Newsgroups: comp.os.minix Subject: What would you like to see most in minix? Summary: small poll for my new operating system Message-ID: Date: 25 Aug 91 20:57:08 GMT Organization: University of Helsinki Hello everybody out there using minix I’m doing a (free) operating system (just a hobby, won’t be big and professional like gnu) for 386(486) AT clones. This has been brewing since april, and is starting to get ready. I’d like any feedback on things people like/dislike in minix, as my OS resembles it somewhat (same physical layout of the file-system (due to practical reasons) among other things). I’ve currently ported bash(1.08) and gcc(1.40), and things seem to work. This implies that I’ll get something practical within a few months, and I’d like to know what features most people would want. Any suggestions are welcome, but I won’t promise I’ll implement them :-) Linus ([email protected]) PS. Yes - it’s free of any minix code, and it has a multi-threaded fs. It is NOT portable (uses 386 task switching etc), and it probably never will support anything other than AT-harddisks, as that’s all I have :(.

O, en nuestro idioma: Saludos a los usuarios de minix. Estoy haciendo un sistema operativo (libre), (es sólo un pasatiempo, no será importante y profesional como gnu) para sistemas 386 (486) AT clones. Se inició en abril y está empezando a tomar forma. Me gustaría recibir algún comentario sobre las cosas que le gustan o no a la gente en minix, ya que mi sistema operativo se parece un poco (la misma disposición física de los archivos del sistema, debido a razones prácticas entre otras cosas).

Ya he exportado bash (1.08) y gcc (1.40) y las cosas parecen funcionar. Eso implica que pondré algo en práctica dentro de unos meses y me gustaría saber qué características desea la mayoría de las personas. Cualquier sugerencia será bienvenida, pero no prometo que puedan ser aplicadas :-) Linus ([email protected]) PD. Sí, es libre de cualquier código de minix y tiene un sistema de ficheros multihilos. NO es portable (386 utiliza la conmutación de tareas, etc.), y probablemente sólos erá compatible con discos duros AT, ya que es todo lo que tengo :-(.

El entusiasmo por Linux proviene en gran parte por el hueco que llenó en el núcleo del proyecto GNU: ¡por fin estaba disponible un sistema libre completo!

La mascota de Linux se llama "Tux" y es un pingüino, animal especialmente querido por Linus Torvalds.

1. Características Las principales características de Linux son las siguientes: Multitarea Está diseñado para ejecutar varios programas al mismo tiempo (PID - Process ID, codificados en 32 bits). Utiliza un asignador para ejecutar varias acciones con un mismo procesador y también puede sacar partido de arquitecturas multiprocesador (hyperthreading, SMP - Symmetric Multi-Processors, NUMA - Non-Uniform Memory Access). Multiusuario Este sistema permite el uso por parte de varias personas de los recursos que administra. Estas personas se distribuyen en grupos de usuarios y es necesaria una autenticación para asegurar los derechos individuales. Los UID (User’s ID) y GID (Group’s ID) están codificados en 32 bits. Multiplataforma Linux ha sido llevado a un gran número de arquitecturas de hardware, como Intel (del 386 al último Pentium) y sus clones (AMD, Cyrix), SPARC, MIPS, Dec Alpha, PowerPC, PalmPilot, x86-64 (64 bits), etc. Encontramos también Linux en sistemas embebidos, como autómatas industriales o autorradios MP3 para el particular.

Sistemas de archivos Linux soporta un gran número de sistemas de archivos, además de los de tipo Unix, incluidos ISO9660 (CD-ROM), Windows 9x, NTFS y Macintosh. Soporta también las ACL (Access Control List) y las cuotas. Administración de memoria En vez de efectuar un ”swap” de procesos completos, el núcleo pagina la memoria virtual, lo que limita los accesos al disco cuando falta memoria física. Además, la memoria compartida con copia en escritura permite que varios procesos utilicen el mismo espacio de memoria; cuando uno de ellos intenta escribir en la memoria, se realiza una copia de la página de memoria en otra parte. Este mecanismo optimiza el uso y la cantidad de memoria necesaria en el sistema. Además, Linux soporta hasta 64 GB de RAM con las funciones de hardware PAE (Physical Address Extension) en arquitecturas 32 bits de Intel. Redes Como cualquier otro Unix, Linux posee una capa de red muy fiable y rápida. Soporta un amplio abanico de protocolos (TCP/IP versiones 4 y 6, Netware, Appletalk, Lan Manager, IPX, IPsec...) y de dispositivos de red (Ethernet, TokenRing, FDDI, Wi-Fi...). Adecuación a numerosos estándares, como POSIX Existe por ejemplo un grupo de trabajo de la organización The Linux Foundation (http://www.linuxfoundation.org/) llamado LSB, de Linux Standard Base, que publica especificaciones y recomendaciones de estandarización de Linux. Grandes nombres de la informática (IBM, Intel, Oracle, AMD, Google, HP, Novell, Red Hat, Dell, Sony...) contribuyen y apoyan este proyecto. Compatibilidad Linux es compatible con Unix System V (AT&T) y BSD a nivel de código fuente, soporta las bibliotecas Unix en formato COFF y ELF y los binarios con SCO SVR3 y SVR4 con los módulos de emulación IBCS2.

2. Distribuciones Hablando con propiedad, Linux no es un sistema operativo, sino sólo su núcleo (kernel). Por sí solo no constituye la totalidad del sistema operativo; para ello, debe ir acompañado de las herramientas básicas comunes a todos los Unix. Estas herramientas estándar son en su mayor parte programas libres, que se encuentran también en Linux, generalmente en una versión GNU con muchas mejoras respecto a los originales. Entre estos programas, destaca el compilador GNU C/C++, uno de los mejores compiladores disponibles actualmente.

También hay que recordar el conjunto de comandos accesibles directamente desde un shell, como grep, find, awk o bien editores de texto, como vi. Para ser exactos, en realidad hay que utilizar el término GNU/Linux para designar este sistema y no "Linux", como ocurre demasiado a menudo. Con la ayuda de otros desarrolladores, Linus Torvalds ha ido añadiendo cada vez más herramientas y aplicaciones. Con el tiempo, diversas universidades, empresas y personas a título individual han ido distribuyendo Linux con su propia selección de paquetes para acompañar al núcleo Linux. Así nace el concepto de distribución de Linux. Actualmente, crear y vender una distribución de Linux puede representar un volumen de negocios de varios millones de dólares y es posible comprar las versiones en "caja" de grandes empresas como Red Hat o SUSE. Sin embargo, la mayor parte de estas distribuciones comerciales se pueden descargar libremente, así como las realizadas por grupos de personas apasionadas.

¿Qué distribución elegir? La elección de una distribución depende de muchos criterios: el coste, la gama de programas propuestos, la compatibilidad de hardware, las herramientas administrativas proporcionadas... No existen "buenas" ni "malas" distribuciones de GNU/Linux, pero, para ayudar al principiante a elegir, este apartado presenta una clasificación de las más conocidas según el tipo de necesidades a las que responden mejor. A fin de cuentas, la elección de una distribución de Linux dependerá tanto de las preferencias como de las muy subjetivas costumbres de la persona que quiere iniciarse en la aventura de Linux.

La web DistroWatch (http://distrowatch.com) informa sobre la actualidad, descripción y la clasificación de las distribuciones GNU/Linux más utilizadas. Asimismo, hay disponibles enlaces para descargarlas y para solicitar en línea versiones grabadas en CD-ROM o DVD-ROM.

1. Las distribuciones para el "gran público" Estas distribuciones proponen en su paquete de software la mayor parte de las herramientas que un usuario espera encontrar en su puesto de trabajo en red o en su equipo personal: incluyen un paquete de ofimática, programas de comunicación en red (navegador web, cliente de correo electrónico...), reproductores de multimedia y aplicaciones de creación gráfica. Las distribuciones propuestas a continuación se pueden descargar libremente. Fedora

El proyecto Fedora lo distribuye el editor Red Hat, en sustitución de su distribución estrella, que ya no está disponible actualmente en GPL. Esta distribución implementa muy regularmente las últimas innovaciones del mundo del software libre. Aunque la frecuencia de salida de esta distribución es elevada (una nueva versión cada seis a doce meses), ofrece une estabilidad y una calidad de integración ejemplares. Representa, por tanto, una buena opción para quien se inicia en busca de una distribución fácil de instalar y que proponga una amplia gama de programas recientes. Sitio del editor: http://fedoraproject.org openSUSE Es la variante libre y gratuita de la distribución profesional SUSE. Es de fácil manejo y cuenta con una gran comunidad de usuarios y desarrolladores. Sitio del editor: http://www.opensuse.org Ubuntu Distribución derivada de Debian y de su sistema de paquetes. Es muy accesible, los programas libres que ofrece se integran con gran facilidad y dispone de una gran comunidad de usuarios. El entorno de escritorio es Unity, que es una capa que funciona sobre GNOME. Existen además otras distribuciones como kunbuntu o lubuntu con KDE, Xfce o LXDE. Sitio del editor: http://ubuntu.com.

2. Las distribuciones "móviles" No siempre resulta evidente cambiar de un día para otro las costumbres informáticas. En ocasiones es preferible ”probar Linux” antes de cambiar de arriba abajo la configuración de un equipo. Por ello, algunas distribuciones no requieren instalación en el disco duro. Estas distribuciones están dotadas de un proceso muy avanzado de configuración automática del hardware. Su carga en memoria RAM se hace al iniciar el PC desde el CD-ROM (existen distribuciones arrancables a partir de una memoria USB). Además, este tipo de distribución permite llevarse y utilizar el mismo sistema en prácticamente cualquier tipo de PC. KNOPPIX KNOPPIX es un CD-ROM arrancable con un sistema operativo (GNU/Linux) para equipos de tipo PC. Gracias a un sistema de descompresión al vuelo, esta distribución contiene unos 2 GB de programas (9 GB en la edición DVD-ROM).

Tiene, entre otros, los siguientes usos:     

CD-ROM de demostración de Linux; CD-ROM de formación; sistema de seguridad; sistema operativo permanente completo porque puede instalarse también en el disco duro; sistema móvil si se instala en una memoria USB.

Sitio del editor: http://www.knoppix.org Ubuntu Se presenta como una distribución para el «gran público» que se puede utilizar directamente desde un CD-ROM, aunque dispone de una herramienta de instalación que ofrece al usuario la posibilidad de instalarlo directamente en el disco duro de la máquina. Sitio del editor: http://www.ubuntu.com

3. Las distribuciones "profesionales" Varios editores ofrecen distribuciones con una orientación profesional. Sus principales características son:    

una estabilidad mejorada al proponer en su paquete de software sólo aplicaciones robustas y probadas; un tiempo de vida más largo con un soporte del editor disponible más tiempo (actualizaciones de software y corrección de errores); un servicio de soporte técnico comercial en algunas de ellas; una especialización en ciertos dominios de Internet (alojamiento de sitio web, cortafuegos, servidor de correo electrónico, herramientas de trabajo en grupo, gestión de parque informático...).

Red Hat Actualmente es una de las distribuciones más extendidas. Conocida como RHEL (RedHat Enterprise Linux), su instalación es relativamente sencilla gracias a la detección y autoconfiguración de los dispositivos conectados. Existe también una versión «escritorio» (desktop) que facilita un entorno de trabajo profesional para los equipos de las empresas. Una de las ventajas de esta distribución es que es reconocida por los grandes editores de software, en particular por los editores de SGBD (Sistemas de gestión de base de datos); en efecto, toda aplicación profesional que funcione bajo Linux (Oracle por ejemplo) está disponible para esta distribución. Red Hat, que se encuentra en el origen de la herramienta RPM (Red Hat Package Manager), utiliza este formato de paquetes.

El editor ha puesto fin a la variante estándar bajo licencia de esta distribución (la última era la versión 9.0) y ha optado por concentrarse en una versión "Enterprise" con mayor seguimiento en el tiempo para responder a las necesidades de las empresas. Sitio del editor: http://www.redhat.es SuSE Esta distribución de origen alemán ofrece una serie de herramientas gráficas de configuración del sistema muy funcionales. Se la conoce también con el acrónimo SLES, de SuSE Linux Enterprise Server. Sitio del editor: http://www.suse.com/ Debian Es la distribución de Linux predilecta de los puristas del mundo libre porque no es comercial y ofrece únicamente programas libres en GPL. También se considera la más estable porque no interviene ninguna motivación pecuniaria en la elección de los paquetes que se deben incluir en la distribución. La contrapartida a estos puntos a favor es sin duda la falta de accesibilidad para una persona inexperta. La administración de este sistema requiere un profundo conocimiento del sistema Linux y la configuración normalmente se realiza mediante un editor de texto, en lugar de una herramienta gráfica de más alto nivel. Además, esta distribución cuenta con su propio formato de paquetes de software, con la extensión .deb. Sitio del editor: http://www.debian.org Slackware Es una de las primeras distribuciones de Linux, aparecida en 1995. Está considerada como muy estable, pero menos accesible para el neófito. Su paquete de software, más ligero que en las anteriores, cabe en un CD-ROM (exceptuando los CD-ROM de seguridad, de instalación en un sistema de archivos Windows y de fuentes, que no son necesarios). Los paquetes de esta distribución son archivos .tgz o .tar.gz. Sitio del editor: http://www.slackware.com

4. Las distribuciones "especializadas"

Existen otras distribuciones Linux para usos concretos. Algunas están especializadas en la recuperación del sistema, en la enseñanza, la seguridad o incluso en la puesta en marcha de servidores multimedia y de archivos. Están disponibles en el sitio http://distrowatch.com en diferentes idiomas y para una amplia gama de arquitecturas.

Convenciones tipográficas Este apartado presenta rápidamente las convenciones tipográficas utilizadas en esta obra.

1. Estilos de letra Los comandos, opciones, nombres de variables y ejemplos de sintaxis se escriben con este tipo de letra: ejemplo de comando. Los nombres de archivos se escriben en el estilo siguiente: ejemplo de nombre de archivo. Los ejemplos de línea de comandos se enmarcan así: ejemplo de línea de comandos

Mientras que los extractos de archivos de texto tienen la forma: extracto de archivo de texto

2. Teclado El teclado de referencia de esta obra es de tipo 105 teclas español. El nombre y la ubicación de las teclas son:

Una combinación de teclas expresada con el carácter + como separador significa que hay que pulsar simultáneamente las teclas enumeradas. Por ejemplo [Ctrl]+[Alt]+[F1] significa que el usuario tiene que pulsar simultáneamente las teclas [Ctrl], [Alt] y [F1

Consolas y terminales Linux Los términos "consola" y "terminal" se usan para definir el conjunto de dispositivos que permiten al usuario interactuar con el sistema; este conjunto generalmente se compone de una pantalla, un teclado y un ratón.

1. Consolas virtuales

Para ofrecer varios terminales al usuario desde un mismo conjunto de pantalla/teclado/ratón, Linux proporciona un cierto número de consolas virtuales. La ventaja de esta administración es que se dispone tanto de varias terminales de "texto" para las tareas que deben efectuarse desde una línea comandos, como de una consola "gráfica" que permite lanzar herramientas con una interfaz más evolucionada, como un programa de retoque de imágenes o un reproductor multimedia. Estas consolas virtuales, que generalmente son seis o siete en las distribuciones como Fedora, Ubuntu o Suse, se componen de cinco a seis terminales de texto y una consola gráfica. Se representan por las teclas de función [F1] a [F7] del teclado (siendo [F1] o [F7] la consola gráfica); para pasar de una a otra, hay que pulsar simultáneamente las teclas [Ctrl]+[Alt]+[Fn] donde n es el número de la consola virtual.

No es obligatorio pulsar la tecla [Ctrl] para pasar de un terminal de texto a otro. Una consola virtual de texto, o simplemente un terminal de texto, se parece a esto:

La consola virtual gráfica puede tomar diversos aspectos, según el entorno de escritorio elegido y la versión de la distribución de Linux; por ejemplo, en Fedora 19, con el entorno de escritorio KDE:

Y con el entorno GNOME en Ubuntu 13.04:

Es posible contar con más (o menos) de seis consolas virtuales de texto y más de una consola virtual gráfica en Linux. La configuración de este sistema no entra en el marco de este libro, por lo que consideraremos en lo sucesivo que disponemos de siete consolas virtuales, una de las cuales es gráfica.

2. Emuladores de terminales Bajo la interfaz gráfica de Linux, se pueden escribir comandos de la misma manera que en un terminal de texto. Para ello, se utiliza un programa que "emula" la línea de comandos de Linux dentro de una ventana. Hay muchos emuladores de terminal disponibles para Linux, como xterm, que es un estándar en todos los sistemas UNIX utilizados, o konsole, disponible en el entorno KDE:

La interfaz gráfica de Linux facilita generalmente varios iconos o menús con un pictograma parecido a una pantalla o a una concha para ejecutar emuladores de terminal.

3. Terminales remotos Otra manera de interactuar con la línea de comandos de Linux es el uso de una conexión de red y un software de comunicación remota, como Telnet o SSH, iniciado desde un terminal de texto. Desde ahí es posible controlar un sistema Linux desde otro Linux, o incluso desde un equipo Windows utilizando una herramienta como PuTTY bajo licencia GPL y por tanto descargable libremente:

Inicio de sesión, autenticación El sistema Linux es multiusuario, por lo cual hay que empezar por autenticarse en el equipo. La autenticación sirve para comprobar que el usuario situado delante de la consola es quien pretende ser. Tiene que facilitar su identidad (nombre de inicio de sesión o login) y una prueba de ésta (contraseña) para conectarse. Tanto si se trata del modo texto como del modo gráfico, la contraseña escrita por el usuario no se muestra en pantalla.

Al introducir el nombre de inicio de sesión y la contraseña se deben respetar escrupulosamente mayúsculas y minúsculas. De modo general, ya se trate de un nombre de archivo, de un login, de un nombre de variable o de un comando, la letra a no es igual que la letra A. Ejemplo de inicio de sesión en un terminal de texto Ubuntu 13.04 ubuntu tty1 ubuntu login: nicolas Password: Last login: Fri May 10 14:34:53 CEST 2013 on tty1 Welcome to Ubuntu 13.04 (GNU/Linux 3.8.0-19-generic x86 64) * Documentation:https://help.ubuntu.com/ [nicolas@ubuntu:~]$

Ejemplo de inicio de sesión en un terminal gráfico

Símbolo del sistema del shell (prompt) Una vez conectado a un terminal de texto, se inicia automáticamente un programa llamado shell. Éste permite escribir los comandos que indicaremos más adelante. El shell indica que está en espera de una instrucción presentando un símbolo del sistema (o prompt) al principio de la línea. Según la configuración predefinida por el editor de la distribución de Linux, este prompt puede tener varios aspectos; por ejemplo, en Red Hat: [nicolas@doe tmp]$

En Debian o Ubuntu: nicolas@doe:~$

O incluso: [root@doe bin]#

El elemento más importante en los prompt que acabamos de presentar es el último carácter de cada uno: un $ o un # en la mayoría de los casos. Este carácter indica que el usuario actual conectado es o bien un usuario cualquiera sin derechos especiales ($), o bien el administrador que cuenta con todos los derechos necesarios para la configuración y el mantenimiento del sistema (#).

Los demás datos del prompt del shell son el nombre del usuario (delante de @), el nombre del equipo (doe) y el nombre de la carpeta actual (tmp, ~ y bin). Para simplificar los ejemplos siguientes, el prompt del shell se reducirá a este último carácter ($ o #), precedido eventualmente del nombre del usuario entre corchetes: $

o: [nicolas]$

Condiciones generales de uso Copyright - ©Editions ENI

Sintaxis de los comandos

Es importante conocer la sintaxis de los comandos para evitar un gran número de errores de escritura. En su expresión más simple, sin opciones ni argumentos, un comando se lanza escribiendo su nombre en la línea de comandos: $ comando

En los ejemplos siguientes, el $ situado al principio de línea corresponde al prompt del shell y no debe ser escrito por el usuario. Si hay que especificar argumentos se añaden a continuación del comando en la misma línea, separados por un espacio: $ comando arg1 arg2

En la mayoría de los casos, los argumentos son los nombres de los archivos sobre los que actuará el comando. Los tratamientos o la salida (visualización) de un comando GNU/Linux a menudo se pueden modificar mediante una opción. Estas opciones, específicas para cada comando, provienen habitualmente de las implementaciones originales y de las aportaciones de los diferentes UNIX anteriores a Linux. Por esta razón, para un mismo comando, puede haber varias decenas de opciones con diferentes sintaxis. Existen principalmente dos tipos de opciones: las opciones monocarácter y las opciones largas. Ambas deben escribirse separadas por un carácter de espacio a continuación del comando y antes de los eventuales argumentos.

El carácter de espacio es un espacio o una tabulación y puede repetirse varias veces, tanto entre el comando, las opciones y los argumentos como al principio y al final de la línea. Las opciones monocarácter Las opciones monocarácter corresponden normalmente a las opciones heredadas de la familia UNIX y por lo general van precedidas por el carácter -: $ comando -o -p -t $ comando -o -p -t arg1 arg2

El orden de las opciones no es relevante; las dos líneas siguientes son equivalentes: $ comando -o -p -t $ comando -t -o -p

Las opciones monocarácter pueden agruparse siempre que se supriman los guiones y los caracteres de espacio intermedios: $ comando -o -p -t $ comando -opt

Para ciertos comandos con un gran número de opciones, las opciones monocarácter pueden introducirse con un + o incluso escribirse directamente: $ comando +o -pt $ comando opt

Por consiguiente, según el comando empleado, estas tres líneas no tienen por qué ser equivalentes: $ comando -o $ comando +o $ comando o

Finalmente, algunas opciones aceptan una cadena de caracteres como parámetro; en este caso, no hay forzosamente un espacio entre la opción y su parámetro: $ comando -oparámetro -pt

De manera general, las opciones monocarácter introducidas con un - provienen de comandos desarrollados para los sistemas que responden a la norma Unix98, mientras que las que no requieren guión proceden de los UNIX de la familia BSD. Las opciones largas Las opciones largas generalmente son opciones añadidas en el marco de la reescritura del comando GNU. Son más explícitas que las anteriores porque su nombre indica su utilidad y van precedidas por dos guiones --: $ comando --help $ comando --version

En el caso de una opción con parámetro, éste se separa con un espacio: $ comando --variable parámetro

Separación de opciones y argumentos Según su sintaxis, realizar la distinción entre opciones y argumentos puede ser difícil. Si una opción a va precedida por un guión y la cadena de caracteres -b como argumento, la sintaxis siguiente puede crear confusión: $ comando -a -b

En este ejemplo, la cadena de caracteres -b se tratará como la opción b introducida por un guión, y no como un argumento. Para evitar toda ambigüedad, se separa las opciones de los argumentos en la línea de comando intercalando dos guiones; en el problema anterior, esto nos da: $ comando -a -- -b

Cuando el shell encuentra -- en la línea de comando, interpreta todas las cadenas de caracteres siguientes como argumentos del comando. Aplicaciones con interfaces gráficas Es natural iniciar las herramientas gráficas utilizando atajos como los iconos y los menús ofrecidos por el entorno de escritorio. Sin embargo, todas estas aplicaciones pueden ser instanciadas a partir de un comando escrito en la línea de un emulador de terminal. Así, la línea siguiente -de la misma manera que el icono correspondiente- permite ejecutar el navegador web Firefox: $ firefox

Es bueno conocer el nombre de los comandos gráficos y ejecutarlos de esa manera ya que puede que no existan los mismos atajos en unos u otros entornos de escritorio o en unas u otras distribuciones. Las opciones de comandos con interfaz gráfica presentan una sintaxis diferente de las otras: una cadena de caracteres introducida por un solo guión; por ejemplo, para mostrar el reloj con un fondo rojo: $ xclock -bg red

Atajos de teclado 1. En modo texto Los atajos presentados aquí son los propios del shell Bash que se usa de modo predeterminado en Linux; funcionan tanto en una consola virtual de texto como en un emulador de terminal. Control de visualización Borra la pantalla y coloca el prompt del shell en la primera línea del terminal. Sube media página en la pantalla del terminal (igual que un deslizador); muy práctico para ver el resultado de un [Mayús]+[RePág] comando un poco largo. Es posible subir entre cinco y seis páginas en función de la configuración del sistema. [Ctrl]+[l]

[Mayús]+[AvPág]

Al contrario del atajo anterior, baja media página en la pantalla del terminal.

Edición de la línea de comando [Inicio] [Fin] [Izquierda] [Derecha] [Supr] [Retroceso] [Ctrl]+[w] [Ctrl]+[u]

Mueve el cursor al principio de la línea. Mueve el cursor al final de la línea. Mueve el cursor un carácter hacia la izquierda. Mueve el cursor un carácter hacia la derecha. Suprime el carácter a la derecha del cursor. Suprime el carácter a la izquierda del cursor. Borra la última palabra. Borra toda la línea.

Historial de comandos Sube por el historial de comandos. Cada pulsación de esta tecla permite mostrar el comando anterior de los que se han ejecutado [Arriba] anteriormente en el shell; a continuación se puede modificar el comando antes de ejecutarlo de nuevo. Baja por el historial de comandos. Esta acción es válida sólo si el [Abajo] usuario ha subido previamente por el historial con el atajo anterior. Busca una cadena de caracteres en el historial de comandos. La búsqueda se efectúa a medida que el usuario escribe los caracteres [Ctrl]+[r] de la cadena. Si la cadena está contenida en varios comandos del historial, una pulsación más de [Ctrl]+[r] permite proseguir la búsqueda subiendo más por el historial. [Ctrl]+[j] Termina una búsqueda iniciada con [Ctrl]+[r] y permite al usuario o [Esc] modificar la línea antes de ejecutarla. [Ctrl]+[g] Anula una búsqueda iniciada con [Ctrl]+[r]. Varios Interrumpe el comando en curso sin esperar el fin de su ejecución normal. Envía el carácter de fin de archivo (EOF o End Of File). Indica al [Ctrl]+[d] comando en curso que la entrada por teclado ha finalizado. Marca una pausa en la visualización del terminal (equivale a una [Ctrl]+[s] pulsación de la tecla [Bloq Despl]). Prosigue la visualización de un terminal parado anteriormente [Ctrl]+[q] (equivalente a una segunda pulsación de la tecla [Bloq Despl]). [Ctrl]+[c]

2. En modo gráfico

Los atajos de teclado disponibles en la interfaz gráfica dependen del administrador de ventanas y del entorno de escritorio utilizado. Los entornos más conocidos actualmente son KDE (K Desktop Environment) y GNOME (GNU Network Object Model Environment); su rápida evolución y la diversidad de aplicaciones disponibles en GNU/Linux no permiten enumerar los numerosos atajos implementados.

Condiciones generales de uso Copyright - ©Editions ENI

Primeros comandos Estas primeras aplicaciones proporcionan un buen ejemplo de uso de la línea de comando de Linux y permiten efectuar operaciones esenciales del sistema; algunas de ellas se utilizarán de nuevo posteriormente en este libro.

1. Identidad de los usuarios: who, whoami, finger El comando who enumera todos los usuarios conectados actualmente al sistema: [nicolas]$ who nicolas vc/1 root pts/0

Apr Apr

3 01:04 2 22:42 (192.168.200.1)

En este ejemplo, el usuario nicolas está conectado a la primera consola virtual de texto (vc/1 o tty1) desde el 3 de abril a las 1:04 y el administrador (root) está conectado desde un emulador de terminal (pts/0) remoto (192.168.200.1), desde el 2 de abril a las 22:42. Con la opción -q, el propio comando who enumera únicamente los nombres de conexión y da el total del número de usuarios conectados actualmente: [nicolas]$ who -q nicolas root # usuario=2

Por el contrario, el comando who am i que posee una sintaxis muy particular -la cual recuerda las preferencias de los productores cinematográficos por los sistemas informáticos que comprenden el lenguaje natural-, muestra únicamente la línea que corresponde al usuario conectado: [nicolas]$ who am i nicolas vc/1

Apr

3 01:04

El comando whoami, por su parte, indica la identidad bajo la que se encuentra actualmente el usuario:

[nicolas]$ whoami nicolas

Siempre respecto a los usuarios del sistema, el comando finger muestra una descripción más precisa de una cuenta: $ finger Login Name Phone nicolas Nicolas Pons root root

Tty

Idle

Login Time

Office

Office

vc/1 1 Apr 3 01:04 pts/0 Apr 2 22:42 (192.168.200.1)

La columna Idle muestra el tiempo de inactividad de los usuarios (en minutos, si no se ha precisado ninguna unidad). Para obtener aún más precisiones sobre un usuario, se indica su nombre de conexión como argumento del comando finger: $ finger nicolas Login: nicolas Name: Nicolas Pons Directory: /home/nicolas Shell: /bin/bash On since Mon Apr 3 01:04 (CEST) on tty1 1 minute 12 seconds idle No mail. No Plan.

Además de la información de conexión del usuario nicolas, se constata aquí que:     

Su nombre real es "Nicolas Pons". Su directorio personal es /home/nicolas. Su shell predeterminado /bin/bash. Este usuario no tiene mensajes de correo en su buzón. No se indica nada en su archivo personal .plan.

Los usuarios inscriben en su archivo .plan ("planning") sus reuniones, citas y otra información que figura en su agenda.

2. Cambio de contraseña: passwd El comando passwd permite al usuario modificar su contraseña. A diferencia del comando anterior, éste es interactivo y solicita al usuario que escriba su antigua contraseña antes de escribir dos veces la nueva: [nicolas]$ passwd Changing password for nicolas (current) UNIX password: Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully

Las contraseñas no aparecen al escribirlas y el sistema exige escribir una contraseña válida; según las reglas establecidas por el administrador, la contraseña deberá incluir

un mínimo de seis caracteres y estar compuesta de letras (minúsculas o mayúsculas) y cifras.

Sólo el administrador del sistema tiene autorización para cambiar la contraseña de otro usuario especificando el login de la cuenta de usuario como argumento en la línea de comando.

3. Conteo: wc Del inglés "Word Count", el comando wc permite contar el número de líneas, palabras y caracteres contenidos en un archivo: [nicolas]$ wc /etc/archivo 2 14 82 /etc/archivo

Las opciones -l, -w y -c permiten contar respectivamente sólo el número de líneas, palabras y caracteres contenidos en el archivo: [nicolas]$ wc -l /etc/archivo 2 /etc/archivo [nicolas]$ wc -w /etc/archivo 14 /etc/archivo [nicolas]$ wc -c /etc/archivo 82 /etc/archivo

4. Visualización: clear, echo El comando clear borra la pantalla (la ventana virtual): [nicolas]$ clear

El comando echo devuelve la cadena de caracteres recibida como argumento: [nicolas]$ echo hola desde Barcelona hola desde Barcelona

Para ser más exactos, devuelve todos sus argumentos separados por un solo espacio: [nicolas]$ echo esta vez hay varios espacios los argumentos esta vez hay varios espacios entre los argumentos

entre

Aunque muy esquemáticos, estos dos últimos comandos tendrán su utilidad en la escritura de scripts shell.

5. Tiempo: date, cal Como su nombre indica, el comando date indica la hora del sistema:

[nicolas]$ date Vie may 10 14:55:16 CEST 2013

También es posible dar formato a la salida, por ejemplo: [nicolas]$ date +"hoy es el %x" hoy es el 10/05/2013

El capítulo Documentación dará la posibilidad al lector de comprender y descubrir las muchas opciones de los comandos anteriores. El comando cal muestra un calendario. Si se llama sin parámetros, se muestra el calendario del mes actual: [nicolas]$ cal mayo 2013 lu ma mi ju vi 1 2 3 4 7 8 9 10 11 14 15 16 17 18 21 22 23 24 25 28 29 30 31

sa 5 12 19 26

do 6 13 20 27

Con un argumento, el comando muestra el calendario completo del año mencionado. Finalmente, si se llama al comando cal con dos argumentos, el primero es el mes que se quiere mostrar y el segundo, el año en cuestión: [nicolas]$ cal junio 2008 lu ma mi ju vi 1 2 3 4 5 8 9 10 11 12 15 16 17 18 19 22 23 24 25 26 29 30 31

6 2008 sa 6 13 20 27

do 7 14 21 28

El año mencionado como argumento debe ser totalmente definido. ¡Así, el año 08 corresponde al año 8 d. C., y no a 2008, como se podría suponer!

Condiciones generales de uso Copyright - ©Editions ENI

Cerrar sesión Una vez que el usuario ha terminado el trabajo para el que se ha conectado al sistema Linux, debe cerrar sesión (o desconectarse) para liberar la consola que utiliza. Cerrar una sesión en un terminal de texto puede efectuarse de tres maneras:

  

con el comando exit; con el comando logout (sólo funciona a partir del shell ejecutado automáticamente en la conexión); pulsando simultáneamente las teclas [Ctrl]+[d].

La secuencia de teclas [Ctrl]+[d] corresponde al carácter de fin de archivo. Cuando el terminal recibe este carácter, considera que su "archivo" de entrada (el teclado) ha terminado y, por tanto, termina su ejecución. Esta noción de archivo de entrada se detalla en el apartado "Redirecciones" del capítulo que trata del shell Bash. Por su parte, las interfaces gráficas de Linux permiten cerrar la sesión mediante un menú:

Manual Con la mayor parte de distribuciones GNU/Linux se instala un manual electrónico.

1. Secciones Este manual trata diferentes puntos, como los comandos y su sintaxis, los archivos de configuración del sistema, las bibliotecas estándar de programación... Para ello, el manual se divide en nueve secciones principales:         

Sección 1: comandos de usuario. Sección 2: llamadas al sistema. Sección 3: bibliotecas de programación (libc, Perl, SSL, Tcl). Sección 4: archivos especiales y dispositivos. Sección 5: archivos de configuración, formatos y formalismos. Sección 6: juegos. Sección 7: varios. Sección 8: comandos de administración. Sección 9: rutinas del núcleo.

Las secciones 1 y 8, que describen el conjunto de comandos disponibles en GNU/Linux, son las más importantes.

2. Comando man El acceso a una página del manual se realiza lanzando el comando man y especificando, como argumento en la línea de comandos, el término buscado. Este término corresponde al nombre del comando, del archivo o bien de la biblioteca de programación para lo que se busca información. Así, para mostrar la página del manual sobre el comando finger visto anteriormente:

$ man finger

Aparece la página siguiente: NOMBRE finger - buscar información sobre un usuario. SINOPSIS finger [-lmps] [user...] [user@host...] DESCRIPCIÓN finger muestra información sobre los usuarios. Opciones: -s ordenador

finger muestra el nombre de login, el nombre real, el y la autorización de escritura (” * ” significa que la

escritura sobre el ordenador está prohibida), el tiempo de inactividad, la fecha de login, la dirección y el número de teléfono del trabajo. La fecha de login se muestra bajo el formato mes, día, hora, minutos, salvo si se remonta a más de seis meses ya que, en este caso, se muestra el año en lugar de la hora y los minutos. ...

Navegación en la página La herramienta man contiene las mismas funciones de desplazamiento y búsqueda que los comandos less y vi descritos más adelante. Cabe señalar que conviene saber que las flechas [Arriba] y [Abajo] permiten navegar por el documento y la tecla [q] cierra la página del manual. Descripción de una página del manual Las páginas del manual electrónico se dividen en varios apartados (en el ejemplo anterior: NOMBRE, SINOPSIS, DESCRIPCIÓN...). Los apartados más frecuentes son: Nombre de la página del manual seguido de una descripción sucinta de su contenido. Sintaxis del comando con sus opciones y argumentos. Los [] indican que la opción o el argumento es opcional y ... indica SINOPSIS que la opción o el argumento anterior puede repetirse. Descripción detallada del comando. Típicamente, contiene DESCRIPCIÓN una explicación de sus diferentes opciones. Como su nombre indica, proporciona ejemplos de uso del EJEMPLOS comando. NOMBRE

Indica las otras páginas del manual relativas al tema de la página presentada. Agrupa las observaciones respecto a las diferencias que se pueden encontrar entre el comando GNU presentado aquí y el mismo comando en otro sistema UNIX. Los errores y ERRORES otros comportamientos anormales detectados pero no resueltos hasta el momento también se indican aquí. TRADUCCIÓN Nombre del traductor de la página. En función del contenido, las páginas del manual pueden Otros tener otros apartados distintos. VER TAMBIÉN

Búsqueda en las secciones del manual Cuando el usuario busca un término en el manual, el comando man recorre las distintas secciones según este orden: 1, 8, 2, 3, 4, 5, 6, 7, 9. De este modo, el término buscado se compara primero con los comandos existentes (comandos básicos y comandos de administración) antes de compararse con las llamadas al sistema y otros nombres de archivos de configuración. Este orden de recorrido de las secciones se puede modificar en el archivo de configuración /etc/man.config descrito más adelante. Un mismo término puede aparecer en diferentes secciones del manual, por lo que se puede forzar la sección de la página buscada como primer argumento de la línea de comando. Por ejemplo, man signal devuelve la página relativa a la llamada al sistema signal (Sección 2 del manual), mientras que man 7 signal devuelve la definición de las diferentes señales que pueden ser recibidas por los procesos. Encontrar la información en el manual La gran dificultad, para el usuario nuevo en Linux, es encontrar la información sin conocer el nombre de los comandos que busca. Para resolver este problema, el comando man acepta la opción -k. Esta opción indica que busque la cadena de caracteres pasada como argumento en las descripciones de las páginas del manual, y no sólo en el título de las páginas. Así, para buscar las páginas del manual asociadas a "calcula", se puede escribir: [nicolas]$ man -k cálculo abs (3) - Calcular el valor absoluto de un entero acl_calc_mask (3) - Calculate the file group class mask allneeded (1) - Force the calculation of all fonts now needed bc (1) - An arbitrary precision calculator language bc (1) - Un lenguaje de calculadora de precisión arbitraria carg (3) - calculate the argument cargf [carg] (3) - calculate the argument cargl [carg] (3) - calculate the argument conj (3) - calculate the complex conjugate conj (3) - Calcular el conjugado complejo conjf [conj] (3) - calculate the complex conjugate conjf [conj] (3) - Calcular el conjugado complejo

conjl [conj] conjl [conj] cvt dc dc difftime ...

(3) (3) (1) (1) (1) (3)

-

calculate the complex conjugate Calcular el conjugado complejo calculate VESA CVT mode lines an arbitrary precision calculator una calculadora de precisión arbitraria calculate time difference

La visualización producida indica que el comando bc, en la sección 1 del manual (cifra mostrada entre paréntesis), permite efectuar cálculos matemáticos. Otra manera de obtener este resultado es ejecutar el comando apropos: [nicolas]$ apropos cálculo abs (3) - Calcular el valor absoluto de un entero acl_calc_mask (3) - Calculate the file group class mask allneeded (1) - Force the calculation of all fonts now needed bc (1) - An arbitrary precision calculator language bc (1) - Un lenguaje de calculadora de precisión arbitraria carg (3) - calculate the argument cargf [carg] (3) - calculate the argument cargl [carg] (3) - calculate the argument conj (3) - calculate the complex conjugate conj (3) - Calcular el conjugado complejo conjf [conj] (3) - calculate the complex conjugate conjf [conj] (3) - Calcular el conjugado complejo conjl [conj] (3) - calculate the complex conjugate conjl [conj] (3) - Calcular el conjugado complejo cvt (1) - calculate VESA CVT mode lines dc (1) - an arbitrary precision calculator dc (1) - una calculadora de precisión arbitraria difftime (3) - calculate time difference ...

El comando apropos y la opción -k de man buscan en las definiciones de las páginas del manual, principalmente en inglés. Es preciso, pues, buscar la cadena de caracteres "print" en lugar de "impresión" para encontrar los comandos que permiten imprimir un documento. Finalmente, es posible escribir esto para obtener más información sobre el comando man: $ man man

3. /etc/man.config El archivo de configuración del manual electrónico es /etc/man.config. El administrador del sistema puede editarlo para modificar el comportamiento predeterminado del comando man. Veamos un extracto de este archivo de configuración; las líneas que empiezan con un # son comentarios:

# Directorios que contienen las páginas de manual en el disco # MANPATH /usr/share/man MANPATH /usr/man MANPATH /usr/local/share/man MANPATH /usr/local/man MANPATH /usr/X11R6/man # # Rutas de las herramientas subyacentes al comando man. # TROFF /usr/bin/groff -Tps -mandoc NROFF /usr/bin/nroff -c -mandoc PAGER /usr/bin/less -isr CAT /bin/cat # # Orden de consulta de las secciones del manual # MANSECT 1:8:2:3:4:5:6:7:9:tcl:n:l:p:o # # Las páginas del manual se guardan generalmente en un formato # comprimido, se indican aquí las herramientas de descompresión utilizadas # según las extensiones de los archivos # .gz /usr/bin/gunzip -c .bz2 /usr/bin/bzip2 -c d

Algunas distribuciones de GNU/Linux como Fedora incluyen en su última versión un paquete llamado man-db para poder editar las páginas del manual. En ese caso, el archivo de configuración utilizado es /etc/man_db.conf y su sintaxis, descrita en la página man 5 manpath, es similar al archivo /etc/man.conf presentado anteriormente.

Documentación Info 1. Comando info El comando info es una herramienta que agrupa básicamente la misma información contenida en las páginas del manual. Su principal ventaja, respecto a man, es que presenta los datos de forma jerárquica y con vínculos entre sí. Para acceder a la documentación "Info", basta con escribir el comando info: $ info

Aparece la visualización siguiente: File: dir

Node: Top

This is the top of the INFO tree

This (the Directory node) gives a menu of major topics. Typing "q" exits, "?" lists all Info commands, "d" returns here, "h" gives a primer for first-timers, "mEmacs" visits the Emacs topic, etc.

In Emacs, you can click mouse button 2 on a menu item or cross reference to select it. * Menu: Texinfo documentation system * Info: (info). Documentation browsing system. * Pinfo: (pinfo). curses based lynx-style info browser. * Texinfo: (texinfo). The GNU documentation format. * info standalone: (info-stnd). Read Info documents without Emacs. * infokey: (info-stnd)Invoking infokey. Compile Info customizations. * install-info: (texinfo)Invoking install-info. Update info/dir entries. * makeinfo: (texinfo)Invoking makeinfo. Translate Texinfo source. * texindex: (texinfo)Format with tex/texindex. Sort Texinfo index files. * pdftexi2dvi: (texinfo)PDF Output. PDF output for Texinfo. -----Info: (dir)Top, 2089 lines --Top Welcome to Info version 4.11. Type ? for help, m for menu item.

Nos encontramos aquí en la raíz de la jerarquía (File: dir) y los enlaces (precedidos por el carácter *) apuntan a los diferentes nodos de los archivos de documentación "Info".

Un nodo puede considerarse como un capítulo dentro de un archivo de documentación. Puede existir un árbol de nodos, y por lo tanto capítulos y subcapítulos, en un mismo archivo de documentación. Para llamar al comando info se puede indicar, como en el comando man, un argumento con el término buscado en la documentación: $ info date

Esto devuelve: File: coreutils.info, invocation, Up: System context

Node: date invocation,

Next: uname

21.1 `date’: Print or set system date and time ============================================== Synopses: date [OPTION]... [+FORMAT] date [-u|--utc|--universal] [ MMDDhhmm[[CC]YY][.ss] ] Invoking `date’ with no FORMAT argument is equivalent to invoking it with a default format that depends on the `LC_TIME’ locale category. In the default C locale, this format is `’+%a %b %e %H:%M:%S %Z %Y’’, so the output looks like `Thu Mar 3 13:47:51 PST 2005’.

Normally, `date’ uses the time zone rules indicated by the `TZ’ environment variable, or the system default rules if `TZ’ is not set. *Note Specifying the Time Zone with `TZ’: (libc)TZ Variable. If given an argument that starts with a `+’, `date’ prints the current date and time (or the date and time specified by the `--date’ --zz-Info: (coreutils.info.gz)date invocation, 40 lines --Top Welcome to Info version 4.11. Type ? for help, m for menu item.

En esta ocasión, nos encontramos en el nodo "date invocation" (Node: date invocation) del archivo de documentación "coreutils" (File: coreutils.info).

Si no existe documentación "Info" para el término buscado, el comando info se limita a mostrar la página del manual electrónico relativa a dicho término y se observa al principio de la página la indicación File: *manpages*. Si no corresponde ninguna página del manual a este término, entonces el comando equivale a una llamada sin argumentos a info. Organización de la documentación Como se ha indicado anteriormente, la información contenida en los archivos de documentación "Info" está vinculada internamente y se organiza en forma de árbol. Para saber el lugar donde se encuentra en la documentación, la primera línea de la vista proporciona las indicaciones siguientes: File Nombre del archivo de documentación "Info" actual. Node Nodo (o capítulo) visible actualmente. Next Nodo siguiente o primer subnodo según el caso. Prev Nodo anterior o nodo padre según el caso. Nodo (o capítulo) padre; el nodo visible actualmente (Node) es un Up subcapítulo de este nodo (Up). Navegación Varios comandos (teclas del teclado), bajo info, permiten pasar de un nodo a otro; destacan: [n] [p] [u] [t] [l]

Nodo siguiente (Next). Nodo anterior (Prev). Nodo padre (Up). Nodo raíz del archivo de documentación (Top). Volver al último nodo visitado (Last).

Para consultar la información de un nodo que puede ocupar varias pantallas se utilizan las teclas siguientes: [Espacio] Baja pantalla por pantalla en el nodo o pasa al nodo siguiente, según

el caso. Sube pantalla por pantalla en la página o pasa al nodo anterior, [Supr] según el caso. Vuelve a la primera línea del nodo (Beginning). [b] Va a la última línea del nodo (End). [e] [Ctrl]+[n] Baja una línea en el nodo. [Ctrl]+[p] Sube una línea en el nodo. Además, en la información mostrada se encuentran asimismo también vínculos de hipertexto a los nodos inferiores (llamados también "menú") o a otros nodos (llamados también "referencias cruzadas"). Para acceder y seguir estos vínculos (precedidos por * para los menús y por *node para las referencias cruzadas): [m] [F] [Tab] [Ecs], [Tab] [Entr]

Muestra el nodo referenciado por el menú . Muestra el nodo referenciado por la referencia cruzada . Coloca el cursor en el vínculo siguiente. Coloca el cursor en el vínculo anterior. Muestra el nodo referenciado por el vínculo debajo del cursor.

Para aclarar esta organización, veamos un esquema recapitulativo de la estructura de la documentación "Info":

Consideraciones Aunque el comando info es más evolucionado que el comando man y la escritura de la documentación asociada es más fácil, se utiliza preferentemente el manual en línea. Las páginas del manual están traducidas en su mayor parte y la navegación impuesta por el comando info es bastante compleja. Éstas parecen ser buenas razones. Es cierto que un sistema GNU/Linux pide probablemente más esfuerzo al usuario, especialmente debido a la internacionalización de los programas y su documentación. Pero en cuanto a la ergonomía del comando info, existen otras herramientas, como pinfo, que proponen una exploración de la documentación "Info" o lynx que es un navegador web de línea de comandos. Ejemplo de visualización con pinfo:

Para navegar dentro de pinfo: [Av Pág] [Re Pág]

Baja una pantalla en el nodo mostrado. Sube una pantalla en el nodo mostrado.

[Abajo] [Arriba] [Derecha] [Izquierda] [q]

Selecciona el vínculo siguiente en el nodo. Selecciona el vínculo anterior en el nodo. Sigue el vínculo seleccionado. Vuelve al nodo anterior. Salir de pinfo.

Condiciones generales de uso Copyright - ©Editions ENI

Opción --help de los comandos en Linux Además de las páginas del manual y de la documentación "Info" que ya hemos visto, los comandos GNU que se encuentran en Linux aceptan habitualmente la opción --help. Los comandos invocados con esta opción devuelven una sucinta ayuda que describe la sintaxis general del comando y las opciones más utilizadas; por ejemplo: $ wc -help Usage: wc [OPCION]... [ARCHIVO]... or: wc [OPCION]... --referencia=ARCHIVO-R ARCHIVO... Muestra el número de nuevas líneas, palabras y bytes para cada ARCHIVO, y el número total de líneas si se especifica más de un ARCHIVO. Sin ARCHIVO, o cuando ARCHIVO es -, lee la entrada estándar. -c, --bytes muestra el número de bytes -m, --chars muestra el número de caracteres -l, --lines muestra el número de líneas --files0-from=F read input from the files specified by NUL-terminated names in file F -L, --max-line-length print the length of the longest line -w, --words print the word counts --help muestra la ayuda --version muestra el nombre y la versión del programa Comunicar las anomalias a .

Esta ayuda resulta muy práctica cuando se conoce ya el comando que hay que emplear, pero se tienen dudas sobre la sintaxis o el nombre de una opción.

Documentación HOWTO A su manera, los documentos HOWTO aportan una mina de información al usuario que quiera dominar el sistema operativo con el que trabaja. Estos documentos de varias páginas se refieren a temas específicos, como la impresión con Linux, la configuración de red del sistema o bien la administración de dispositivos SCSI.

También existen otros documentos, llamados "mini-HOWTO", más sucintos que los otros HOWTO. Por citar sólo uno de estos documentos, el HOWTO Index recoge todos los HOWTO existentes y los clasifica por categorías, dando una descripción rápida de cada uno. Estos archivos están disponibles en diferentes formatos: .txt .ps .pdf .html .tex y .dvi

Archivos en formato de texto. Archivos PostScript imprimibles directamente en las impresoras que reconocen este formato. Archivos en formato Adobe PDF que pueden leerse con la herramienta xpdf en la interfaz gráfica. Páginas HTML legibles desde cualquier navegador web. Formatos de archivo asociados a las herramientas de paginación y publicación TeX y LaTeX.

Cuando están instalados en el equipo, se colocan generalmente en el directorio /usr/share/doc/HOWTO. Pero en este caso, el espacio ocupado es bastante notable. Por otra parte, algunos editores como Red Hat sólo los proporcionan en un CD-ROM separado de la distribución. Si no se encuentran en el equipo, es posible consultarlos en uno de los numerosos sitios espejo presentes en Internet (véase, en este capítulo, Internet - Sitios).

/usr/share/doc Además de toda la documentación vista hasta ahora, los desarrolladores y editores de programas proporcionan generalmente una serie completa de documentos que describen su obra. Esta documentación se encuentra en subdirectorios de /usr/share/doc/:

[nicolas]$ ls /usr/share/doc abattis-cantarell-fonts-0.0.10.1 abrt-2.0.19 acl-2.2.51 aic94xx-firmware-30 akonadi-1.8.1 alsa-firmware-1.0.25 alsa-lib-1.0.26 alsa-plugins-pulseaudio-1.0.26 alsa-tools-1.0.26.1 alsa-utils-1.0.26 anaconda-yum-plugins-1.0 anthy-9100h

apper-0.8.0 apr-1.4.6 apr-util-1.4.1 ...

Al igual que los HOWTO, los archivos se encuentran en diferentes formatos, por ejemplo: [nicolas]$ pwd /usr/share/doc [nicolas]$ ls pam-1.1.6 Copyright html Linux-PAM_SAG.txt rfc86.0.txt txts [nicolas]$ ls iproute-3.6.0 COPYING README.decnet README.iproute2+tc README README.distribution README.lnstat

Internet 1. Sitios Internet es una inmensa fuente de información; veamos una breve selección de sitios relacionados con los sistemas GNU/Linux. Genéricos http://www.gnu.org/home.es.html   

Título: GNU’s Not Unix Idioma: multilingüe Descripción: sitio oficial del proyecto GNU.

http://www.tldp.org   

Título: The Linux Documentation Project Idioma: multilingüe Descripción: sitio oficial que agrupa toda la documentación de Linux actualizada: HOWTO, guías, FAQ, páginas de manual...

Editores http://www.redhat.es   

Título: Red Hat España Idioma: español Descripción: editor de las distribuciones Red Hat Enterprise.

http://fedoraproject.org/  

Título: Fedora Idioma: multilingüe



Descripción: sitio oficial del proyecto Fedora.

http://www.debian.org   

Título: Debian Idioma: multilingüe Descripción: editor de la distribución del mismo nombre.

http://www.suse.com/es-es/   

Título: SuSE Idioma: multilingüe Descripción: editor de las distribuciones SuSE Linux.

http://es.opensuse.org/   

Título: openSUSE España Idioma: español Descripción: sitio de la distribución libre openSUSE.

http://ubuntu.com/   

Título: Ubuntu Idioma: inglés Descripción: editor de la distribución del mismo nombre.

2. Grupos de discusión De entre todos los grupos de discusión (o newsgroups) existentes en Usenet, un cierto número está dedicado a Linux y a las aplicaciones GNU. Por ejemplo, los grupos de la jerarquía es.comp.os.linux.* son generalmente relevados por los proveedores de acceso a Internet. Programas como tin (en línea de comandos) o knode (con una interfaz gráfica amigable) permiten aprovechar estos grupos de discusión.

Buzones públicos en los que todo el mundo puede enviar o leer mensajes, es el lugar apropiado para obtener ayuda cuando toda la documentación vista anteriormente no basta para resolver un problema. Existen ciertas reglas de uso en estos grupos. Evite, por ejemplo, hacer una pregunta sobre un problema resuelto anteriormente; para ello, conviene consultar los mensajes anteriores y las FAQ (Frequently Asked Questions), documentos que contienen las preguntas hechas con frecuencia acompañadas de sus respuestas. Además, para tener ocasión de obtener una respuesta correcta más rápidamente: 

Envíe la pregunta al grupo de discusión adecuado.





Primero busque en la documentación presentada a lo largo de este capítulo: normalmente está mal visto preguntar el nombre de una opción para un comando cuando un simple uso del comando man bastaría. Facilite el máximo de información para orientar a las personas que quieran responderle: "No consigo imprimir" no permitirá obtener ayuda, mientras que "No consigo imprimir a pesar de haber leído el Printing-HOWTO. Utilizo la distribución X con una impresora Y. Los mensajes de error son Z" será sin duda más fructífero. Sea educado, evidentemente.



El árbol de Linux



    

  



Lo más difícil, cuando se empieza con Linux, es sin duda conocer la ubicación de los archivos y la utilidad de los directorios presentes en el árbol. Este capítulo propone una panorámica general del sistema de archivos de Linux. Organización Presentado en forma de árbol, el sistema de archivos de Linux es una jerarquía de directorios que tienen como única raíz / (barra). Al instalar una distribución de Linux, es posible crear, además de la partición principal que contiene /, otras particiones dedicadas a ciertos directorios del árbol. Sin embargo, los directorios indispensables para iniciar el sistema deben estar en la misma partición que / y no pueden, por tanto, instalarse en una partición separada; en el esquema anterior, esos directorios esenciales aparecen en gris en el esquema siguiente.

En la medida de lo posible, se trazará una analogía entre el árbol de Linux y los directorios clásicos del sistema Microsoft Windows; esto permitirá orientarse mejor a los usuarios de este extendido sistema. El árbol de archivos de Linux respeta, exceptuando algunos directorios, el FHS (Filesystem Hierarchy Standard) implementado con el objetivo de homogeneizar la estructura de los sistemas de archivos de Unix. Este documento detalla el nombre y el contenido de los directorios; se encuentra disponible en la dirección http://www.pathname.com/fhs.

Directorios principales 1. /bin, /sbin, /lib El directorio /bin contiene los ejecutables (binarios) básicos necesarios para el funcionamiento del sistema; los comandos como date están aquí. Por su parte, todos los comandos fundamentales de administración del sistema están en /sbin ("súper" binarios). Aquí se encuentran, por ejemplo, los comandos de particionado y de administración de dispositivos de red. Los binarios compilados para Linux utilizan bibliotecas de funciones, lo que permite aligerar en gran medida el tamaño de los archivos porque varios ejecutables podrán utilizar la misma porción de código contenida en una de estas bibliotecas. El directorio /lib (libraries) reúne las bibliotecas utilizadas por los binarios incluidos en /bin y /sbin.

En comparación con un sistema Windows, estos tres directorios corresponden a los ejecutables contenidos en C:\windows con sus bibliotecas (archivos .dll) ubicados en C:\windows\system. Estos tres directorios son vitales para el sistema y deben estar en la misma partición que /.

2. /boot Este directorio contiene el núcleo Linux y otros archivos ejecutados al arrancar el sistema. Por razones no detalladas en esta obra, este directorio puede disponer de una partición distinta.

3. /dev Una de las particularidades de Linux es presentar, en forma de archivos, los dispositivos conectados al sistema. Este directorio contiene archivos como /dev/fd0 y /dev/cdrom que representan respectivamente la unidad de disquetes y la unidad de CD-ROM.

La forma de acceder a los archivos presentes en estos soportes extraibles se aborda en el apartado que trata de los montajes. Siguiendo en el ámbito de los archivos especiales, existen en este directorio archivos como /dev/null; éste es en cierto modo una papelera a la que se pueden redirigir todos los datos que no se quiera conservar. Su uso se detallará en el capítulo sobre el Shell Bash. La particularidad de los archivos presentes en /dev no guarda relación con sus nombres, sino con sus números mayor y menor. Estos dos números indican al núcleo Linux el tipo de dispositivo vinculado al archivo; se muestran con el comando ls -l que se detallará en el capítulo Manipulación de archivos. Los archivos de este directorio sirven para acceder a los dispositivos o para implementar funcionalidades importantes para el sistema, por lo que /dev debe estar en la misma partición que /.

4. /home El directorio /home contiene los directorios personales de los usuarios del equipo. Así, para las cuentas de usuario nicolas, linus y richard, existirán los directorios /home/nicolas, /home/linus y /home/richard.

En su directorio personal es donde un usuario guarda sus archivos de datos; en él se inscriben los archivos de configuración propios del usuario. Por ejemplo, la configuración del editor Vi, para el usuario nicolas, se encuentra en el archivo /home/nicolas/.exrc.

El directorio personal del usuario de Linux puede compararse a la carpeta "Mis documentos" de un sistema Windows. Al instalar el sistema, el administrador dedica habitualmente una partición a este directorio para separar físicamente los datos de usuario y los datos del sistema.

5. /root Este directorio tiene la misma función que el anterior, pero está reservado al usuario root que es el administrador del equipo. No se encuentra en /home por razones de seguridad y porque no puede estar en una partición distinta como /home.

6. /tmp Como su nombre indica, el directorio /tmp está previsto para acoger los archivos temporales. Todos los usuarios del sistema pueden escribir en este directorio, pero el administrador planifica generalmente una limpieza automática de este directorio a intervalos regulares. El tiempo de vida de un archivo presente en este directorio se estima en unas horas o en unos días.

7. /lost+found Este directorio se crea automáticamente en cada partición de Linux al arrancar el sistema. Lo utiliza la herramienta de verificación fsck (File System ChecK) para guardar los archivos recuperados tras un incidente en el sistema; por ejemplo, tras un corte de corriente imprevisto. Este directorio debería, si todo va bien, permanecer vacío.

8. /mnt /mnt es un directorio vacío o que contiene una serie de directorios vacíos predefinidos. Se reserva para el montaje de sistemas de archivos de terceros. Existen generalmente los subdirectorios /mnt/floppy y /mnt/cdrom, previstos para acceder respectivamente a los disquetes y a los CD-ROM.

Las distribuciones recientes prevén también puntos de montaje en /media para los sistemas de archivos que provienen de medios extraibles (disquetes, CD-ROM...) y en /misc para los árboles montados automáticamente por el montador automático del sistema.

9. /proc /proc es un sistema de archivos virtual que representa el estado del sistema en curso de ejecución. No ocupa espacio en el disco; sólo existe en memoria RAM y cada archivo que contiene da acceso a información del sistema, como el uso actual de la memoria, la lista de dispositivos detectados en los diferentes buses del equipo (ISA, PCI, USB...) o bien el enrutamiento de los paquetes de red.

El análisis de los archivos presentes en /proc es responsabilidad del administrador del sistema y puede ignorarse en el marco del uso diario del puesto de trabajo. Además, por cada proceso iniciado en el sistema, existe un subdirectorio que lo caracteriza en /proc. Comandos como ps y top, abordados más adelante en este libro, utilizan esta información. Todos estos datos están presentes en archivos "virtuales", por lo que no se reserva ninguna partición particular a /proc.

10. /sys A la manera de /proc, /sys es un sistema de archivos virtuales que no ocupan espacio en el disco. Su meta es representar en forma de archivos los diferentes periféricos e indicar características y estados de hardware.

11. /usr Es el directorio más voluminoso creado al instalar el sistema; /usr contiene todos los programas que no están en /bin y /sbin. También contiene la documentación y las fuentes de los programas.

Este directorio corresponde aproximadamente a la carpeta c:\archivos de programa de Windows. Se puede crear una partición especial para este directorio al instalar el sistema. /usr/bin, /usr/sbin, /usr/lib

Estos tres subdirectorios contienen binarios (y bibliotecas asociadas) suplementarios, pero no esenciales para el uso o la administración básica del sistema. /usr/games Como su nombre indica, los juegos instalados en el sistema deberían encontrarse aquí. /usr/include Aquí se encuentran las definiciones de las distintas bibliotecas utilizadas en programación. El contenido de este directorio sólo es necesario en la compilación de programas. /usr/local Este directorio está dedicado a las aplicaciones y documentos propios del equipo local; los programas compilados específicamente para el sistema se encuentran, pues, aquí. Este directorio se divide en subdirectorios bin, lib, ... /usr/share Además de los archivos de internacionalización con la traducción de los mensajes mostrados por las aplicaciones (/usr/share/locale), este subdirectorio contiene la documentación presentada en el capítulo Documentación (/usr/share/man, /usr/share/info y /usr/share/doc). Los recursos compartidos destinados a las aplicaciones gráficas se encuentran en el subdirectorio /usr/share/X11. /usr/src La mayor parte de los programas utilizados están desarrollados bajo licencia libre (GPL), por lo que no es raro disponer de su código fuente para recompilarlos de forma específica. Si es así, el código fuente de estos programas se guarda aquí. Por ejemplo, el código fuente del núcleo Linux se encuentra en el directorio /usr/src/linux.

12. /var Otro directorio voluminoso de un sistema de archivos Linux; /var reúne todos los archivos de datos "variables" en el tiempo: las colas de espera de impresora, los buzones de los usuarios y los registros del sistema.

Un registro o archivo de "log" contiene el historial de la actividad de un programa. Existe por ejemplo un archivo de log que registra la hora de conexión y desconexión de los usuarios al equipo.

El tamaño de este directorio depende en gran medida de los servicios implementados en el sistema; así, si el equipo cumple la función de servidor de correo, de archivos y de impresora al mismo tiempo, este directorio será más grande que en un equipo que sirva únicamente como puesto de trabajo. Finalmente, se puede reservar para este directorio una partición específica. /var/lib Este subdirectorio contiene generalmente los archivos de los sistemas de gestión de bases de datos (SGBD), como MySQL. /var/log Aquí se agrupan todos los registros del sistema y de aplicaciones. La consulta de archivos de log permite al administrador comprender -y por lo tanto resolver- un gran número de problemas del sistema y de aplicaciones. /var/lock Las aplicaciones de servidor (servidor web, servidor ftp, planificador de tareas) crean cada una un archivo en este directorio para dejar testimonio de su ejecución. Llamados archivos "de bloqueo", permiten con su presencia evitar que uno de estos programas se ejecute varias veces. Estos archivos, lógicamente, se borran al detener los programas correspondientes. /var/run Además de los archivos de bloqueo (/var/lock), los servicios iniciados en el equipo crean generalmente un archivo que lleva su nombre y contiene el identificador del proceso (PID) correspondiente en /var/run.

En otro capítulo abordaremos la noción de proceso. Estos archivos permiten recuperar más fácilmente los identificadores de los procesos con los scripts de control. /var/spool Este subdirectorio agrupa los archivos de espera (spool) de diferentes servicios: impresión (/var/spool/lpd y /var/spool/cups), correo electrónico (/var/spool/mail), tareas planificadas (/var/spool/cron)... /var/tmp Al igual que el directorio /tmp, todos los usuarios del sistema pueden almacenar archivos temporales en /var/tmp.

La diferencia entre estas dos ubicaciones es el tiempo de vida atribuido generalmente por el administrador a estos archivos; desde unos días hasta varias semanas para /var/tmp.

13. /etc El directorio /etc ("etcétera") contiene los archivos que no tienen cabida en los otros directorios, es decir, todos los archivos de configuración y scripts de arranque del sistema. Se divide en subdirectorios, entre los que destacan:   

/etc/rc.d que acoge los scripts de arranque y de control de los servicios; /etc/skel (directorio "esqueleto"), que contiene los archivos que se copiarán en el directorio del usuario al crear su cuenta Linux; /etc/sysconfig que contiene principalmente la configuración de los dispositivos.

Este directorio corresponde, en cierto modo, a la base de registros del sistema Windows. Este directorio, fundamental para el sistema operativo, se encuentra obligatoriamente en la partición principal.

Montar y acceder a los medios extraibles Considerado en su conjunto hasta ahora, el árbol de Linux puede estar compuesto por varios sistemas de archivos guardados en soportes diferentes. De hecho, cada partición o medio extraible habilita un sistema de archivos "físico". Una vez reunidos, forman el árbol -o sistema de archivos- de Linux que hemos descrito anteriormente. Para ello, una partición del disco duro del equipo se designa como principal y acoge el sistema de archivos raíz (el que contiene /), del que se colgarán los demás sistemas de archivos. Por ejemplo:

1. Comando mount Para acceder al contenido de un sistema de archivos físico, hay que "conectarlo" al árbol de Linux. Esta operación se llama "montaje" y se efectúa mediante el comando mount. Su sintaxis general es la siguiente: mount [-t ] [-o opciones[,...]]

Una página del manual detalla este comando; sólo se exponen aquí los montajes de sistemas de archivos presentes en CD-ROM o disquete. Como se ha indicado anteriormente, los archivos asociados a las unidades de disquetes y de CD-ROM son /dev/fd0 y /dev/cdrom. Para montar los sistemas de archivos presentes en los medios insertados en estos dispositivos, hay que escribir los comandos mount siguientes: mount /dev/fd0 mount /dev/cdrom

El comando mount sin parámetros indica el directorio utilizado en el árbol de Linux para todos los montajes del sistema de archivos; los directorios de montaje asociados de modo predeterminado a las unidades de disquetes y CD-ROM se definen en el archivo /etc/fstab; para más información sobre este archivo: man 5 fstab.

Según losderechos otorgados por el administrador en el archivo /etc/fstab, los usuarios pueden no estar autorizados para efectuar montajes. Entonces será necesario conectarse como root. Por ejemplo, para ver el contenido de un disquete: [root]# mount /dev/hda3 on / type ext3 (rw) none on /proc type proc (rw) [root]# ls /mnt/floppy/ [root]# mount /dev/fd0 [root]# mount /dev/hda3 on / type ext3 (rw) none on /proc type proc (rw) /dev/fd0 on /mnt/floppy type vfat (rw,nosuid,nodev) [root]# ls /mnt/floppy/ command.com ega2.cpi io.sys keybrd2.sys mode.com config.sys ega3.cpi keyb.com keybrd3.sys msdos.sys display.sys ega.cpi keyboard.sys keybrd4.sys

En este ejemplo, el segundo comando mount, sin parámetros, indica que el sistema de archivos presente en el disquete (/dev/fd0) está montado en el directorio /mnt/floppy. Las llamadas del comando ls muestran el contenido del directorio /mnt/floppy antes y después del montaje efectuado con mount /dev/fd0.

En las distribuciones recientes, se implementa un sistema de automontaje. Esto permite que el usuario acceda a los sistemas de archivos presentes en los disquetes y CD-ROM sin invocar el comando mount, u, únicamente accediendo a los directorios asociados a los dispositivos en el archivo /etc/fstab.

2. Comando umount

De igual manera, cuando ya no se quiere acceder a un sistema de archivos en Linux, hay que "desmontarlo" antes de poder extraer el medio de su unidad. En el caso de un CDROM, la bandeja de la unidad está bloqueada hasta que se realiza esta acción.

Si bien es posible extraer mecánicamente un disquete de su unidad o una memoria USB de su puerto, sigue siendo obligatorio desmontar el sistema de archivos montado previamente, so pena de perder los datos guardados en el medio. El comando umount, seguido del nombre del dispositivo o del directorio de montaje, permite desmontar el sistema de archivos; por ejemplo, para el disquete: # umount /mnt/floppy

o: # umount /dev/fd0

Dicho esto, no es posible desmontar un sistema de archivos en uso; hay que tener la precaución de no encontrarse en el directorio de montaje al llamar a umount.

3. Caja de herramientas mtools Instalado de modo predeterminado con las distribuciones de Linux recientes, el paquete de software mtools es una serie de comandos que permiten acceder a los medios de la misma manera que en la línea de comandos del DOS. Estos comandos tienen los mismos nombres que los comandos DOS, aunque poniendo delante la letra "m". Por ejemplo, para leer un disquete DOS y copiar uno de sus archivos al directorio /tmp sin montar, se utilizarán los comandos mdir y mcopy así: [root]# mdir a: Volume in drive A has no label Volume Serial Number is 2A87-6CE1 Directory for A:/ EGA2 CPI EGA3 CPI EGA CPI KEYB COM KEYBOARD SYS KEYBRD2 SYS KEYBRD3 SYS KEYBRD4 SYS MODE COM COMMAND COM DISPLAY SYS CONFIG SYS 12 files

58870 58753 58870 21607 34566 31942 31633 13014 29239 93040 17175 33

06-08-2000 17:00 06-08-2000 17:00 06-08-2000 17:00 06-08-2000 17:00 06-08-2000 17:00 06-08-2000 17:00 06-08-2000 17:00 06-08-2000 17:00 06-08-2000 17:00 06-08-2000 17:00 06-08-2000 17:00 03-01-2004 19:16 448 742 bytes 888 832 bytes free

# mcopy a:\command.com /tmp # ls /tmp command.com

Atención: los comandos mtools no pueden acceder a los medios ya montados con el comando mount.

Nombres de archivos y de directorios Los nombres de archivos y de directorios en Linux responden a ciertas reglas de escritura. Descripción del contenido En primer lugar, un nombre de archivo debe proporcionar indicaciones sobre su contenido; esto es válido para todos los sistemas operativos. Para un profesor, es más fácil encontrar las notas de historia de la clase de 4º A del primer trimestre de 2011 en el archivo llamado notas.historia.clase.4A.trim.1.2011 que en el archivo llamado vale. Sintaxis La distinción de mayúsculas y minúsculas es determinante en la sintaxis de los nombres de archivos. Así, los archivos vale, Vale y VALE son distintos. Sólo deben utilizarse los caracteres alfanuméricos (de a a z, A a Z y 0 a 9) junto con algunos más (_, ., @, -, +) en los nombres de archivos. Algunos caracteres tienen un significado especial en la línea de comandos; éstos se detallarán en el capítulo dedicado al Shell Bash. Por ejemplo, borrar a* no significa borrar el archivo llamado a*, sino todos los archivos que empiezan por la letra a.

De hecho, pueden utilizarse todos los caracteres en los nombres de archivo exceptuando /, que es el carácter de separación de nombres de directorios en la línea de comandos. Los signos - y + deben evitarse al principio de un nombre de archivo porque puede haber ambigüedad con algunas opciones de la línea de comandos. Por ejemplo, en la línea siguiente, -fic ¿es un nombre de archivo pasado como argumento al comando, o se trata de las opciones f, i y c? $ ls -fic

Finalmente, el . (punto) no tiene un significado especial en un nombre de archivo, excepto en la primera posición, donde indica que ese archivo está oculto. La única particularidad de un archivo oculto es que no aparece de modo predeterminado en la lista del directorio.

En Linux no existe la noción de extensión determinante como en Windows. No es un nombre terminado por .exe, .com o .bat lo que permite la ejecución de un archivo, sino los derechos que tiene asociados; los derechos se explican más adelante en esta obra. Longitud La longitud máxima de un nombre de archivo (o de directorio) en Linux es de 255 caracteres.

Este límite no presenta problemas, pero ciertas herramientas no aceptan rutas de archivo (ver más adelante) de tamaño infinito. Es el caso del comando tar, para el que estas rutas no pueden pasar de 1.024 caracteres.

Tipos de archivos En Unix se entiende por archivo la estructura que contiene datos del usuario. Los archivos estándar están constituidos por una serie de caracteres o flujo de bytes cuyo formato no viene impuesto por el sistema, sino por las aplicaciones.

La analogía entre byte y carácter se debe al hecho de que un carácter se codifica con un byte; el tamaño de un archivo puede indicarse, por tanto, tanto en bytes como en caracteres. Los directorios son archivos especiales que pueden contener otros muchos archivos (directorios o no). Esto permite organizar los archivos de forma jerárquica en estructura de árbol.

Los términos "directorio" y "archivo", utilizados en Linux, son equivalentes a "carpeta" y "documento" empleados habitualmente en Windows y Mac OS. Existen siete tipos de archivos en Linux; los tres más importantes son:   

archivo estándar u ordinario; directorio; vínculo simbólico o lógico (soft link).

Los otros cuatro tipos de archivo, que se trabajan principalmente en la administración o en programación del sistema, son: 

archivo que apunta a un dispositivo de tipo "bloque" (archivos presentes /dev);

  

archivo que apunta a un dispositivo de tipo "carácter" (archivos presentes en /dev); archivo de tubería llamado "named pipe" para la comunicación entre procesos; archivo "socket", como las tuberías con nombre, pero generalmente en un contexto de red.

Los archivos se guardan y referencian en un sistema de archivos. Pueden tener varios nombres (referencias) gracias a la propia estructura de los sistemas de archivos de Unix.

Rutas Conocer el nombre de un archivo (o de un directorio) no es suficiente para acceder a él; un mismo nombre puede estar asociado a varios archivos en directorios diferentes. La referencia plenamente cualificada de un archivo se denomina "ruta" e indica el directorio en el que se encuentra el archivo. Los nombres de directorios y de archivos van separados por una / (barra oblicua) en las rutas.

Atención, en un sistema Windows, el separador entre los nombres de archivo y de directorios es el \ (barra inversa). Existen tres tipos de rutas: absolutas, relativas y personales. Pueden utilizarse indiferentemente en la forma de nombrar archivos en la línea de comando. Veamos un ejemplo de árbol:

1. Rutas absolutas Una ruta absoluta se basa en la raíz del árbol de Linux. Toda ruta absoluta empieza, pues, por /. Sea cual sea la ubicación actual donde se encuentre, se podrá referenciar el archivo notes del ejemplo anterior con la ruta /home/willy/notas. Por ejemplo: [willy]$ ls /home/willy/notas /home/willy/notas

2. Rutas relativas Las rutas relativas dependen del directorio actual en el que se encuentra el usuario.

Sabiendo que cada directorio en el sistema contiene los archivos . (punto) y .. (puntopunto) que referencian respectivamente el propio directorio actual y el directorio padre, existen varias rutas relativas que designan el archivo notes en el ejemplo: Para un mismo directorio actual /home willy/notas (/home), existen /home/willy ./notas varias rutas posibles, por absurdas que /home/willy/colores ../notas sean; esta última / home/willy/notas manera de definir la /home ../tmp/./../home/./willy/notas ruta relativa al archivo notas podrá emplearse en scripts shell concatenando diversas variables, por ejemplo. Directorio actual

Ruta relativa correspondiente

Por comodidad, es posible suprimir el ./ al principio de una ruta relativa; así, la ruta relativa notas equivale a ./notas. Por ejemplo: [willy]$ pwd /home/willy [willy]$ ls notas notas [willy]$ ls ./notas ./notas [willy]$ ls ../willy/notas ../willy/notas

3. Rutas personales Esta tercera forma de definir la ruta de un archivo se refiere al directorio personal de un usuario; se emplea principalmente para acceder a los archivos presentes en los subdirectorios de /home. Una ruta personal empieza por el carácter ~ seguido del nombre del usuario que tiene como directorio personal el directorio contenido en /home. Si no se especifica el nombre del usuario, se usa implícitamente la identidad del usuario conectado. Considerando que los usuarios gerardo, nicolas y willy tienen respectivamente como directorio personal /home/gerardo, /home/nicolas y /home/willy, se obtendrá: Como gerardo: [gerardo]$ whoami gerardo [gerardo]$ ls ~/archivo1 /home/gerardo/archivo1 [gerardo]$ ls ~willy/formas/triángulo /home/willy/formas/triángulo

Como nicolas: [nicolas]$ whoami nicolas [nicolas]$ ls ~gerardo/archivo1 /home/gerardo/archivo1 [nicolas]$ ls ~willy/notas /home/willy/notas

Como willy: [willy]$ whoami willy [willy]$ ls ~/notas /home/willy/notas [willy]$ ls ~/colores/amarillo /home/willy/colores/amarillo [willy]$ ls ~gerardo/archivo1 /home/gerardo/archivo1

Condiciones generales de uso Copyright - ©Editions ENI

Exploración del árbol 1. pwd El comando pwd (print working directory) muestra la ruta absoluta del directorio actual en el que se encuentra el usuario: [willy]$ pwd /home/willy

2. cd El comando cd (change directory) permite cambiar de directorio actual. En la línea de comandos, se indica como argumento junto con el directorio al que se quiere ir: [willy]$ pwd /home/willy [willy]$ cd /var/spool [willy]$ pwd /var/spool [willy]$ cd .. [willy]$ pwd /var

En este ejemplo el comando que permite "subir" hacia el directorio padre cd .. y no cd.. (sin espacio) como en DOS: el carácter de espacio es obligatorio entre el comando y su argumento.

Además, la ruta del archivo (o del directorio) como argumento puede ser absoluta, relativa o personal; esto es válido para todos los comandos. Llamado sin argumentos, el comando cd devuelve al usuario a su directorio personal: [willy]$ pwd /var [willy]$ whoami willy [willy]$ cd [willy]$ pwd /home/willy

Finalmente, la sintaxis particular siguiente permite volver al directorio anterior: [willy]$ pwd /home/willy [willy]$ cd /var [willy]$ pwd /var

No hay que confundir el directorio "padre" (..), situado sobre el directorio actual en el árbol de Linux, con el directorio "anterior", que corresponde al directorio en el que se encontraba antes el usuario.

3. ls El comando ls permite listar el contenido de directorios. Sin opciones, la visualización sigue el orden alfabético de los nombres de archivo. Argumentos Llamado sin argumentos, ls se limita a mostrar los archivos presentes en el directorio actual: [willy]$ cd [willy]$ pwd /home/willy [willy]$ ls colores formas

notas

Puede especificarse una o más rutas en la línea de comandos. Si la ruta corresponde a un directorio, se muestran los archivos que contiene; si es un archivo, se muestra su nombre: [willy]$ pwd /home/willy [willy]$ ls notas . colores /home/gerardo ~nicolas/novale ls: /home/nicolas/novale: No such file or directory notas

.: colores

formas

colores: azul amarillo

notas rojo

/home/gerardo: archivo1

Cuando la ruta no corresponde a ningún archivo o directorio, el comando devuelve un error. Opción -l La opción -l (long) produce una salida detallada con una parte de la información contenida en el inodo de los archivos (véase sección Organización física de los archivos en Linux, más adelante en este capítulo): [willy]$ ls total 12 drwxr-xr-x drwxr-xr-x -rw-r--r--

-l 2 willy tec 4096 jun 1 10:42 colores 2 willy tec 4096 jun 1 10:43 formas 1 willy tec 62 may 26 22:55 notas

La primera línea total 12 indica que la suma de los bloques de datos ocupados por los archivos del directorio es igual a 12. La información sobre el archivo notas en el directorio es:

El primer carácter indica el tipo de archivo; los valores posibles son (véase sección Tipos de archivos, en este capítulo): d l b c p s

archivo común directorio (directory) enlace simbólico (link) dispositivo de tipo "bloque" dispositivo de tipo "carácter" archivo intermedio o tubo con nombre (pipe) archivo "socket"

Los permisos de Linux sobre los archivos se detallan en un capítulo posterior. El número de referencias corresponde al número de nombres de archivo que apuntan al mismo inodo. El usuario y el grupo propietarios están vinculados a los derechos y se abordarán más adelante.

El tamaño del archivo se expresa en número de bytes. Corresponde a la cantidad real de datos guardados en el archivo, y no al espacio en disco ocupado por el archivo en número de bloques. La fecha mostrada corresponde a la fecha de la última modificación del archivo. El nombre del archivo va al final de la línea. Otras opciones La opción -a (all) pide a ls que muestre también los archivos ocultos (cuyo nombre empieza por un punto): [willy]$ ls colores formas notas [willy]$ ls -a . .. .bash_history .bash_profile

.bashrc

colores

formas

notas

-i (inodo) muestra, además, el número de inodo de cada archivo. [willy]$ ls -i 15874 colores 15882 formas 15880 notas [willy]$ ls -i /bin/gzip /bin/gunzip 32837 /bin/gunzip 32837 /bin/gzip

/bin/gzip y /bin/gunzip son dos nombres posibles para un mismo archivo.

El concepto de inodo se detalla más adelante en este capítulo. -R (recursivo) da una vista del árbol de un directorio recorriendo sus subdirectorios: [willy]$ pwd /home/willy [willy]$ ls -R .: colores formas ./colores: azul amarillo

notas rojo

./formas: círculo triángulo

El término "recursivo" proviene del tipo de algoritmo utilizado en los programas que recorren datos estructurados jerárquicamente en forma de árbol. -d muestra el directorio, y no su contenido. Resulta muy práctico en combinación con la opción -l cuando se trata de mostrar las características de un directorio: [willy]$ ls colores azul amarillo rojo

[willy]$ ls -d colores colores [willy]$ ls -ld colores drwxr-xr-x 2 willy tec 4096 jun

1 10:42 colores

La opción -t ordena los archivos según su fecha de última modificación; el último archivo modificado en un directorio aparece el primero en la lista. Finalmente, la opción -r invierte el orden de visualización de los archivos. Todas estas opciones pueden combinarse entre sí para obtener la vista deseada. Por ejemplo, puede resultar útil ver de forma detallada los archivos del directorio /var/log ordenados del más antiguo al más reciente. Así se sabe el nombre y las características del último archivo de registro modificado: [willy]$ ls -ltr /var/log total 2480 drwxr-xr-x 2 root root drwxr-xr-x 2 root root -rw-r--r-1 root root -rw-r--r-1 root root drwxr-sr-x 2 news news -rw-r--r-1 root root -rw-r--r-1 root root -rw-r--r-1 root root -rw-r--r-1 root root -rw-r--r-1 root root -rw-r--r-1 root root -rw-r--r-1 root root -rw-r--r-1 root root installer.timings.1 -rw-r--r-1 root root drwxrws--3 root adm -rw-r--r-1 root root drwxr-xr-x 2 root root -rw-r----1 root adm drwxr-s--2 mail adm -rw-r----1 root adm -rw-r----1 root adm -rw-r--r-1 root root -rw-r--r-1 root root drwxr-xr-x 2 root root -rw-r--r-1 root root -rw-r--r-1 root root -rw-r--r-1 root root -rw-r--r-1 root root -rw-rw-r-1 root utmp -rw-rw-r-1 root utmp -rw-r----1 root adm -rw-r----1 root adm

4096 4096 0 0 4096 0 0 0 0 0 0 41 52261

Apr Apr Mar Mar Mar Mar Mar Mar Mar Mar Mar Mar Mar

25 25 18 18 18 18 18 18 18 18 18 18 18

2008 2008 20:43 20:43 20:43 20:43 20:43 20:43 20:43 22:06 22:06 22:06 23:09

vbox isdn uucp.log user.log news mail.warn mail.log mail.info mail.err lp-errs lp-acct lpr.log

938374 4096 2927 4096 465921 4096 465921 329 24024 3818 4096 5463 86972 3393 98415 292292 131712 41367 121593

Mar Mar Mar Mar Mar Mar Mar Mar Apr Apr Apr Apr Apr Apr Apr Apr Apr Apr Apr

18 18 19 22 24 26 26 26 3 3 27 27 27 27 27 27 27 27 27

23:09 23:21 15:27 06:26 06:25 06:25 06:25 06:25 01:04 02:17 08:23 08:23 08:23 08:23 09:43 09:52 09:52 09:53 09:53

installer.log.1 webmin aptitude apache setuid.yesterday exim setuid.today setuid.changes faillog daemon.log ksymoops dmesg kern.log debug messages lastlog wtmp syslog auth.log

4. file El comando ls -l permite obtener cierta información sobre los archivos listados, pero no describe su contenido.

Dado que la noción de extensión no existe en Linux, es arriesgado fiarse sólo del nombre del archivo para determinar su tipo de contenido. El comando file muestra esta información: [willy]$ file /etc/passwd /home /bin/ls /etc/passwd: ISO-8859 text /home: directory /bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), stripped

Para obtener estos resultados, el comando file compara el contenido de los archivos pasados como argumentos con las descripciones indicadas en su base de datos. La base de datos de file se encuentra en el archivo /usr/share/file/magic (ver página del manual man 5 magic).

5. stat Al igual que el comando ls -l, la herramienta stat muestra la información contenida en el inodo de los archivos pasados como argumentos: [willy]$ ls -ld /bin/ls /etc/passwd /tmp -rwxr-xr-x 1 root root 82060 jan 26 19:38 /bin/ls -rw-r--r-1 root root 1364 may 26 23:08 /etc/passwd drwxrwxrwt 18 root root 4096 jun 1 10:53 /tmp [willy]$ stat /bin/ls /etc/passwd /tmp File: ’/bin/ls’ Size: 82060 Blocks: 176 IO Block: 4096 archivo regular Device: 305h/773d Inodo: 32802 Links: 1 Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2008-06-01 11:28:05.000000000 +0200 Modify: 2008-01-26 19:38:12.000000000 +0100 Change: 2008-05-26 07:43:30.000000000 +0200 File: ’/etc/passwd’ Size: 1364 Blocks: 8 IO Block: 4096 archivo regular Device: 305h/773d Inodo: 557308 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2008-06-01 11:28:15.000000000 +0200 Modify: 2008-05-26 23:08:54.000000000 +0200 Change: 2008-05-26 23:08:54.000000000 +0200 File: ’/tmp’ Size: 4096 Blocks: 8 IO Block: 4096 directorio Device: 305h/773d Inodo: 81921 Links: 18 Access: (1777/drwxrwxrwt) Uid: ( 0/ root) Gid: ( root) Access: 2008-06-01 11:28:02.000000000 +0200 Modify: 2008-06-01 10:53:11.000000000 +0200 Change: 2008-06-01 10:53:11.000000000 +0200

La información mostrada es:

0/

File Size Blocks IO Block tipo de archivo Access Uid Gid Access Modify Change

Nombre del archivo. Tamaño real del contenido del archivo en número de bytes. Número de bloques ocupados en el disco por el archivo. Tamaño de un bloque de datos en bytes en la partición donde se encuentra el archivo. (equivalente a los presentados por el comando ls -l). Permiso de acceso al archivo. Identificador del usuario propietario del archivo. Identificador del grupo propietario del archivo. Fecha de la última consulta del archivo. Fecha de la última modificación del contenido del archivo (es la fecha mostrada con ls -l). Fecha de la última modificación del inodo del archivo; al cambiar los derechos asociados al archivo, por ejemplo.

Directorios 1. mkdir El comando mkdir (make directory) permite crear directorios: [willy]$ ls -l total 12 drwxr-xr-x 2 willy tec drwxr-xr-x 2 willy tec -rw-r--r-- 1 willy tec [willy]$ mkdir flores [willy]$ ls -l total 16 drwxr-xr-x 2 willy tec drwxr-xr-x 2 willy tec drwxr-xr-x 2 willy tec -rw-r--r-- 1 willy tec

4096 jun 1 10:42 colores 4096 jun 1 10:43 formas 62 may 26 22:55 notas

4096 4096 4096 62

jun 1 jun 1 jun 1 may 26

10:42 11:30 10:43 22:55

colores flores formas notas

Se pueden indicar varios argumentos en la línea de comandos: [willy]$ colores [willy]$ [willy]$ .: colores

ls flores formas notas mkdir nombres flores/alegres ls . flores flores

formas

nombres

notas

flores: alegres

Hay que agregar la opción -p para crear una serie de directorios anidados: [willy]$ mkdir -p estaciones/invierno/enero

[willy]$ ls -R .: colores flores ./colores: azul amarillo

formas

nombres

notas

estaciones

rojo

./flores: alegres ./flores/alegres: ./formas: círculo triángulo ./nombres: ./estaciones: invierno ./estaciones/invierno: enero ./estaciones/invierno/enero:

2. rmdir rmdir (remove directory) permite borrar directorios. Como en el comando mkdir, la opción -p permite borrar una serie de directorios anidados. La ejecución de rmdir está sometida a condiciones:  

El directorio que se quiere borrar debe estar vacío (sólo incluye los nombres de archivo . y ..); El directorio que se quiere borrar o uno de sus subdirectorios no deben ser el directorio actual del usuario (o de cualquier otro proceso); si es así, el usuario se encuentra en una ubicación indefinida donde ya no puede crear nuevos archivos hasta el próximo cambio de directorio con el comando cd.

[willy]$ ls colores flores formas nombres notas estaciones [willy]$ rmdir nombres [willy]$ ls colores flores formas notas estaciones [willy]$ rmdir -p estaciones/invierno/enero [willy]$ ls colores flores formas notas [willy]$ rmdir flores rmdir: ’flores’: Directory not empty [willy]$ rmdir flores/alegres [willy]$ rmdir flores [willy]$ ls colores formas notas

Archivos

1. touch El comando touch cambia las fechas del último acceso y de la última modificación de un archivo existente: [willy]$ ls -l notas -rw-r--r-- 1 willy tec 62 may 26 22:55 notas [willy]$ touch notas [willy]$ ls -l notas -rw-r--r-- 1 willy tec 62 jun 1 11:37 notas

Diversas opciones, detalladas en la página del manual electrónico (véase capítulo Documentación - Manual), permiten precisar el nuevo fechado del archivo. Cuando se emplea este comando con un nombre de archivo inexistente como argumento, se crea un archivo con ese nombre que no contiene ningún dato: [willy]$ ls -l total 12 drwxr-xr-x 2 willy tec 4096 drwxr-xr-x 2 willy tec 4096 -rw-r--r-- 1 willy tec 62 [willy]$ touch nuevoarch [willy]$ ls -l total 12 drwxr-xr-x 2 willy tec 4096 drwxr-xr-x 2 willy tec 4096 -rw-r--r-- 1 willy tec 62 -rw-r--r-- 1 willy tec 0

jun jun jun

1 10:42 colores 1 10:43 formas 1 11:37 notas

jun jun jun jun

1 1 1 1

10:42 10:43 11:37 11:38

colores formas notas nuevoarch

2. cp La copia de archivos se efectúa con el programa cp; la sintaxis principal de este comando es: cp [-R]

Se puede copiar un archivo normal en un nuevo directorio o con un nuevo nombre, o ambas cosas a la vez; por ejemplo: [willy]$ ls -R .: colores formas ./colores: azul amarillo

notas

nuevoarch

rojo

./formas: círculo triángulo [willy]$ cp notas minota [willy]$ cp colores/amarillo formas [willy]$ cp formas/triángulo curva [willy]$ ls -R .: colores curva formas rombo notas

nuevoarch

./colores: azul amarillo

rojo

./formas: amarillo círculo

triángulo

Atención: según la configuración del sistema (alias predefinidos), la destrucción de un archivo existente en una copia no genera ni error, ni mensaje de alerta. cp permite la copia de varios archivos al mismo tiempo. En este caso, el destino es obligatoriamente un directorio: [willy]$ cp notas minota formas [willy]$ ls -R .: colores curva formas rombo notas ./colores: azul amarillo

nuevoarch

rojo

./formas: amarillo rombo

notas

círculo

triángulo

Finalmente, la opción -R (recursivo) permite especificar un directorio como argumento de origen; sin éste, cp ignora los directorios durante la copia: [willy]$ cp notas formas colores cp: omisión del directorio `formas’ [willy]$ ls -R .: colores curva formas rombo notas ./colores: azul amarillo

notas

rojo

./formas: amarillo rombo notas círculo [willy]$ cp -R formas colores [willy]$ ls -R colores colores: azul formas

amarillo

colores/formas: amarillo rombo

nuevoarch

notas

notas círculo

triángulo

rojo triángulo

Otras opciones La opción -i (o --interactive) pregunta al usuario antes de destruir un archivo ya existente. Por el contrario, la opción -f (o --force) destruye los archivos de destino sin preguntar nada. Si ambas opciones se emplean a la vez, cp destruye los archivos de destino sin preguntar al usuario. willy]$ ls notas colores notas

colores: azul formas amarillo notas rojo [willy]$ cp notas colores [willy]$ cp -i notas colores cp: destruir ’colores/notas’?s [willy]$ cp -if notas colores

-d (o --no-dereference) permite copiar los enlaces como tales en lugar de copiar los archivos a los que apuntan. Con la opción -p (o --preserve), la copia conserva el propietario, el grupo, los derechos de acceso y el fechado del archivo original. Esto sólo vale si el usuario está conectado como administrador (root). [willy]$ ls -rw-r--r-[willy]$ cp [willy]$ ls -rw-r--r--rw-r--r-[willy]$ cp [willy]$ ls -rw-r--r--rw-r--r--rw-r--r--

-l notas 1 willy tec 62 jun 1 11:37 notas notas.2 -l notas notas.2 1 willy tec 62 jun 1 11:37 1 willy tec 62 jun 1 12:06 -p notas notas.3 -l notas notas.2 notas.3 1 willy tec 62 jun 1 11:37 1 willy tec 62 jun 1 12:06 1 willy tec 62 jun 1 11:37

notas notas notas.2 notas notas.2 notas.3

Finalmente, la opción -a (o --archive) equivale a las opciones -dpR. La usa básicamente el administrador para guardar directorios de forma idéntica.

3. rm El comando rm (remove) borra los archivos pasados como argumento. Esta eliminación es definitiva. No hay ningún mecanismo de papelera implementado de modo predeterminado en Linux. [willy]$ ls -R .: colores curva ./colores: azul formas

formas

rombo

notas

amarillo

notas

rojo

./colores/formas: amarillo rombo notas

círculo

notas.2

notas.3

nuevoarch

triángulo

./formas: amarillo rombo notas círculo triángulo [willy]$ rm notas.2 notas.3 nuevoarch colores/notas formas/notas [willy]$ ls -R colores curva formas ./colores: azul formas amarillo ./colores/formas: amarillo rombo notas

rombo

notas

rojo círculo

triángulo

./formas: amarillo rombo

círculo

triángulo

A la manera de cp, el comando rm requiere la opción -R (o -r) para el borrado de directorios: [willy]$ ls -l colores total 16 -rw-r--r-- 1 willy tec 30 jun 1 10:42 azul drwxr-xr-x 2 willy tec 4096 jun 1 12:03 formas -rw-r--r-- 1 willy tec 172 jun 1 10:42 amarillo -rw-r--r-- 1 willy tec 54 jun 1 10:42 rojo [willy]$ rm colores/formas rm: no se puede borrar ’colores/formas’: Is a directory [willy]$ rm -R colores/formas [willy]$ ls -l colores total 12 -rw-r--r-- 1 willy tec 30 jun 1 10:42 azul -rw-r--r-- 1 willy tec 172 jun 1 10:42 amarillo -rw-r--r-- 1 willy tec 54 jun 1 10:42 rojo

Así, ahora es posible borrar directorios no vacíos; esto no ocurriría con el comando rmdir visto anteriormente. Opciones Como en el comando cp, existen las opciones -i (--interactive) y -f (--force) que permiten respectivamente preguntar o no al usuario al borrar archivos y directorios.

4. mv El comando mv (move) permite mover y renombrar archivos o directorios.

A diferencia de cp y rm,este comando puede tratar directorios sin opciones suplementarias. La sintaxis de este comando es: mv

El origen puede ser tanto un archivo normal como un directorio; este archivo:   

Se mueve al directorio de destino si existe. Se renombra con el nombre del destino si no existe. Destruye el archivo de destino si existe.

[willy]$ ls -R .: colores curva

formas

rombo

notas

./colores: azul amarillo

rojo

./formas: amarillo rombo círculo triángulo [willy]$ mv rombo cuadrado [willy]$ mv notas colores/verde [willy]$ mv formas/amarillo colores [willy]$ ls -R .: cuadrado colores curva formas ./colores: azul amarillo

rojo

./formas: rombo círculo

triángulo

verde

Cuando hay varios archivos o directorios origen, el destino es el directorio que los acogerá: [willy]$ mv cuadrado curva formas [willy]$ ls -R .: colores formas ./colores: azul amarillo ./formas: cuadrado curva

rojo

verde

rombo

círculo

triángulo

Una vez más, las opciones -i (--interactive) y -f (--force) permiten preguntar o no al usuario al destruir archivos.

Organización física de los archivos en Linux Aunque esta etapa parezca precipitada para una aproximación de tipo "usuario" a Linux, el aprendizaje de la organización física de los sistemas de archivos es primordial. Permite una correcta comprensión de la noción de enlaces y una buena gestión de los derechos de acceso.

1. Inodos y bloques de datos Un sistema de archivos físico puede separarse en dos partes distintas:  

la tabla de inodos; los bloques de datos.

Todo archivo está constituido por un inodo con la información relativa al archivo y un cierto número de bloques de datos con los datos del usuario almacenados en el archivo.

Inodos Cada archivo se representa por una estructura llamada inodo (índex node). Estos inodos se agrupan en una tabla y se identifican por un número. El inodo contiene toda la información sobre el archivo, salvo su nombre:        

Tipo de archivo: - (normal), d (directorio), l (enlace simbólico), b (bloque), c (carácter), p (tubo), s (socket). Modo o derechos de acceso al archivo. Número de enlaces físicos (hard links): corresponde al número de referencias, es decir, al número de nombres para este mismo archivo. UID o identificador del usuario propietario. GID o identificador del grupo propietario. Tamaño del archivo en número de bytes. Fechas de la última consulta, modificación del contenido y modificación del inodo del archivo. Direcciones que apuntan a los bloques de datos que constituyen el archivo.

Veamos un ejemplo de archivo de cada tipo: [gerardo]$ ls -ld /etc/motd /lib /dev/hda /dev/null /etc/rc.local /dev/ initctl /dev/log -rw-r--r-1 root root 0 jan 13 2008 /etc/motd drwxr-xr-x 7 root root 3072 nov 1 06:29 /lib brw-rw---1 root disk 3, 0 aug 31 01:31 /dev/hda crw-rw-rw1 root root 1, 3 aug 31 01:31 /dev/null lrwxrwxrwx 1 root root 13 nov 1 05:56 /etc/rc.local -> rc.d/rc.local prw------1 root root 0 nov 12 05:30 /dev/initctl srw-rw-rw1 root root 0 nov 12 05:32 /dev/log

Bloques de datos Los datos reales de los archivos se guardan en los bloques de datos. En el caso de un archivo directorio, los datos guardados pueden representarse como una tabla que establece la correspondencia entre los nombres de los archivos contenidos en el directorio y sus números de inodos. Por ejemplo: [gerardo]$ ls -ali total 3 12378 drwxr-xr-x 2 32641 drwxr-x--4 14455 -rw-r--r-2 $ cat archivo1 texto contenido en el

Puede representarse por:

root root root archivo

root root root

1024 nov 13 03:15 . 1024 nov 13 03:13 .. 30 nov 13 03:14 archivo1

El nombre de un archivo se guarda en los datos del directorio, y no en su inodo, por lo que es fácil dar varios nombres (referencias o enlaces duros) al mismo archivo. La adición de un nuevo nombre a un archivo se hace mediante: ln [-s]

Sin la opción -s, este comando creará un enlace duro (hard link), mientras que con la opción -s, creará un enlace simbólico (soft link): [gerardo]$ ln archivo1 archivo2 [gerardo]$ cat archivo2 texto contenido en el archivo [gerardo]$ ln -s archivo1 archivo3 [gerardo]$ ls -ali total 4 12378 drwxr-xr-x 2 root root 1024 32641 drwxr-x--4 root root 1024 14455 -rw-r--r-2 root root 30 14455 -rw-r--r-2 root root 30 16214 lrwxrwxrwx 1 root root 30 archivo1

nov nov nov nov nov

13 13 13 13 13

03:15 03:13 03:14 03:14 03:15

. .. archivo1 archivo2 archivo3 ->

Un enlace duro es una segunda entrada que apunta al mismo inodo, mientras que el enlace simbólico es un archivo especial (tipo l) con la ruta del archivo al que apunta; este último equivale a los "accesos directos" de los sistemas Microsoft Windows.

Condiciones generales de uso Copyright - ©Editions ENI

Administradores de archivos Existen en Linux muchas herramientas que agrupan de forma más o menos ergonómica y amigable todas las funcionalidades implementadas por los comandos enunciados hasta ahora.

1. Midnight Commander Midnight Commander se llama con el comando mc en la línea de comandos. Es un administrador de archivos completo en un entorno de texto con una interfaz de usuario de un producto similar existente en DOS. Veamos un ejemplo de presentación:

La tecla [Tab] permite pasar de una mitad de la pantalla a la otra (izquierda-derecha), mientras que las teclas de función [F1] a [F10] invocan los comandos indicados en la parte inferior de la pantalla.

2. Konqueror, Nautilus En la consola gráfica, los administradores de archivos más extendidos son Konqueror y su substituto Dolphin y Nautilus. La elección de la herramienta es subjetiva y depende generalmente de la distribución y el entorno de escritorio utilizados. Una ventana de Dolphin:

Una vista posible de Nautilus:

Consultar archivos 1. cat cat muestra en la pantalla el contenido de los archivos pasados como argumento en la línea de comandos: [nicolas]$ cat /etc/motd Bienvenido a Linux Está conectado al equipo doe.reso.local

2. more, less El comando Unix more también permite la presentación del contenido de archivos de texto en pantalla. Sin embargo, su visualización se hace página por página; las teclas útiles con more son: [Intro] [Espacio] [q]

Desplaza el texto línea a línea. Desplaza el texto página por página. Sale del programa.

Este ejemplo muestra el indicador presente en la parte inferior de la pantalla: [nicolas]$ more /etc/services ssh 22/udp telnet 23/tcp telnet 23/udp # 24 - private mail system

# SSH Remote Login Protocol

smtp smtp time time rlp rlp nameserver nameserver nicname nicname tacacs (TACACS) tacacs (TACACS) re-mail-ck Protocol re-mail-ck Protocol domain domain whois++ --Sigue--(10%)

25/tcp 25/udp 37/tcp 37/udp 39/tcp 39/udp 42/tcp 42/udp 43/tcp 43/udp 49/tcp

mail mail timserver timserver resource resource name name whois whois

# # # #

resource location resource location IEN 116 IEN 116 # Login Host Protocol

49/udp

# Login Host Protocol

50/tcp

# Remote Mail Checking

50/udp

# Remote Mail Checking

53/tcp 53/udp 63/tcp

# name-domain server

Existe en Linux un comando similar, más evolucionado que more, llamado less. Además de las teclas anteriores, acepta también: Sube una línea. Baja una línea. Sube una página. Baja una página.

[Arriba] [Abajo] [Re pág] [Av pág]

Finalmente, el comando less tiene las mismas funciones de búsqueda de cadenas que el editor Vi descrito en el capítulo Edición de archivos de texto - Vi.

El uso de los comandos more y less se adapta bien a la presentación de archivos de texto largos.

3. od, strings El comando od (octal dump) muestra el contenido de un archivo en octal o en otros formatos según las opciones; la opción -x produce una salida hexadecimal, por ejemplo: [nicolas]$ cat /etc/motd Bienvenido a Linux Está conectado al equipo doe.reso.local [nicolas]$ od /etc/motd 0000000 0000020 0000040 0000060 0000100 0000106

064502 067151 067157 061541 067554

067145 074165 062556 064550 060543

062566 053012 072143 062556 005154

072556 072557 020351 062040

020145 020163 072563 062557

067563 072352 020162 071056

071565 071545 060554 071545

046040 061440 066440 027157

[nicolas]$ od -x /etc/motd 0000000 6942 6e65 6576 756e 0000020 6e69 7875 560a 756f 0000040 6e6f 656e 7463 20e9 0000060 6361 6968 656e 6420 0000100 6f6c 6163 0a6c 0000106

2065 2073 7573 656f

6f73 74ea 2072 722e

7375 7365 616c 7365

4c20 6320 6d20 2e6f

Este tipo de presentación lo usan principalmente los programadores para examinar el contenido de archivos binarios. Del mismo estilo, el comando strings muestra las cadenas de caracteres legibles contenidas en los archivos binarios; esto puede resultar útil para un programador o un administrador del sistema en caso de depuración: [nicolas]$ strings /bin/ls /lib/ld-linux.so.2 libtermcap.so.2 _DYNAMIC _init tgetent _fini _GLOBAL_OFFSET_TABLE_ _Jv_RegisterClasses tgetstr ...

ntroducción Sea cual sea el sistema operativo utilizado, es indispensable saber editar archivos de texto. Esto es mucho más cierto aún en Linux, pues la inmensa mayoría de los archivos de configuración y de scripts del shell están en este formato, sin olvidar también los archivos de log.

Se entiende por archivo de texto un archivo que contiene datos en forma de caracteres ASCII (American Standard Code for Information Interchange), es decir, texto sin formato, ni siquiera la noción de tipo de letra. Desde el simple comando ed que permite editar línea por línea un archivo de texto, hasta la herramienta nedit con interfaz gráfica que propone el coloreado sintáctico de diferentes formatos de archivo, existe un gran número de editores en Linux. A pesar de una interfaz poco ergonómica (pero sin embargo muy potente), el editor de Vi, se ha convertido en un estándar en todos los sistemas UNIX, y es el que presentaremos en este capítulo.

Actualmente, se utiliza una variante de Vi, normalmente Vim (Vi IMproved). Sin embargo, los comandos que veremos aquí son idénticos

Presentación de Vi Vi, que significa "VIsual editor" y se pronuncia "vi-ei" (o [vi:ai]), es un editor a pantalla completa con línea de comandos. Pensado para trabajar en cualquier tipo de terminal (y por lo tanto con cualquier teclado), esta herramienta puede funcionar utilizando únicamente las teclas alfanuméricas básicas, además de la tecla de escape del teclado. En un teclado de PC español "qwerty" actual, podríamos limitarnos a utilizar las teclas blancas siguientes:

Es posible utilizar las teclas grises del teclado, como las flechas de dirección o el teclado numérico, pero es preferible saber manipular vim sin estas teclas al principio. Así, sea cual sea la configuración del terminal o la variante de vi - empleada, la edición de un archivo en Linux no presentará problemas.

1. Inicio de Vi Basta con escribir el comando vi para iniciar el editor Vi. En este caso, se abre el editor, listo para escribir un nuevo archivo: _ ~ ~ ~ ~ ~ VIM - Vi ~ ~ Improved ~ ~ versión 7.3.712 ~ by Bram Moolenaar et al. ~ Modified by ~ Vim is open source and freely distributable ~ ~ Sponsor Vim development! ~ type :help sponsor for information ~ type :q to exit ~ type :help or for on-line help ~ type :help version7 for version info ~ ~ ~ ~

~

Aquí, el cursor se encuentra arriba a la izquierda de la pantalla y se muestra un texto de bienvenida; éste no interfiere con el texto del nuevo archivo y se ocultará automáticamente con el primer comando de edición. La última línea de la vista se reserva a mostrar información diversa (posición del cursor, número de línea, modo de funcionamiento...) y a los comandos en modo "ex" que se detallarán más adelante.

El carácter ~ al principio de línea significa que no hay ningún carácter -ni siquiera un retorno de carro (tecla [Intro])- en la línea, es decir, que se ha llegado al final del archivo. También puede editarse un archivo existente especificando su nombre como argumento en la línea de comando: $ vi archivo

Finalmente, si el argumento pasado es un nombre de archivo inexistente, el nuevo archivo editado se guardará con este nombre predeterminado: $ vi nuevo_archivo

Para salir del editor Vi sin haber leído el resto del capítulo, hay que escribir la siguiente secuencia de teclas: [Esc], [:], [q], [!], [Intro].

2. Modos de funcionamiento Vi dispone de tres modos de funcionamiento: 

 

Modo "comandos": en este modo, cada pulsación de una tecla o una combinación de teclas se interpreta como un comando (mover el cursor, edición del texto...). Modo "inserción" o "edición": en este modo, los caracteres pulsados en el teclado se insertan tal cual en el archivo. Modo "inferior de la pantalla", "ex" o "global": este modo permite ordenar a Vi la ejecución de comandos complejos (mostrados a medida que se escriben en la parte inferior de la pantalla). Los comandos pasados en este modo afectan a todo el archivo o al propio editor; por ejemplo, buscar o reemplazar cadenas de caracteres, guardar el archivo modificado, configurar opciones del editor.

En todo momento, el usuario se encuentra en uno de estos modos y la tecla [Esc] permite volver al modo "comandos" (o permanecer en él):

Al abrir el editor, el usuario se encuentra en el modo "comandos".

3. Comandos de desplazamiento Vi funciona perfectamente sin usar las flechas del teclado; para ello, se han definido diversos comandos que permiten desplazarse dentro de un archivo. Para su ejecución, todos estos comandos deben escribirse en el modo "comandos" de Vi.

En principio, el desplazamiento del cursor a la izquierda, abajo, arriba y a la derecha se realiza con los comandos h, j, k y l. Es fácil recordar estas teclas: están dispuestas de forma adyacente en el teclado:    

La [h] es a la izquierda: permite mover el cursor un carácter a la izquierda. La [l] es a la derecha: permite mover el cursor un carácter a la derecha. La [j] es una letra "descendente": permite mover el cursor una línea hacia abajo. La [k] es una letra "ascendente": permite mover el cursor una línea hacia arriba.

Movimiento en la misma línea Los principales comandos de desplazamiento del cursor en una misma línea son:   

 

[0]: mueve el cursor a principio de línea (al primer carácter). [$]: mueve el cursor a fin de línea (al último carácter). [w] y [W] (word): mueve el cursor al primer carácter de la palabra siguiente. El comando w (minúscula) difiere de W (mayúscula) sólo en la noción de "palabra"; en el primer caso, todo carácter no alfanumérico es un separador, mientras que en el segundo caso, sólo los caracteres de espacio (espacio, tabulación y salto de línea) separan las palabras. [b] y [B] (back): mueve el cursor al primer carácter de la palabra anterior. La distinción entre b y B es la misma que entre w y W. [e] y [E] (end): mueve el cursor al último carácter de la palabra siguiente. De nuevo, la diferencia entre e y E afecta a la definición de los caracteres de separación de palabras.

Estos tres últimos comandos (w, b y e) con sus contrapartes en mayúsculas (W, B y E) muestran que existe una cierta lógica en los comandos de Vi. Normalmente, los comandos en mayúsculas extienden las funciones de los comandos en minúsculas. Los términos mnemotécnicos se presentan entre paréntesis. Movimientos de cambio de línea Además de las teclas [j] y [k], que permiten mover el cursor a la línea siguiente o anterior, existen principalmente: 

[G]: mueve el cursor al primer carácter de la última línea del archivo.



[nG] (donde n es un número): mueve el cursor al primer carácter de la línea número n. Por ejemplo, 6G coloca el cursor en el primer carácter de la sexta línea y 1G lo lleva al principio del archivo.

El comando G puede llevar como prefijo un número; otros muchos comandos de Vi aceptan un "multiplicador" así. Por ejemplo, 3j mueve el cursor tres líneas hacia abajo y 2w mueve el cursor a la primera letra de la segunda palabra siguiente. Existen otros muchos comandos de movimiento, como: Mueve el cursor (y la visualización) una página hacia arriba (página anterior). Mueve el cursor (y la visualización) una página hacia abajo (página [Ctrl]+[f] siguiente). [Ctrl]+[b]

4. Comandos de inserción A partir del modo "comandos" en el que el usuario se encuentra de modo predeterminado, no es posible escribir texto. En efecto, no se puede insertar directamente el texto "hello world" en un archivo: las pulsaciones de las teclas [h], [e], [l] y siguientes corresponden a comandos ya parcialmente presentados. Hay que pasar al modo "inserción" para escribir texto; se entra en este modo con diferentes comandos escritos en el modo "comandos"; los principales son: 

 

i (insert): pasa al modo "inserción"; los nuevos caracteres pulsados se insertan delante del cursor. No es posible, con este comando, escribir texto al final de la línea porque se inserta obligatoriamente delante del último carácter sobre el que se encuentra el cursor. a (append): pasa al modo "inserción"; los nuevos caracteres escritos se insertan tras el cursor; en este caso, es posible escribir texto al final de la línea. o (abrir una línea): "abre" una nueva línea bajo el cursor y pasa al modo "inserción".

Como ocurre con ciertos comandos de desplazamiento, los comandos anteriores se amplían cuando se escriben en mayúscula: I Mueve el cursor al principio de línea y pasa al modo "inserción". A Mueve el cursor al fin de línea y pasa al modo "inserción". O "Abre" una nueva línea encima del cursor y pasa al modo "inserción".

Hemos visto anteriormente que la tecla [Esc] permitía, en cualquier momento, volver al modo "comandos".

5. Comandos de edición y de corrección Al no disponer de las teclas [Supr] y [Retroceso] del teclado, no es posible con la versión original de Vi corregir los errores de escritura durante la inserción. Los comandos de edición y de corrección se ejecutan a partir del modo "comandos" y no pueden usarse en modo "inserción".

Vim, que se utiliza en Linux, soporta sin problemas la corrección durante la inserción mediante las teclas [Supr] y [Retroceso] del teclado.

Borrar caracteres La supresión del carácter situado bajo el cursor se efectúa mediante el comando x. El carácter que antecede al cursor, por su parte, se borra con X. Una serie de comandos que empiezan por d (delete) permite borrar todo o parte de una línea: dd Borra toda la línea. d0 Borra desde el cursor hasta el principio de la línea. d$ Borra desde el cursor hasta el fin de la línea. Borra desde el cursor hasta el principio de la palabra siguiente. De hecho, dw se puede combinar los comandos de desplazamiento que hemos visto anteriormente con d; por ejemplo dW, db, dE... La cadena de caracteres borrada por un comando que empiece por d se guarda en una memoria intermedia o "búfer" (equivalente al portapapeles de Windows). El texto contenido en esta memoria intermedia puede "pegarse" tras el cursor mediante el comando p (paste) o delante del cursor con P.

Los comandos de supresión y los comandos siguientes de edición aceptan -como los comandos de desplazamiento- un multiplicador como prefijo. Copiar texto Al igual que los comandos que empiezan por d permiten "cortar" texto, los comandos que empiezan por y "copian" una cadena de caracteres en la memoria intermedia de Vi. De nuevo, el contenido de esta memoria intermedia puede "pegarse" con los comandos p y P. Los comandos "y" se asocian a los comandos de desplazamiento vistos anteriormente; por ejemplo:

yy y0 y$

Copia toda la línea. Copia del cursor al principio de la línea. Copia del cursor al final de la línea.

El contenido de la memoria intermedia se conserva mientras no se ejecute ningún nuevo comando "y" o "d" . Anular y repetir El comando u anula el comando anterior. Vim (y no Vi) permite la anulación sucesiva de todas las modificaciones realizadas en el archivo hasta la última vez que se guardó. El comando U anula de golpe todas las modificaciones aportadas a la línea actual. Por el contrario, el comando . (punto) repite el último comando ejecutado en Vi excepto un desplazamiento o una anulación.

6. Comandos globales El tercer modo de funcionamiento de Vi, llamado "ex" en el esquema, permite ejecutar comandos relativos a todo el archivo. Un comando global empieza por [:], [/] o [?] (los dos últimos caracteres en el caso de una búsqueda) y se valida con la tecla [Intro]. Para anular un comando "ex" y volver de inmediato al modo "comandos", basta pulsar la tecla [Esc].

Guardar y salir Los comandos para guardar y salir de Vi son: :w :w archivo :w!

:q :q! :wq, :x o ZZ (en modo "comandos")

Guarda en el archivo existente (cuyo nombre ya se ha definido). Guarda en el archivo cuyo nombre es archivo. Fuerza la grabación si el usuario no tiene el derecho de modificar el archivo; éste debe, sin embargo, pertenecer al usuario (véase chmod y los derechos de acceso en el capítulo Permisos de acceso a los archivos). Sale del editor Vi salvo si se han hecho cambios no guardados en el archivo. Fuerza la detención de Vi sin guardar los cambios. Guarda el archivo y sale del editor.

Buscar En Vi, hay dos maneras de iniciar una búsqueda de cadena de caracteres: con el carácter [/] para una búsqueda desde el cursor hasta el fin del archivo, o con el carácter [?] para una búsqueda desde el cursor hasta el principio del archivo. La búsqueda se efectúa sobre la cadena de caracteres escrita en la parte inferior de la pantalla con el / o el ?: /modelo o ?modelo. Por ejemplo, tras la validación, /vale colocará el cursor en la primera instancia de la cadena de caracteres "vale" encontrada tras la posición actual del cursor.

El modelo indicado tras el / o el ? puede tomar la forma de una expresión regular para efectuar búsquedas más evolucionadas. Las expresiones regulares se abordarán con el comando grep más adelante en esta obra. De nuevo en modo "comandos", n (next) coloca el cursor sobre la siguiente instancia (el sentido depende de la forma como se haya iniciado la búsqueda: / o ?) de la última cadena buscada; N permite volver a la instancia anterior. Buscar y reemplazar La sintaxis general del comando de sustitución en Vi es: :[rango]s/modelo/cadena/[g][i][I]

En realidad, el comando de sustitución de Vi es más complejo. Aquí sólo se presentan las funcionalidades más interesantes. [rango] es optativo e indica en qué líneas del archivo realizar el reemplazo; su sintaxis es n,m donde n es el número de la primera línea considerada y m es el de la última línea del rango; el carácter $ permite indicar la última línea del archivo. Así, para realizar una sustitución en todas las líneas del archivo (de la primera a la última línea), el rango será 1,$. modelo representa la cadena de caracteres que será reemplazada por la cadena de caracteres cadena.

Si el modelo o la cadena de reemplazo presentan en su interior el carácter /, éste deberá ir prefijado con un \ para evitar toda ambigüedad en la sintaxis. Los tres parámetros siguientes son opcionales:

Indica que la sustitución se realiza en todas las instancias de la línea tratada; g sin este parámetro, sólo la primera instancia del modelo se cambiará en cada línea. Precisa que la caja del modelo (mayúsculas/minúsculas) se ignora en la i búsqueda. En este caso, la cadena "vale" se considera como equivalente de la cadena "vALe". Especifica que la caja del modelo (mayúsculas/minúsculas) se respeta en la I búsqueda. En este caso, la cadena "vale" es diferente de la cadena "vALe". Este parámetro está activo de modo predeterminado. Para resumir, la sustitución global en todo el archivo de la cadena "vale" por la cadena "pif" se realizará con: :1,$s/vale/pif/g

Comandos externos Otra particularidad del editor Vi es permitir la ejecución de comandos externos, es decir, de comandos de shell, sin tener que salir del programa. Para ello, una vez en modo "ex" llamado con :, basta con escribir un comando del shell precedido del carácter !, esto da, por ejemplo, en la parte inferior de la pantalla: [nicolas]$ cal 6 2008 junio de 2008 do lu ma mi ju vi sá 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 Pulsar enter y teclear un comando para seguir

Se pide una nueva pulsación de la tecla [Intro] para volver al editor cuando el comando de shell ha terminado. Para insertar el resultado del comando externo en el archivo editado, hay que llamar al comando r antes de ejecutar el comando del shell, por ejemplo: :r!date

La fecha devuelta por el comando date del shell se inserta en el texto tras el cursor. Opciones del editor :set sólo devuelve las opciones de configuración actuales del editor, mientras que :set all muestra todas las opciones disponibles.

Algunas de estas opciones se activan escribiendo :set seguido del nombre de la opción y se desactivan precediendo con no el nombre de esta opción. Por ejemplo, para activar la opción que muestra los números de línea: :set number

Y para desactivar esta misma opción: :set nonumber

El segundo tipo de opciones está asociado a un número o a una cadena de caracteres. Para asignar un valor a una de estas opciones, se usa la sintaxis siguiente: :set opción=valor Por ejemplo, para fijar la anchura visible de una tabulación en cuatro espacios: :set tabstop=4

Existen muchas opciones configurables en Vim, como: [no]autoindent [Des]Activa el sangrado automático de las líneas al escribir. [no]number [Des]Activa la numeración de líneas. [Des]Activa la presentación de los caracteres no imprimibles. [no]list [Des]Activa la presentación del modo actual en la parte [no]showmode inferior de la pantalla. Define el tamaño de una tabulación a n espacios. tabstop=n [Des]Activa la distinción de la caja de los caracteres en las [no]ignorecase búsquedas y sustituciones.

7. Archivo de configuración personal Para que las opciones especificadas en Vi se tengan en cuenta cada vez que arranca el editor, hay que escribirlas en un archivo de configuración. Cada usuario tiene su propio archivo de configuración, que se encuentra en el directorio personal del usuario y se llama .exrc (EX Run Commands) o .vimrc en el caso del editor Vim. Este archivo contiene las opciones tal como se definen en el editor sin el primer :; por ejemplo, el usuario linus que quiere numerar las líneas y tener tabulaciones visibles con cuatro espacios cada vez que inicie Vi, creará el archivo siguiente: [linus]$ cat /home/linus/.exrc set number set tabstop=4

8. Otros comandos útiles En Vim hay otros muchos comandos útiles; veamos algunos de ellos:

:help comandoVim :r archivo J ~ rc cw, c$, c0, ... >> /dev/null 2>&1

El núcleo no reasigna inmediatamente un número de PID liberado al finalizar la ejecución de un programa. Esto evita el riesgo de enviar una señal a otro proceso cuando el proceso destinatario termina de otra manera, entre el momento en que se usa el comando ps para identificar el PID y el momento de ejecución del comando kill. El programa top, visto anteriormente, también permite enviar señales a los procesos; para ello, hay que pulsar la tecla [k] una vez ejecutado éste.

Administradores de procesos gráficos Existe evidentemente una amplia gama de herramientas gráficas de administración de procesos. Por ejemplo, el "Monitor del sistema GNOME" funciona también con el entorno de escritorio KDE y se inicia con el comando gnome-system-monitor:

rabajo con procesos 1. Iniciar un proceso En primer plano Les ejemplos presentados hasta ahora funcionan como programas iniciados en primer plano, es decir, procesos que pasan el control al usuario sólo cuando terminan. Esta ejecución de un programa se realiza escribiendo simplemente el comando correspondiente en la línea de comandos con sus eventuales opciones y argumentos. Por ejemplo:

[nicolas]$ sleep 10 (espera de 10 segundos) [nicolas]$

El comando sleep, utilizado en el ejemplo, se limita a esperar el número de segundos indicados en el argumento. En segundo plano Para no verse obligados a esperar el fin del programa antes de poder iniciar otro, es posible ejecutar un comando en segundo plano; así, la línea de comandos reaparece inmediatamente y el usuario puede escribir nuevos comandos. Para iniciar un proceso en segundo plano, basta con agregar el carácter & al final de la línea de comando: [nicolas]$ sleep 10 & [1] 2004 [nicolas]$

La línea situada después del comando sólo aparece a título indicativo y no interfiere en nada con los tratamientos que puede efectuar el comando. El número entre corchetes identifica el trabajo (número de "job") del proceso en el shell actual; el segundo indica el número de PID que el núcleo ha asignado a este proceso. Un poco más tarde, al actualizarse la línea de comandos del shell y cuando el proceso que se ejecutaba en segundo plano finaliza, el shell muestra: [nicolas]$ [1]+ Done [nicolas]$

sleep 10

De nuevo, esta línea no interfiere con los tratamientos en curso de los demás comandos.

2. Detener un proceso Hay tres formas de detener prematuramente un proceso en primer plano:   

Escribir la combinación de teclas [Ctrl]+[c]. La señal 2 (SIGINT) se envía al proceso en curso de ejecución. Pulsar la combinación de teclas [Ctrl]+[\]. La señal 3 (SIGQUIT) se envía al proceso en curso de ejecución. Identificar el PID del proceso a partir de otro terminal y ejecutar el comando kill adecuado.

Por el contrario, el único medio para detener un proceso que se ejecuta en segundo plano es emplear el comando kill apropiado. En efecto, el proceso ya ha pasado el control al usuario, y ya no puede controlarse directamente desde el terminal mediante una combinación de teclas.

3. Controlar los procesos iniciados desde la línea de comandos Al ser posible ejecutar varios programas desde el mismo terminal, está disponible una serie de comandos para controlarlos. Jobs El comando jobs muestra la lista de procesos en curso de ejecución que han sido iniciados desde el terminal actual: [nicolas]$ sleep [1] 2034 [nicolas]$ sleep [2] 2035 [nicolas]$ sleep [3] 2036 [nicolas]$ sleep [4] 2037 [nicolas]$ jobs [1] Running [2] Running [3]- Running [4]+ Running

2222 & 3333 & 4444 & 5555 & sleep sleep sleep sleep

2222 3333 4444 5555

& & & &

Encontramos en esta lista con el carácter & el número de "job" indicado al ejecutar los procesos en segundo plano. Los caracteres + y - presentes al lado de los números de "job" indican respectivamente el último y el penúltimo procesos con los que se ha trabajado en la línea de comandos. bg y fg Si un proceso largo se ha iniciado por error en primer plano (por olvido del carácter & al final de la línea), no es necesario interrumpirlo para reiniciarlo en segundo plano: la combinación de teclas [Ctrl]+[z] lo suspende y permite al usuario recuperar el control del terminal. Entonces es posible volver a ejecutar el proceso, en primer plano o en segundo plano, utilizando respectivamente el comando fg o el comando bg. Estos dos comandos toman como argumento, precedido por el carácter %, el número de "job" del proceso. Si no se indica este número, el comando toma en consideración el último proceso con el que se ha trabajado (indicado con un + por el comando jobs). [nicolas]$ jobs [1] Running [2] Running [3]- Running [4]+ Running [nicolas]$ sleep 6666 (pulsar

sleep 2222 sleep 3333 sleep 4444 sleep 5555 Ctrl + z)

[5]+

sleep 6666

Stopped

& & & &

[nicolas]$ jobs [1] Running [2] Running [3] Running [4]- Running [5]+ Stopped [nicolas]$ bg %5 [5]+ sleep 6666 & [nicolas]$ jobs [1] Running [2] Running [3] Running [4]- Running [5]+ Running [nicolas]$ fg %2 sleep 3333 (pulsar Ctrl + z) [2]+ Stopped [nicolas]$ jobs [1] Running [2]+ Stopped [3] Running [4] Running [5]- Running [nicolas]$ bg [2]+ sleep 3333 &

sleep sleep sleep sleep sleep

2222 3333 4444 5555 6666

& & & &

sleep sleep sleep sleep sleep

2222 3333 4444 5555 6666

& & & & &

sleep 3333 sleep sleep sleep sleep sleep

2222 3333 4444 5555 6666

& & & &

El comando kill también funciona con los números de "jobs" precedidos por el carácter %

ntroducción A pesar de la existencia de interfaces gráficas cada vez más fáciles de utilizar y ergonómicas, el uso de la línea de comandos sigue siendo frecuente en Linux. El aprendizaje del shell permite al lector comprender mejor el funcionamiento del sistema y aumentar su productividad al facilitarle el uso de éste. Este capítulo pasa revista a diferentes funcionalidades ofrecidas por el shell Bash.

Generalidades y definiciones El shell El shell es el programa que se ejecuta automáticamente cuando un usuario se conecta al sistema en un terminal de texto y establece el vínculo entre el usuario y el sistema:

El término "shell" en inglés significa "concha", lo que se corresponde con la imagen de encapsulación que realmente representa.

El shell se llama también "intérprete de comandos" porque:  

Es el que traduce al sistema las instrucciones indicadas por el usuario mediante la línea de comandos y el que presenta la información devuelta en la pantalla. A diferencia de un compilador utilizado en programación (que construye un archivo binario comprensible por el núcleo Linux a partir de una serie de instrucciones contenidas en el código fuente), el shell interpreta y ejecuta cada comando a medida que el usuario los escribe.

Existen muchos shells disponibles para Linux; destacan: 

   

Bourne Shell o sh: es el primer shell escrito para Unix por Steve Bourne. Hoy obsoleto, muchos intérpretes de comandos recientes conservan la compatibilidad con él. El programa correspondiente en Linux es sh o bsh. Korn Shell o KSH: es uno de los intérpretes de comandos más utilizados en el mundo Unix. Es compatible con el shell Bourne original. C shell :este shell fue desarrollado por la rama BSD de Unix y usa una sintaxis diferente de los anteriores. Puede ejecutarse mediante el programa csh. tcsh : es una implementación mejorada del C shell que dispone de una edición avanzada de la línea de comandos. Su ejecutable es tcsh. Bash o Bourne Again Shell: como su nombre indica, es una nueva implementación del shell Bourne y se parece mucho al Korn Shell. Muy funcional, es el intérprete de comandos predeterminado en Linux que se detalla en el resto del capítulo. El programa correspondiente es bash.

Caracteres especiales Los caracteres especiales tienen un significado particular para el shell en la línea de comandos. Se distinguen varias categorías de caracteres especiales:    

los metacaracteres incluyen los caracteres separadores en la línea de comandos: , |, (, ), ;, &, espacio, retorno de carro (tecla [Intro]) y tabulación. los caracteres genéricos (o caracteres de expansión), que permiten la creación de comodines de reemplazo en los nombres de archivo: *, ? y []. los caracteres utilizados en las sustituciones de variables y comandos: $, `, y {}. los caracteres de cita :\, " y ’.

Algunos de estos caracteres pueden tener diferentes significados según el contexto en el que aparezcan. El significado de cada uno de estos caracteres se estudia más adelante.

Variables Verdadero lenguaje de programación, el shell Bash proporciona todos los elementos necesarios para desarrollar aplicaciones; este apartado trata sobre las variables.

Una variable es un parámetro que puede cambiar durante la ejecución de un programa; se le da un nombre para recuperar el valor que representa.

1. Trabajo con variables Asignación de nombre El nombre de una variable es una palabra compuesta exclusivamente por caracteres alfanuméricos y el subrayado _ (underscore), que empieza por una letra o un subrayado. Por convención, el usuario nombrará a las variables con caracteres en minúsculas porque las mayúsculas se emplean generalmente para los nombres de variables de entorno. Como en los nombres de archivo, es preferible dar nombres explícitos a las variables para facilitar el mantenimiento de los scripts generados. Asignación Una variable llamada var puede recibir un valor valor por una asignación de la forma var=valor. No hay ningún espacio antes ni después del carácter = y si el valor se compone de varias palabras o caracteres especiales, debe ir enmarcado entre caracteres de cita (véase sección Caracteres de cita en este capítulo). Una variable existe desde que se le asigna un valor; este valor puede ser un número, una palabra o una cadena de caracteres con cualquier carácter especial: [nicolas]$ [nicolas]$ [nicolas]$ [nicolas]$

var1=12 var2=palabra var3="dos palabras" var4=’car. especiales: $* ?{}()[]"\&~|`ˆ!=%,.;#’

Si no se proporciona ningún valor, la variable recibe una cadena vacía; las dos sintaxis siguientes son equivalentes: [nicolas]$ var5="" [nicolas]$ var6=

Llamada y visualización El shell reemplaza una variable por su valor si su nombre precedido por el carácter $ aparece en la línea de comandos, antes incluso de interpretar el comando escrito: [nicolas]$ echo $var2 palabra

La interpretación de la línea de comandos por parte del shell se efectúa en dos etapas:

La llamada a un nombre de variable no definida no genera errores; el shell se limita a reemplazarla por una cadena vacía. Cuando el nombre de una variable es ambiguo en la línea de comandos, es posible delimitar su nombre con la sintaxis ${var}, por ejemplo: [nicolas]$ var7=vender [nicolas]$ echo ver el contenido de la variable var7: $var7 ver el contenido de la variable var7: vender [nicolas]$ echo el quinto día de la semana es: $var7vi el quinto día de la semana es: [nicolas]$ echo el quinto día de la semana es: ${var7}vi el quinto día de la semana es: viernes

Cuando se llama al comando set sin argumentos, muestra la lista completa de las variables definidas en el shell actual. Aparecen las variables definidas anteriormente: [nicolas]$ set ... var1=12 var2=palabra var3=’dos palabras’ var4=$’car. especiales: $* ?{}()[]"\\&~|`ˆ!=%,.;#’ var5= var6= var7=vender ...

La visualización producida puede reutilizarse como una entrada. Visibilidad de una variable De modo predeterminado, toda variable sólo se define en el shell donde se ha creado; es decir, sólo es accesible desde los subprocesos del shell y se destruye al finalizar la ejecución de dicho shell: [nicolas]$ [nicolas]$ 3 [nicolas]$ [nicolas]$

x=3 echo $x bash echo $x

[nicolas]$ x=7 [nicolas]$ echo $x 7 [nicolas]$ exit [nicolas]$ echo $x 3

El comando export especifica al shell que una variable debe copiarse en el entorno de todos los procesos hijos del shell actual. Este comando puede utilizarse junto con la asignación de una variable: [nicolas]$ [nicolas]$ 3 [nicolas]$ [nicolas]$ 3 [nicolas]$ [nicolas]$ 7 [nicolas]$ [nicolas]$ [nicolas]$ 2 [nicolas]$ [nicolas]$ 3 [nicolas]$

export x=3 echo $x bash echo $x x=7 echo $x y=2 export y echo $y exit echo $x echo $y

El argumento del comando export es el nombre de la variable, y no su contenido: el nombre de la variable no debe ir, pues, antecedido de $. Eliminación Una vez que una variable existe, sólo puede suprimirse con el comando unset: [nicolas]$ set ... var1=12 var2=palabra var3=’dos palabras’ var4=$’car. especiales: $* ?{}()[]"\\&~|`ˆ!=%,.;#’ var5= var6= var7=vender ... [nicolas]$ unset var2 [nicolas]$ set ... var1=12 var3=’dos palabras’ var4=$’car. especiales: $* ?{}()[]"\\&~|`ˆ!=%,.;#’ var5= var6= var7=vender ...

2. Variables de entorno

Las variables de entorno afectan al comportamiento del shell y de la interfaz de usuario. Se definen al cargar el shell y pueden enumerarse mediante el comando set visto anteriormente.

Aunque se pueden modificar como cualquier otra variable, la asignación de valores erráticos a las variables de entorno puede llevar a un comportamiento "aleatorio" del shell y los comandos ejecutados desde él. Los nombres de estas variables de entorno generalmente van en mayúsculas. Aquí presentaremos sólo las principales variables de entorno. $BASH Ruta al propio binario Bash: [nicolas]$ echo $BASH /bin/bash

$BASH_ENV Variable que apunta al archivo de arranque de Bash. Se lee al arrancar cada script para reinterpretar este archivo de comandos. $EDITOR Nombre del editor predeterminado invocado por otras herramientas en línea de comandos; generalmente es la ruta absoluta de vi o emacs. $HOME Ruta completa del directorio personal del usuario conectado actualmente: [nicolas]$ echo $HOME /home/nicolas

$IGNOREEOF Indica el número de veces que el shell ignorará el carácter de fin de archivo (EOF o End Of File) pasado mediante las teclas [Ctrl]+[d] antes de terminar: [nicolas]$ IGNOREEOF=3 pulsar Ctrl + d [nicolas]$ Use "exit" to leave the shell. pulsar Ctrl + d [nicolas]$ Use "exit" to leave the shell. pulsar Ctrl + d [nicolas]$ Use "exit" to leave the shell. pulsar Ctrl + d [nicolas]$ exit

$OLDPWD Directorio donde estaba antes el usuario. Esta variable la usa el comando cd -: [nicolas]$ pwd /home/nicolas [nicolas]$ cd /var [nicolas]$ pwd /var [nicolas]$ cd [nicolas]$ pwd /home/nicolas [nicolas]$ echo $OLDPWD /var [nicolas]$ OLDPWD=/tmp [nicolas]$ cd /tmp [nicolas]$ pwd /tmp

$PATH Lista de directorios separados por el carácter : (dos puntos) con los ejecutables del sistema (binarios, scripts shell). Cuando se da un comando, el shell busca automáticamente los ejecutables en los directorios listados en esta variable, por orden de lista. [nicolas]$ echo $PATH /usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/games:/home/ nicolas/bin

Para agregar un directorio a esta lista, se usa la sintaxis siguiente: PATH=$PATH:/nuevo_directorio

$PS1 Éste es el símbolo del sistema principal, visto desde la línea de comandos: [nicolas]$ echo $PS1 [\u]$ [nicolas]$ PS1=’[\u@\h \W]$ ’ [nicolas@mandrake tmp]$

El prompt del shell Bash puede estar compuesto por secuencias de caracteres que representan diversas informaciones; el uso de apóstrofes es necesario para asignar esta variable. Las principales secuencias de caracteres son: \a \d \h \H \t

Emite un bip al mostrar el símbolo del sistema. Muestra la fecha. Muestra el nombre del equipo. Muestra el nombre completo del equipo (con el nombre de dominio). Muestra la hora actual.

\u Muestra el nombre del usuario conectado. \w Muestra la ruta del directorio actual. \W Muestra el nombre del directorio actual. $PS2 Esta variable representa el símbolo del sistema secundario que se muestra cuando el shell espera el resto de la entrada de un comando: [nicolas]$ echo $PS2 > [nicolas]$ echo "no > vale" no vale

$PWD Directorio actual donde se encuentra el usuario. Su valor equivale al resultado del comando pwd: [nicolas]$ echo $PWD /home/nicolas [nicolas]$ pwd /home/nicolas

$TMOUT Si esta variable de entorno se inicia con un valor numérico distinto de cero, el shell se desconecta automáticamente al cabo del número de segundos indicado aquí, en caso de inactividad por parte del usuario.

Al igual que un protector de pantalla con contraseña, esto evita que un usuario deje su sesión abierta inadvertidamente.

Caracteres genéricos Los caracteres genéricos son caracteres especiales dedicados a la escritura de motivos en los nombres de archivo. Permiten efectuar una búsqueda según un motivo por los nombres de archivo presentes en el directorio actual. Los ejemplos de este apartado se basan en un directorio con los archivos siguientes: [nicolas]$ ls -a . banco azul .. blanco ejemplos

arch1 arch2

arch2.4 arch2.7

.os redonda

rosado rojo

El asterisco: * Cuando el Bash encuentra este carácter en la línea de comandos, lo sustituye por una cadena de caracteres (que puede ser de longitud nula) para enumerar todos los nombres de archivo que corresponden al motivo en el directorio actual. Así, el motivo r*o se reemplaza por todos los nombres de archivo que empiezan por el carácter r y terminan con el carácter o: [nicolas]$ ls r*o rosado rojo

El signo * reemplaza cualquier carácter en el motivo, excepto el . (punto) en primera posición en el nombre de archivo; por ejemplo, el motivo *s corresponde al archivo ejemplos, pero no al archivo .os: [nicolas]$ ls *s ejemplos

La exclusión del primer punto por el carácter genérico * evita la supresión de archivos ocultos con el comando rm *; el objetivo de los nombres de archivo que empiezan por un punto es precisamente ocultar los archivos de los que uno no se quiere preocupar (pero sin suprimirlos). Un motivo puede estar compuesto por varios caracteres genéricos; repitiendo el asterisco, se obtiene, por ejemplo, *e* que concuerda con todos los archivos con al menos una e en su nombre: [nicolas]$ ls *e* ejemplos redonda

Finalmente, si el shell no encuentra correspondencias con el motivo entre los nombres de archivo presentes en el directorio actual, dicho motivo se transmite tal cual al comando: [nicolas]$ ls *zork ls: *zork: No such file or directory

En este último ejemplo, ningún nombre de archivo se corresponde con el motivo *zork; el comando ls recibe el motivo como argumento y lo devuelve en su mensaje de error.

Esta observación es válida también para los caracteres genéricos siguientes. El signo de interrogación: ? Como el signo *, el shell sustituye el carácter genérico ? por cualquier carácter, excepto el punto, al principio de un nombre de archivo. A diferencia del asterisco, el signo de

interrogación se reemplaza por un carácter (y sólo uno), y no por una cadena de cualquier longitud. Así, el motivo ro?o corresponde a todos los nombres de archivo de exactamente cuatro caracteres que empiezan por ro y terminan por o: [nicolas]$ ls ro?o rojo

De nuevo, este carácter genérico puede combinarse con otros en el mismo motivo: Nombre de archivo de tres letras con una a en segunda posición. Nombre de archivo que presenta una a en penúltima posición. Nombre de archivo que presenta una a en tercera posición y una b en ??a*b? penúltima posición. ?a? *a?

Los corchetes: [ ] La sintaxis [lista_de_caracteres] en un motivo representa un carácter (y sólo uno) entre los propuestos en la lista. Por ejemplo, [abc] se reemplaza por una a, una b o una c.

Todo carácter situado entre los corchetes forma parte de la lista de posibles caracteres; no hay, pues, espacios entre los corchetes, a menos que el espacio sea un carácter posible de la lista. Para listar todos los archivos cuyo nombre contiene una o o una l en segunda posición, se usa el motivo ?[ol]*: [nicolas]$ ls ?[ol]* rosado rojo blanco

Es posible simplificar listas de caracteres consecutivos (según el orden de la tabla ASCII) separando el primero y el último carácter de la lista con un - (guión). La sintaxis [b-e] equivale a [bcde]: [nicolas]$ ls [b-e]* banco blanco ejemplos

Para especificar el carácter - como elemento de la lista, se inserta al principio o al fin de la lista: [ab-] corresponde a a, a b o a -. Al ser las minúsculas y las mayúsculas distintas en Linux, para representar todas las letras posibles del alfabeto en un nombre de archivo, se usa la sintaxis [a-zA-Z]. Si el primer carácter de la lista es un signo de exclamación ! o un acento circunflejo ˆ, la correspondencia se hace con cualquier carácter que no esté en la lista; para listar todos los archivos cuyo nombre no empiece por a, ni par un r:

[nicolas]$ ls [!ar]* banco blanco ejemplos [nicolas]$ ls [ˆar]* banco blanco ejemplos

Para especificar el carácter ! o ˆ como elemento de la lista, se inserta en cualquier lugar de la lista salvo al principio: [a!b] corresponde a a, a ! o a b. Finalmente, existen ciertas clases de caracteres predefinidas. Sus nombres son bastante explícitos: [:alpha:], [:digit:], ... por ejemplo, [[:alnum:]] corresponde a [0-9A-Za-z], con la diferencia de que el último caso depende de la codificación ASCII, mientras que el primero incluye todas las letras del idioma configurado en el sistema. Por ejemplo, los caracteres acentuados forman parte de la clase [:alnum:] en español, pero no en lenguaje internacional C ANSI: [nicolas]$ ls espacio satélite [nicolas]$ echo $LANG sp_SP [nicolas]$ ls [[:alnum:]]* espacio satélite [nicolas]$ LANG=C [nicolas]$ ls [[:alnum:]]* espacio

Los corchetes en los nombres de clases forman parte integral del nombre simbólico; deben añadirse, pues, a los corchetes que enmarcan la lista. Las principales clases son: [:alnum:] Corresponde a los caracteres alfabéticos y numéricos. Equivale a [A-Za-z0-9]. [:alpha:] Corresponde a los caracteres alfabéticos. Equivale a [A-Za-z]. [:digit:] Corresponde a las cifras (decimales). Equivale a [0-9]. [:graph:] (caracteres gráficos visibles). Corresponde a los caracteres comprendidos entre ASCII 33 y ASCII 126. Es idéntico a [:print:], presentado anteriormente, pero excluye el carácter espacio. [:lower:]

Corresponde a los caracteres alfabéticos en minúscula. Equivale a [a-z]. [:print:] (caracteres imprimibles). Corresponde a los caracteres comprendidos entre ASCII 32 y ASCII 126. Equivale a [:graph:], presentado anteriormente, pero se añade el carácter espacio. [:space:] Corresponde a cualquier espacio en blanco (espacio y tabulación horizontal). [:upper:] Corresponde a cualquier carácter alfabético en mayúsculas. Equivale a [A-Z]. [:xdigit:] Corresponde a las cifras hexadecimales. Equivale a [0-9A-Fa-f]. Para todos los nombres de archivo cuyo último carácter es una cifra, se obtiene: [nicolas]$ ls *[[:digit:]] arch1 arch2 arch2.4 arch2.7

Las llaves: {} A la manera de los corchetes que ya hemos visto para la creación de listas de caracteres, las llaves permiten especificar listas de motivos separadas por una coma en un motivo de reemplazo. La sintaxis {abc,def} se reemplaza por la cadena abc o la cadena def. Por ejemplo, {az,ro}* corresponde a todos los nombres de archivo que empiezan por la cadena az o la cadena ro: [nicolas]$ ls {az,ro}* azul rosado rojo

Las cadenas de caracteres presentes entre llaves pueden ser, a su vez, motivos compuestos de caracteres genéricos: [nicolas]$ ls {*ro[sj]*,?a*} banco rosado rojo

Operadores de correspondencia extendida Si la opción extglob del shell se ha activado con el comando shopt, se reconocen varios operadores de correspondencia extendida. En la descripción siguiente, una "lista_motivo" es una lista de uno o más motivos separados por |. Los motivos compuestos se indican entre paréntesis y van precedidos por un operador que define el número de instancias:

?(lista_motivo) Corresponde a cero o una instancia de los motivos indicados. *(lista_motivo) Corresponde a cero o más instancias de los motivos indicados. +(lista_motivo) Corresponde a una o más instancias de los motivos indicados. @(lista_motivo) Corresponde a exactamente una instancia de los motivos indicados. !(lista_motivo) Corresponde a todo salvo a los motivos indicados. Por ejemplo, +([[:digit:]])* corresponde a todos los archivos cuyo nombre empieza por al menos una cifra.

Caracteres de cita Los caracteres de cita se utilizan para modificar la interpretación del shell de otros caracteres. Así, un carácter especial puede interpretarse literalmente, y no de forma simbólica. Esto permite que ciertos programas y utilidades reinterpreten o extiendan los caracteres especiales pasados en la línea de comandos sin que los interprete el propio shell.

Los comandos grep y find,descritos más adelante, usan en particular caracteres de cita. Los apóstrofes: ’ El shell ignora todos los caracteres especiales escritos entre apóstrofes. Por ejemplo: [nicolas]$ echo variable $HOME y asterisco * variable /home/nicolas y asterisco banco blanco azul ejemplos arch1 arch2 arch2.4 arch2.7 redonda rosado rojo [nicolas]$ echo ’variable $HOME y asterisco *’ variable $HOME y asterisco *

Las comillas: "

Como ocurre con los apóstrofes, todos los caracteres especiales entre comillas se ignoran, exceptuando $, ` (acento abierto) y \: [nicolas]$ echo "variable $HOME y asterisco *" variable /home/nicolas y asterisco *

La barra invertida: \ Todo carácter que sigue a la barra invertida pierde su significado especial: [nicolas]$ echo \variable \$HOME y asterisco \* variable $HOME y asterisco *

La barra invertida no produce ningún efecto si el carácter siguiente no es un carácter especial. El uso de los caracteres de cita permite trabajar con archivos que tienen nombres poco convencionales. Una vez creados, hay que usarlos con mucha prudencia, especialmente a la hora de borrar; así: [nicolas]$ ls banco blanco azul ejemplos arch1 arch2 arch2.4 arch2.7 rosado rojo [nicolas]$ touch \* "dos palabras" [nicolas]$ ls * blanco dos palabras arch1 arch2.4 redonda rojo banco azul ejemplos arch2 arch2.7 rosado [nicolas]$ ls * * blanco dos palabras arch1 arch2.4 redonda rojo banco azul ejemplos arch2 arch2.7 rosado [nicolas]$ ls ’*’ [nicolas]$ ls dos palabras ls: dos: No such file or directory ls: palabras: No such file or directory [nicolas]$ ls ’dos palabras’ dos palabras [nicolas]$ ls dos\ palabras dos palabras [nicolas]$ rm * [nicolas]$ ls [nicolas]$

redonda

Finalmente, estos caracteres de cita inhiben el significado de la tecla [Intro] que caracteriza el fin del comando; por ello se obtiene la presentación del prompt secundario $PS2 cuando falta una comilla o un apóstrofe de cierre, o bien cuando se coloca una barra invertida al final de la línea: [nicolas]$ echo "va > le" va le [nicolas]$ ec\ > ho v\ > al\ > e vale

edirecciones 1. Descriptores de archivos Cualquier proceso ejecutado en Linux se asocia a tres descriptores de archivos que permiten administrar las entradas, las salidas y los errores estándar.

Se llama descriptor de archivo a un puntero hacia un archivo. Un programa que accede a un archivo para leer o escribir en él datos, primero tiene que asociar (mediante una llamada al sistema) un descriptor de archivo al archivo; a continuación, usa el descriptor como punto de entrada (lectura) o de salida (escritura) para los datos que debe tratar. Se llama "entradas" a los parámetros tratados por el proceso, y "salidas", a los resultados obtenidos. Los "errores" corresponden a un resultado proveniente de un error de tratamiento por parte del proceso. Los tres descriptores de archivo correspondientes también se identifican por un número: 0 para la entrada, 1 para la salida y 2 para el error:

Por ejemplo, si se considera la operación "8 dividido por 2", un proceso que efectúe este cálculo presentará en entrada la operación que se debe realizar, "8/2", y en salida el resultado, "4":

Si ahora se da la operación "5/0" al mismo proceso, devolverá en error un mensaje que indica que no se permite una división por cero:

Los dispositivos en Linux se representan por archivos en el directorio /dev, y los tres descriptores de archivo asociados de modo predeterminado a un proceso son:   

el teclado como entrada estándar para que el usuario pueda escribir los datos y parámetros que se deben tratar; el terminal en salida estándar para mostrar los resultados del comando; el terminal como error estándar para que el usuario sea informado de que se ha producido un error de tratamiento.

Estos descriptores pueden redefinirse; se llama a esta operación "redirección".

2. Redirección de la entrada estándar

Para redirigir la entrada estándar de un proceso de modo que no trate los datos desde el teclado, sino desde el contenido de un archivo, se usa el carácter < seguido del nombre del nuevo archivo al que debe apuntar el descriptor de archivo de entrada.

La entrada de un comando finaliza cuando todos los datos del archivo correspondiente se han leído; cuando la entrada es el teclado (predeterminado, sin redirección), se puede notificar el fin de la entrada enviando el carácter no imprimible EOF (End Of File). Hay que pulsar la combinación de teclas [Ctrl]+[d] en una línea vacía para transmitir este carácter al proceso con el fin de que pueda terminar su tratamiento. Para el ejemplo siguiente, el comando wc -que se ha estudiado en un capítulo anteriordebe redefinirse primero más precisamente:  

Seguido de uno o más argumentos, el comando wc devuelve en su salida el número de líneas, palabras y caracteres contenidos en cada archivo. Sin argumentos, el comando wc muestra en la salida el número de líneas, palabras y caracteres recibidos en la entrada.

Este comando puede emplearse, pues, de diversas maneras: [nicolas]$ wc esta frase se escribe desde el teclado y el comando sólo finalizará cuando reciba el carácter de fin de archivo (EOF) mediante la combinación de teclas Ctrl + d pulsar Ctrl + d 4 29 162 [nicolas]$ wc /etc/passwd 30 43 1340 /etc/passwd [nicolas]$ wc < /etc/passwd 30 43 1340

Los espacios alrededor del signo de redirección en la línea de comandos no son obligatorios, pero mejoran la legibilidad. Esto vale también para las redirecciones de la salida y error. Una redirección no se considera como un argumento del comando; el shell es quien efectúa las redirecciones de los descriptores de archivo previamente al interpretar la línea de comandos. En el ejemplo anterior, el nombre del archivo no se muestra en la redirección porque el comando wc no conoce el archivo /etc/passwd; desde el punto de vista del comando, la primera y la tercera llamada al comando son equivalentes: los datos que se deben tratar se encuentran en la entrada del proceso.

3. Redirección de la salida estándar La redirección de la salida estándar permite escribir el resultado de un comando en un archivo en lugar de mostrarlo en la pantalla. Para ello, hay que colocar al final de la línea de comandos el carácter > seguido del nombre de archivo en el que se escribirá el resultado del comando:

[nicolas]$ echo vale vale [nicolas]$ echo vale > archtest [nicolas]$ cat archtest vale

El archivo de redirección se crea si no existe. Si existe, su contenido lo borra la redirección. Para añadir la salida de un comando a un archivo sin borrar su contenido, se duplica el carácter > en la redirección: [nicolas]$ [nicolas]$ [nicolas]$ lun jun 28 [nicolas]$ [nicolas]$ [nicolas]$ francisco nicolas lun jun 28

who > archout date > archout cat archout 22:05:49 CEST 2004 who > archout date >> archout cat archout vc/1 Jun 28 22:05 pts/0 Jun 28 22:04 (192.168.200.1) 22:05:58 CEST 2004

Si el signo de redirección se duplica y el archivo especificado de salida no existe, éste se crea como en una redirección simple.

4. Redirección del error estándar La redirección del error estándar se basa en el mismo principio que los dos anteriores; en este caso, se usa 2> para introducir el archivo de destino de los mensajes de error. A menudo es mejor suprimir la presentación de los mensajes de error conocidos. Por ejemplo, para listar los archivos presentes en el sistema, hemos visto que el comando ls -R / recorre todo el árbol. Sin embargo, aparecen mensajes de error porque el usuario normal no tiene acceso a ciertos directorios; entonces se redirige la salida de errores al archivo especial /dev/null en el que todos los datos escritos se destruyen automáticamente: [nicolas]$ ls -R / 2>/dev/null

Como en la redirección de salida, hay que recordar que debe duplicarse el signo > para agregar los datos enviados por el comando al final del archivo sin borrar su contenido: [nicolas]$ ls glurp 2> archerr [nicolas]$ vale 2> archerr [nicolas]$ cat archerr -bash: vale: command not found [nicolas]$ ls glurp 2> archerr [nicolas]$ vale 2>> archerr [nicolas]$ cat archerr ls: glurp: No such file or directory -bash: vale: command not found

5. Redirecciones combinadas

Se puede redirigir la entrada, la salida y el error simultáneamente: comando < archin > archout 2> archerr [nicolas]$ ls blanco azul amarillo marrón out rojo verde violeta [nicolas]$ ls azul verde naranja rojo > archout 2> archerr [nicolas]$ cat archout azul rojo verde [nicolas]$ cat archerr ls: naranja: No such file or directory

La salida del comando ls es ligeramente distinta cuando está redirigida: los nombres listados están presentes en líneas distintas. Esta modificación se justifica por la simplificación del tratamiento de este tipo de datos: una línea equivale a un archivo listado. Por el contrario, dos descriptores de archivo diferentes no pueden apuntar simultáneamente a un solo archivo, ni siquiera para redirigir todas las salidas estándar (salida + error); esto es debido al uso de memorias intermedias de escritura en la gestión de archivos por parte del núcleo de Linux. El resultado puede ser inesperado, como en este ejemplo en el que el mensaje de error ha sido destruido parcialmente por la lista de archivos: [nicolas]$ ls azul verde naranja rojo ls: naranja: No such file or directory azul rojo verde [nicolas]$ ls azul verde naranja rojo > archout 2> archout [nicolas]$ cat archout azul rojo verde No such file or directory

La solución consiste en redirigir uno de los descriptores de archivo a otro previamente redirigido a un archivo. La sintaxis utilizada es n>&m donde n es el número del descriptor para redirigir y m el número de aquel al que hay que enviar los datos: [nicolas]$ ls azul verde naranja rojo > archout 2>&1 [nicolas]$ cat archout ls: naranja: No such file or directory azul rojo verde

O bien, de forma equivalente: [nicolas]$ ls azul verde naranja rojo 2> archout 1>&2 [nicolas]$ cat archout ls: naranja: No such file or directory azul rojo verde

Sin embargo, el shell interpreta las redirecciones en la línea de comandos de izquierda a derecha. Su orden de escritura es, pues, importante, como se puede constatar en el ejemplo siguiente: el error se ha redirigido a la salida, la cual aún no había sido redirigida al archivo ficout: [nicolas]$ ls azul verde naranja rojo 2>&1 > archout ls: naranja: No such file or directory [nicolas]$ cat archout azul rojo verde

6. Ejemplos de redirecciones Como en el comando wc, es necesario redefinir el comando cat de forma más precisa para comprender los ejemplos siguientes:  

Seguido de uno o más argumentos, el comando cat devuelve en la salida el contenido de cada archivo. Sin argumentos, el comando cat muestra en la salida los datos recibidos en su entrada.

La mayoría de los comandos de tratamiento de archivos funcionan con el mismo principio: si un archivo se pasa como argumento, el tratamiento se efectúa sobre su contenido; si no, se trata la entrada del proceso. Sin argumentos ni redirección, cat repite las líneas entradas por teclado: [nicolas]$ cat las líneas se muestran dos veces las líneas se muestran dos veces porque la entrada por teclado se muestra en el terminal porque la entrada por teclado se muestra en el terminal al igual que la salida del comando al igual que la salida del comando pulsar Ctrl + d

Sin argumentos y con la salida redirigida, cat permite crear pequeños archivos de texto rápidamente: [nicolas]$ cat > arch1 esta forma de crear un archivo de texto con algunas líneas se llama también "el editor del experto" porque no es posible modificar una línea una vez validada. pulsar Ctrl + d

Sin redirección con un nombre de archivo como argumento, o sin argumentos y con una redirección de entrada, cat muestra el contenido de un archivo: [nicolas]$ cat arch1 esta forma de crear un archivo de texto con algunas líneas se llama también "el editor del experto" porque no es

posible modificar una línea una vez validada. [nicolas]$ cat < arch1 esta forma de crear un archivo de texto con algunas líneas se llama también "el editor del experto" porque no es posible modificar una línea una vez validada.

Sin argumentos y con redirecciones de entrada y salida, cat permite realizar una copia de un archivo: [nicolas]$ cat < arch1 > arch2 [nicolas]$ cat arch2 esta forma de crear un archivo de texto con algunas líneas se llama también "el editor del experto" porque no es posible modificar una línea una vez validada.

Con varios argumentos y una redirección de salida, cat concatena los archivos de los argumentos en el archivo de la redirección: [nicolas]$ cat > arch3 aaaaaaaaaaaaa pulsar Ctrl + d [nicolas]$ cat > arch4 bbbbbbbbbbbbb pulsar Ctrl + d [nicolas]$ cat arch3 arch4 > arch5 [nicolas]$ cat arch5 aaaaaaaaaaaaa bbbbbbbbbbbbb

Todos estos ejemplos demuestran que, a partir del simple comando cat -que muestra en su salida el contenido de archivos pasados como argumentos o su entrada a falta de argumentos- y el uso de las redirecciones del shell, es posible implementar:     

el eco de la salida del teclado en el terminal; la visualización de archivos; el editor básico de archivos de texto; la copia de archivos; la concatenación de archivos.

Los demás comandos de Linux pueden emplearse basándose en el mismo principio.

7. Los tubos Mediante las redirecciones y comandos ya estudiados, ahora resulta fácil, por ejemplo, contar el número de archivos presentes en el directorio siguiente: [nicolas]$ ls blanco azul amarillo

marrón

rojo

verde

violeta

El comando ls puede mostrar la lista de archivos presentes en el directorio en su salida, mientras que el comando wc -l puede contar el número de líneas pasadas en su entrada. [nicolas]$ ls > /tmp/lista [nicolas]$ wc -l < /tmp/lista

7 [nicolas]$ rm /tmp/lista rm: borrar archivo regular `/tmp/lista’? y

Respecto a los descriptores de archivo, los comandos ls y wc se usan así:

La idea aquí es utilizar el archivo temporal /tmp/lista que se borra una vez obtenido el resultado. Esto se puede hacer mediante los "tubos" ("pipes" en inglés), que permiten enviar los datos de la salida estándar de un proceso a la entrada estándar de un segundo proceso. La sintaxis utilizada para materializar un tubo es la barra vertical | obtenida mediante la combinación de teclas [AltGr]+[1] en un teclado español: [nicolas]$ ls | wc -l 7

El resultado se obtiene, en esta ocasión, con una sola línea de comandos y un tubo:

Se pueden encadenar varios tubos en la misma línea de comandos, pero sólo el último comando del "pipeline" muestra un resultado en su salida estándar. El comando tee permite consultar y guardar el resultado de un comando intermedio sin romper la sucesión de tubos. Duplica los datos que recibe en la entrada, por una parte en su salida estándar y por otra, en el archivo pasado como argumento. Por ejemplo: [nicolas]$ ls | tee /tmp/lista | wc -l 7 [nicolas]$ cat /tmp/lista blanco azul amarillo marrón rojo verde violeta

Esquemáticamente, a nivel de las entradas/salidas:

lias El conjunto de redirecciones vistas en este capítulo muestra la lógica de Unix en la disponibilidad de herramientas atómicas (dedicadas a una sola función). Éstas pueden

asociarse para formar comandos más complejos y adaptados a las necesidades del usuario. Sin embargo, ciertas líneas de comandos pueden alargarse rápidamente y un uso frecuente de esta sintaxis pronto puede resultar desagradable. Pero es posible simplificar el trabajo del usuario definiendo alias de comandos. Un alias está compuesto por un nombre (generalmente simple) que será reemplazado por un comando (generalmente complejo o largo). La lista de alias existentes puede conseguirse ejecutando el comando alias sin argumentos: [nicolas]$ alias alias cd..=’cd ..’ alias cp=’cp -i’ alias d=’ls’ alias df=’df -h -x supermount’ alias du=’du -h’ alias kde=’xinit /usr/bin/startkde’ alias l=’ls’ alias la=’ls -a’ alias ll=’ls -l’ alias ls=’ls -F --color=auto’ alias lsd=’ls -d */’ alias mc=’. /usr/share/mc/bin/mc-wrapper.sh’ alias md=’mkdir’ alias mv=’mv -i’ alias p=’cd -’ alias rd=’rmdir’ alias rm=’rm -i’ alias s=’cd ..’

Se llama a un alias como a cualquier otro comando: [nicolas]$ pwd /home/nicolas [nicolas]$ s [nicolas]$ pwd /home

La sintaxis de definición de un nuevo alias es: alias nombre=’comando’. El comando unalias permite suprimir un alias: unalias nombre. Por ejemplo: [nicolas]$ alias lw -bash: alias: lw: not found [nicolas]$ alias lw=’ls | wc -l’ [nicolas]$ alias lw alias lw=’ls | wc -l’ [nicolas]$ lw 8 [nicolas]$ unalias lw [nicolas]$ lw

-bash: lw: command not found

Si un alias tiene el mismo nombre que un comando, se interpreta el alias. Para forzar la ejecución de un comando y no de un posible alias, hay que escribir antes de su nombre el carácter \ o utilizar el comando command: [nicolas]$ alias pwd -bash: alias: pwd: not found [nicolas]$ pwd /home/nicolas [nicolas]$ alias pwd=’echo directorio actual: $PWD’ [nicolas]$ pwd directorio actual: /home/nicolas [nicolas]$ \pwd /home/nicolas [nicolas]$ command pwd /home/nicolas

Se puede suprimir todos los alias con la opción -a del comando unalias: [nicolas]$ unalias -a [nicolas]$ alias

Condiciones generales de uso Copyright - ©Editions ENI

Ejecución de comandos Los comandos escritos por el usuario pueden ser de diferentes naturalezas:   

alias; comando interno; comando externo.

Comandos internos del shell Se califican como internos los comandos integrados en el shell. Su ejecución no genera subprocesos. Los comandos internos se componen esencialmente de herramientas que permiten modificar el entorno del shell: cambio del directorio actual (cd), definición de variables (set, unset, etc.) y de alias (alias, unalias), estructuras de control (if, for, while, etc.), etc. La lista exhaustiva de comandos internos incluidos en el shell Bash es: :, ., alias, bg, bind, break, builtin, case, cd, command, continue, declare, dirs, disown, echo, enable, eval, exec, exit, export, fc, fg, for, getopts, hash, help, history, if, jobs, kill, let, local, logout, popd, pushd, pwd, read, readonly, return, set, shift, shopt, source, suspend, test, times, trap, type, typeset, ulimit, umask, unalias, unset, until, wait, while.

La página del manual de Bash (man bash) detalla los comandos internos que no se estudian en esta obra. Comandos externos Los comandos externos agrupan todos los archivos ejecutables presentes en el sistema de archivos. Su ejecución genera un proceso hijo del shell que ha interpretado el comando. El archivo binario o el script asociado a un comando debe estar presente en uno de los directorios listados por la variable de entorno $PATH. Si es preciso, el usuario deberá escribir la ruta (absoluta o relativa) del archivo para ejecutar el comando. Si un comando externo tiene el mismo nombre que un comando interno del shell, se interpretará este último. La redundancia de ciertos comandos internos y externos permite que el usuario llame a las mismas herramientas desde un shell distinto de Bash si éste no posee dichas funcionalidades. Encontramos por ejemplo /bin/echo y /bin/pwd como comandos externos.

1. type, whereis El comando type permite determinar la naturaleza de los comandos pasados como argumentos: [nicolas]$ type echo ls cat echo is a shell builtin ls is aliased to `ls -F --color=auto’ cat is /bin/cat

Cuando un mismo nombre se atribuye a un alias, un comando interno y un comando externo, type indica la interpretación que se hará del comando: [nicolas]$ alias pwd=’echo directorio actual: $PWD´ [nicolas]$ ls /bin/pwd /bin/pwd [nicolas]$ pwd directorio actual: /home/nicolas [nicolas]$ type pwd pwd is aliased to `echo directorio actual: $PWD´ [nicolas]$ unalias pwd [nicolas]$ type pwd pwd is a shell builtin [nicolas]$ pwd /home/nicolas

En la misma línea, el comando whereis permite localizar rápidamente un comando externo y los archivos de ayuda y de fuentes asociados si están presentes en el sistema: [nicolas]$ whereis echo ls cat echo: /bin/echo /usr/share/man/man1/echo.1.bz2 /usr/share/man/man3/

echo.3x.bz2 ls: /bin/ls /usr/share/man/man1/ls.1.bz2 cat: /bin/cat /usr/share/man/man1/cat.1.bz2

El comando whereis no indica, en ningún caso, si existe un alias o un comando interno con el mismo nombre.

ustitución de comandos La sustitución de comandos consiste en recuperar la salida de un comando en la línea de comandos. Las salidas de comandos pueden utilizarse para la asignación de una variable o como argumento de otro comando. El shell efectúa las sustituciones de comandos antes de interpretar la línea de comandos en su totalidad. La sintaxis clásica de una sustitución de comandos utiliza el apóstrofe invertido (o acento abierto, o "back quote") obtenido con la tecla [`]+[espacio] en un teclado español: [nicolas]$ whoami nicolas [nicolas]$ echo "mi login es `whoami`" mi login es nicolas [nicolas]$ milogin=`whoami` [nicolas]$ echo "mi login es $milogin" mi login es nicolas

La ventaja de asignar la salida de un comando a una variable radica en poder reutilizar varias veces el resultado evaluando una sola vez el comando. La segunda sintaxis admitida para la sustitución de comandos es $(). La ventaja de esta sintaxis reside en poder anidar las sustituciones de comandos: [nicolas]$ echo "contenido de mi directorio: $(ls /home/$(whoami))" contenido de mi directorio: blanco azul amarillo marrón rojo verde violeta

Opciones del shell Bash El comportamiento del shell Bash puede modificarse con la activación de opciones. La sintaxis general, para activar una opción, es: set -o opción. Para desactivar una opción, utilice set +o opción.

Aunque parezca poco lógico -porque el signo menos es el carácter previsto inicialmente para introducir las opciones de comandos en Unix- aquí se usa el + para la desactivación. El estado de las distintas opciones del shell puede visualizarse mediante el comando set -o solo: [nicolas]$ set -o allexport off braceexpand on emacs on errexit off hashall on histexpand on history on ignoreeof off interactive-comments keyword off monitor on noclobber off noexec off noglob off nolog off notify off nounset off onecmd off physical off posix off privileged off verbose off vi off xtrace off

on

Se describe a continuación el significado de las opciones interesantes en el marco de esta obra. allexport El shell exporta automáticamente toda variable creada o modificada sin emplear el comando export. Esta opción puede activarse también con el comando set -a. emacs La edición de la línea de comandos sigue el estilo del programa de edición Emacs. ignoreeof Idéntico a la definición de la variable de entorno IGNOREEOF=10. noclobber

Con esta opción, el shell no borra un archivo existente en una redirección simple; para forzarlo, hay que emplear la sintaxis >|: [nicolas]$ touch archtest [nicolas]$ echo texto > archtest [nicolas]$ set -o noclobber [nicolas]$ echo texto > archtest -bash: archtest: cannot overwrite existing file [nicolas]$ echo texto >| archtest

Esta opción puede activarse también con el comando set -C. noglob Desactiva la expansión de caracteres genéricos: [nicolas]$ echo * blanco azul amarillo marrón rojo verde violeta [nicolas]$ set -o noglob [nicolas]$ echo * *

Esta opción puede activarse también con el comando set -f. nounset El shell considera las variables inexistentes como errores en la expansión de los parámetros. Si se intenta desarrollar una variable inexistente, el shell muestra un mensaje de error: [nicolas]$ echo $vale [nicolas]$ set -o nounset [nicolas]$ echo $vale -bash: vale: unbound variable

Esta opción puede activarse también con el comando set -u. verbose Muestra las líneas de comandos a medida que se leen; muy útil para la depuración de scripts del shell: [nicolas]$ echo $PWD /home/nicolas [nicolas]$ set -o verbose [nicolas]$ echo $PWD echo $PWD /home/nicolas

Esta opción puede activarse también con el comando set -v. vi

La edición de la línea de comandos sigue el estilo del programa de edición Vi. xtrace Tras la expansión de cada comando simple, el shell muestra el valor de la variable de entorno PS4 seguida por el comando y sus argumentos desarrollados; como la opción verbose, xtrace resulta muy útil para la depuración de scripts del shell: [nicolas]$ echo $PWD /home/nicolas [nicolas]$ set -o xtrace [nicolas]$ echo $PWD + echo /home/nicolas /home/nicolas [nicolas]$ PS4=’DEPURACION >>> ’ + PS4= DEPURACION >>> [nicolas]$ echo $PWD DEPURACION >>> echo /home/nicolas /home/nicolas

Esta opción puede activarse también con el comando set -x.

Introducción Este capítulo explica cómo automatizar la ejecución de trabajos a partir de los elementos estudiados anteriormente. Las funcionalidades abordadas permitirán al usuario crear sus propios scripts de shell, programas desarrollados en lenguaje shell. Además, el lector podrá comprender y personalizar los muchos scripts ya proporcionados con el sistema Linux

Scripts Shell Un script Bash es un archivo de texto que contiene una serie de comandos como los ejecutados en la línea de comandos. Toda línea de comandos válida puede ser objeto de un script de shell para un tratamiento por lotes ("batch"). Y viceversa, todo el código escrito en un script Bash puede escribirse directamente en la línea de comandos. En este ejemplo, el archivo de script se llama prog.sh: [nicolas]$ cat prog.sh date whoami var=12 echo $var

1. Llamada y ejecución

Las modificaciones del entorno del shell que llama dependen de la forma como se llama al script shell. bash prog.sh La primera forma de llamar a un script shell consiste en lanzar un nuevo bash con el nombre del script como argumento. Este nuevo shell trata las instrucciones contenidas en el archivo como si se hubieran escrito en el teclado. De ello resulta la creación de un subproceso bash que termina automáticamente al finalizar la ejecución del script. [nicolas]$ cat prog.sh date whoami var=12 echo $var [nicolas]$ echo $var [nicolas]$ bash prog.sh mi jun 30 06:40:40 CEST 2008 nicolas 12 [nicolas]$ echo $var

Toda modificación del entorno -como el cambio de directorio o la definición de variable- sólo interviene en el subshell creado temporalmente. No se modifica el shell inicial. Se puede representar este tipo de script así:

El primer shell iniciado en un terminal (llamado shell de conexión) lleva como prefijo un guión en la lista de procesos. Por esta razón, su nombre es -bash en el esquema anterior, mientras que el subshell se llama bash. El shell bash es un subproceso del shell de conexión -bash. Asimismo, los comandos externos date y whoami son subprocesos del shell bash mientras que la asignación de la variable var y su visualización son comandos internos del shell y no generan subprocesos. Al final, el entorno del shell -bash no se ha modificado y la variable var no está definida. bash prog.sh Esta forma de iniciar un script del shell utiliza implícitamente un subshell para ejecutar las instrucciones contenidas en el archivo. El resultado de la ejecución es el mismo que en la sintaxis anterior:

Por el contrario, si el nombre del script se trata como un comando en la línea de comandos, es preciso:  

que estén otorgados los permisos de ejecución para el archivo (chmod u+x prog.sh por ejemplo); que el archivo se encuentre en un directorio listado por la variable de entorno $PATH o que su ruta se precise en la línea de comandos (con ./ por ejemplo, si se encuentra en el directorio actual).

El shell llamado implícitamente para ejecutar el script es el shell predeterminado del usuario, esto es, el Bash en Linux. Si el script lo ejecuta otro usuario que no tiene el Bash como shell predeterminado, el script puede generar errores. Para imponer un intérprete y no otro, existe un comentario especial (llamado shebang) que hay que colocar en la primera línea del script #! seguido de la ruta al intérprete utilizado. Se obtiene: [nicolas]$ cat prog.sh #!/bin/bash date whoami var=12 echo $var [nicolas]$ prog.sh -bash: prog.sh: command not found [nicolas]$ ./prog.sh -bash: ./prog.sh: Permission denied [nicolas]$ chmod u+x prog.sh [nicolas]$ ./prog.sh mer jun 30 08:06:33 CEST 2008 nicolas 12 [nicolas]$ echo $var

. prog.sh El comando interno del shell . (punto) indica al bash actual que interprete las instrucciones contenidas en el archivo pasado como argumento.

El comando . (punto) es idéntico al comandointerno del shell source. En este caso, el entorno del shell de conexión se modifica según el código del script que ejecuta: [nicolas]$ cat prog.sh date whoami var=12 echo $var [nicolas]$ echo $var [nicolas]$ . prog.sh mi jun 30 07:47:38 CEST 2008 nicolas

12 [nicolas]$ echo $var 12

Esta llamada puede representarse así:

exec ./prog.sh Cuando el shell encuentra el comando interno exec, ejecuta el código del comando pasado como argumento en su lugar y termina al finalizar la ejecución de éste. En el caso de un script pasado como argumento, el shell Bash actual ejecuta las instrucciones contenidas en el archivo y termina al finalizar el script:

El argumento del comando exec debe ser un comando válido, por lo que es necesario como en la sintaxis ./prog.sh- activar los permisos de ejecución en el script e indicar su ruta.

2. Métodos de trabajo La escritura de scripts de shell, como la de programas en otros lenguajes, debe seguir ciertas reglas para producir un código más transportable y de fácil mantenimiento. Nombre de los scripts Aunque es tentador llamar a los archivos script o test cuando se empieza a escribir un script del shell, no es recomendable reutilizar el nombre de un comando existente porque la llamada a este nuevo programa en la línea de comandos puede presentar problemas. El comando script escribe en un archivo toda la información que aparece en el terminal: nicolas]$ script El script ha empezado, el archivo es typescript [nicolas]$ pwd /home/nicolas [nicolas]$ echo vale vale [nicolas]$ exit exit Script completado, el archivo es typescript [nicolas]$ cat typescript El script ha empezado el vie 02 jul 2008 23:08:24 CEST [nicolas]$ pwd /home/nicolas [nicolas]$ echo vale vale [nicolas]$ exit

exit Script completado el vie 02 jul 2008 23:08:39 CEST

El comando test se estudia más adelante en este capítulo. Puede ser interesante agregar la extensión .sh a los nombres de los scripts del shell. Esto permite reconocer fácilmente el tipo de archivo. Por otra parte, cuando un archivo de este tipo se edita con VIM (Vi IMproved), la aplicación sintáctica de color correspondiente al shell se activa automáticamente. Finalmente, es prudente crear los propios scripts del shell en el subdirectorio bin del directorio personal. Este directorio suele estar presente en la lista de directorios de la variable $PATH, lo que evita que el usuario indique la ruta cuando llama al script que ha escrito: [nicolas]$ echo $PATH /usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/usr/games:/home/nicolas/b in

Uso de varios terminales Los scripts del shell se escriben en un lenguaje interpretado, por lo que resulta fácil probarlos a medida que se escriben. En lugar de editar el script, guardarlo, salir del editor, ejecutar el script y volver a iniciar el editor de texto varias veces seguidas, una permutación entre diferentes terminales aligerará el trabajo del programador.

Linux proporciona, de modo predeterminado, seis terminales virtuales de texto y una consola gráfica en la que se pueden iniciar tantos emuladores de terminal como sea necesario. Comentarios Como en cualquier otro lenguaje de programación, el uso de comentarios es muy recomendable. Todo lo que va tras el carácter # en la línea de comandos es ignorado por el Bash salvo, lógicamente, si va protegido por un carácìer de cita. Es bueno escribir al principio del script una serie de comentarios que indiquen:    

el nombre del autor; la fecha de creación o de modificación, con una descripción de los cambios realizados; la descripción general del script; el uso o la manera de llamar al script con sus opciones y argumentos.

Opciones del shell y depuración Entre las opciones del shell estudiadas al final del capítulo Shell Bash, es interesante agregar, al principio del script del shell, durante la fase de depuración: set -o xtrace set -o nounset

Así, será más fácil rastrear la ejecución del programa y se evitará llamar en el código a variables sin inicializar.

Códigos de retorno Todo comando en Linux devuelve un código al terminar su ejecución. Este código asegura el correcto desarrollo de la ejecución: cero cuando el programa ha terminado correctamente, diferente de cero en caso contrario.

El código de retorno de un comando es un valor comprendido entre 0 y 255. Un mismo comando puede devolver diferentes códigos si su ejecución termina mal, por diversas razones. Por ejemplo, el comando cp puede fallar porque el archivo fuente no existe, los permisos de escritura del directorio de destino son insuficientes, el sistema de archivos está saturado, etc. La variable especial $? contiene el código de retorno del último comando ejecutado: [nicolas]$ pwd /home/nicolas [nicolas]$ echo $? 0 [nicolas]$ ls zorglub ls: zorglub: No such file or directory [nicolas]$ echo $? 1 [nicolas]$ echo $? 0

El último código de retorno es cero porque indica que el comando anterior (echo $?) se ha llevado a cabo bien. Para reutilizar ulteriormente el código de retorno de un programa, hay que guardarlo en una variable: [nicolas]$ ls zorglub ls: zorglub: No such file or directory [nicolas]$ cr=$? [nicolas]$ pwd /home/nicolas [nicolas]$ echo $? 0 [nicolas]$ echo $cr 1

De modo predeterminado, el código de retorno de un script del shell es el del último comando ejecutado antes de finalizar. Para cambiar este valor, se usa el comando exit en el script del shell, con el código de retorno deseado como argumento: [nicolas]$ cat prog.sh #!/bin/bash pwd [nicolas]$ ./prog.sh /home/nicolas [nicolas]$ echo $? 0 [nicolas]$ cat prog2.sh #!/bin/bash pwd exit 2 [nicolas]$ ./prog2.sh /home/nicolas [nicolas]$ echo $? 2

Cuando el Bash encuentra el comando exit, termina el script del shell en cu

Encadenamiento de comandos En lugar de escribir los comandos uno tras otro y esperar el fin de su ejecución antes de ejecutar el siguiente, es posible encadenar varios comandos en la misma línea, separándolos por punto y coma: [nicolas]$ date mi jun 30 14:14:29 CEST [nicolas]$ ps PID TTY TIME 4511 pts/1 00:00:00 4613 pts/1 00:00:00 [nicolas]$ date ; ps mi jun 30 14:14:48 CEST PID TTY TIME 4511 pts/1 00:00:00 4624 pts/1 00:00:00

2004 CMD bash ps 2004 CMD bash ps

Estos encadenamientos son prácticos cuando deben lanzarse sucesivamente varios comandos largos, sin que el usuario tenga que intervenir.

Los espacios alrededor del ; en la línea de comandos no son obligatorios, pero mejoran la legibilidad. En el encadenamiento cmd1 ; cmd2 ; cmd3, el comando cmd2 se ejecuta al terminar el comando cmd1; igualmente, cmd3 se inicia cuando cmd2 ha terminado. Por el contrario, no hay ningún vínculo entre estos tres comandos; es decir, la ejecución de un comando no está condicionada por el resultado (código de retorno) del anterior.

En un script del shell, el punto y coma permite presentar varias instrucciones en una misma línea.

1. Ejecución condicional Para ejecutar el comando cmd2 sólo si el comando cmd1 ha tenido éxito, se separan ambos con &&: [nicolas]$ pwd && ls zorglub /home/nicolas ls: zorglub: No such file or directory [nicolas]$ ls zorglub && pwd ls: zorglub: No such file or directory

En el caso contrario, para ejecutar el comando cmd2 sólo si el comando cmd1 termina anormalmente, se separan ambos con ||: [nicolas]$ pwd || ls zorglub /home/nicolas [nicolas]$ ls zorglub || pwd ls: zorglub: No such file or directory /home/nicolas

La ejecución condicional se basa en el código de retorno de los comandos. Son útiles en fase de pruebas, los comandos true y false terminan respectivamente con un código de retorno de cero y uno: [nicolas]$ ok [nicolas]$ ok [nicolas]$ [nicolas]$ ok [nicolas]$ [nicolas]$ ok [nicolas]$ ok [nicolas]$ [nicolas]$ [nicolas]$ ok

true ; echo "ok" true && echo "ok" true || echo "ok" false ; echo "ok" false && echo "ok" false || echo "ok" true && false || echo "ko" true && false && echo "ok" false || false && echo "ok" false || false || echo "ok"

Variables especiales Ciertas variables son definidas por el shell y pueden ser referenciadas por el usuario en los scripts del shell.

1. $$, $PPID

La variable especial $$ contiene el PID del shell que se está ejecutando, mientras que $PPID (Parent Process ID) da el PID de su proceso padre: [nicolas]$ cat prog.sh #!/bin/bash echo "mi PID: $$" echo "mi PPID: $PPID" [nicolas]$ echo $$ 1223 [nicolas]$ echo $PPID 1222 [nicolas]$ ./prog.sh mi PID: 1380 mi PPID: 1223 [nicolas]$ . ./prog.sh mi PID: 1223 mi PPID: 1222

2. $0 La variable $0 contiene el nombre del script en curso de ejecución tal como ha sido llamado en la línea de comandos: [nicolas]$ cat prog.sh #!/bin/bash echo "mi nombre: $0" [nicolas]$./prog.sh mi nombre: ./prog.sh [nicolas]$ /home/nicolas/prog.sh mi nombre: /home/nicolas/prog.sh

3. $1, $2, $3, ... Las variables $1, $2, $3, etc. representan los parámetros posicionales del shell, es decir, los argumentos pasados al script en la línea de comandos: [nicolas]$ cat prog.sh #!/bin/bash echo "primer parámetro: $1" echo "segundo parámetro: $2" echo "tercer parámetro: $3" [nicolas]$ ./prog.sh a b c primer parámetro: a segundo parámetro: b tercer parámetro: c [nicolas]$ ./prog.sh "a b" c primer parámetro: a b segundo parámetro: c tercer parámetro:

Para referenciar los parámetros posicionales con un índice superior a nueve, hay que usar las llaves con objeto de evitar toda ambigüedad sobre el nombre de la variable: [nicolas]$ cat prog.sh #!/bin/bash echo "decimosegundo parámetro: $12"

echo "decimosegundo parámetro: ${12}" [nicolas]$ ./prog.sh a b c d e f g h i j k l decimosegundo parámetro: a2 decimosegundo parámetro: l

Comando shift El comando shift n permite desplazar los parámetros posicionales n veces. Si no se precisa, se considera igual a 1: $1 toma el valor de $2, $2 toma el valor de $3, y así sucesivamente: [nicolas]$ cat prog.sh #!/bin/bash echo " p1=$1 p2=$2 p3=$3 p4=$4 echo "shift" ; shift echo " p1=$1 p2=$2 p3=$3 p4=$4 echo "shift 2 " ; shift 2 echo " p1=$1 p2=$2 p3=$3 p4=$4 [nicolas]$ ./prog.sh a b c d e f p1=a p2=b p3=c p4=d shift p1=b p2=c p3=d p4=e shift 2 p1=d p2=e p3=f p4=

p5=$5

p6=$6"

p5=$5

p6=$6"

p5=$5

p6=$6"

p5=e

p6=f

p5=f

p6=

p5=

p6=

4. $# El número de parámetros posicionales se encuentra en la variable $#: [nicolas]$ cat prog.sh #!/bin/bash echo "número de parámetros: $#" [nicolas]$ ./prog.sh a b c número de parámetros: 3 [nicolas]$ ./prog.sh "a b" c número de parámetros: 2

5. $*, $@ Estas dos variables contienen el conjunto de parámetros posicionales pasados en la línea de comandos: [nicolas]$ cat prog.sh #!/bin/bash echo "conjunto de parámetros con echo "conjunto de parámetros con [nicolas]$ ./prog.sh a b c conjunto de parámetros con $*: a conjunto de parámetros con $@: a

\$*: $*" \$@: $@" b c b c

La diferencia entre estas dos variables escapa al marco de esta obra.

6. $LINENO

Esta variable es el número de línea del script del shell donde aparece. Sólo tiene sentido dentro del script donde aparece y se usa especialmente en la fase de depuración: [nicolas]$ cat prog.sh #!/bin/bash echo "++++++++++ línea número $LINENO ++++++++++" echo "mi PID: $$" echo "mi PPID: $PPID" echo echo echo echo

"++++++++++ línea número $LINENO ++++++++++" "primer parámetro: $1" "segundo parámetro: $2" "tercer parámetro: $3"

echo "++++++++++ línea número $LINENO ++++++++++" echo "decimosegundo parámetro: $12" echo "decimosegundo parámetro: ${12}" echo "++++++++++ línea número $LINENO ++++++++++" echo "número de parámetros: $#" echo "++++++++++ línea número $LINENO ++++++++++" echo "conjunto de parámetros con \$*: $*" echo "conjunto de parámetros con \$@: $@" [nicolas]$ ./prog.sh a b c d e f g h i j k l ++++++++++ línea número 2 ++++++++++ mi PID: 1455 mi PPID: 1223 ++++++++++ línea número 6 ++++++++++ primer parámetro: a segundo parámetro: b tercer parámetro: c ++++++++++ línea número 11 ++++++++++ decimosegundo parámetro: a2 decimosegundo parámetro: l ++++++++++ línea número 15 ++++++++++ número de parámetros: 12 ++++++++++ línea número 18 ++++++++++ conjunto de parámetros con $*: a b c d e f g h i j k l conjunto de parámetros con $@: a b c d e f g h i j k l

Comando test El comando test permite efectuar una serie de pruebas sobre los archivos, las cadenas de caracteres, los valores aritméticos y el entorno de usuario. Este comando tiene un código de retorno igual a cero cuando el test es positivo, y diferente de cero en caso contrario; esto permite utilizarlo en encadenamientos de comandos con ejecución condicional (&& y ||) o en las estructuras de control que veremos más adelante. El comando test posee dos sintaxis: test expresión y [ expresión ], donde "expresión" representa el test que se debe efectuar.

La segunda sintaxis ofrece una lectura más fácil de las condiciones en las estructuras de control. Los espacios detrás del corchete de apertura y antes del corchete de cierre son obligatorios en la sintaxis [ expresión ]. En general, todos los elementos de sintaxis del comando test deben ir separados por al menos un espacio. El resto del apartado presenta los principales operadores que componen las expresiones de test del comando.

1. Test de archivos -f archivo Devuelve verdadero (código de retorno igual a cero) si el archivo es de tipo estándar (file): [nicolas]$ [nicolas]$ 0 [nicolas]$ /etc no es

test -f /etc/passwd echo $? [ -f /etc ] || echo "/etc no es un archivo estándar" un archivo estándar

-d archivo Devuelve verdadero si el archivo es de tipo directorio (directory): [nicolas]$ archivo=’/etc’ [nicolas]$ [ -d "$archivo" ] && echo "$archivo es un directorio" /etc es un directorio

Cuando se comprueba el contenido de una variable, es preferible encerrarla entre comillas para evitar un error en la sintaxis del comando test si la variable no está definida. -r archivo Devuelve verdadero si el usuario tiene permiso para leer el archivo (read). -w archivo Devuelve verdadero si el usuario tiene permiso para modificar el archivo (write). -x archivo Devuelve verdadero si el usuario tiene permiso para ejecutar el archivo (o entrar en él en el caso de un directorio) (execute). -e archivo

Devuelve verdadero si el archivo existe (exist). -s archivo Devuelve verdadero si el archivo no está vacío (size): [nicolas]$ [nicolas]$ [nicolas]$ -rw-r--r--rw-r--r-[nicolas]$ 1 [nicolas]$ 0

touch arch1 echo "abc" > arch2 ls -l arch* 1 nicolas curso 0 jul 1 nicolas curso 4 jul test -s arch1; echo $?

3 00:49 arch1 3 00:49 arch2

test -s arch2; echo $?

archivo1 -nt archivo2 Devuelve verdadero si archivo1 es más reciente que archivo2 (newer than). archivo1 -ot archivo2 Devuelve verdadero si archivo1 es más antiguo que archivo2 (older than): [nicolas]$ ls -l /etc/passwd /var/log/messages -rw-r--r-- 1 root root 1364 may 26 23:08 /etc/passwd -rw-r----- 1 root adm 29436 jul 3 00:01 /var/log/messages [nicolas]$ [ /etc/passwd -nt /var/log/messages ]; echo $? 1 [nicolas]$ [ /etc/passwd -ot /var/log/messages ]; echo $? 0

archivo1 -ef archivo2 Devuelve verdadero si archivo1 es idéntico a archivo2 (equal file), es decir, si los dos archivos poseen el mismo inodo.

2. Test de cadenas de caracteres -n cadena Devuelve verdadero si la cadena de caracteres no es nula: [nicolas]$ cadena=’abc’ [nicolas]$ [ -n $cadena ]; echo $? 0 [nicolas]$ [ -n "" ]; echo $? 1

-z cadena Devuelve verdadero si la cadena de caracteres es nula:

[nicolas]$ cadena=’abc’ [nicolas]$ [ -z $cadena ]; echo $? 1 [nicolas]$ [ -z "" ]; echo $? 0

cadena1 = cadena2 Devuelve verdadero si las dos cadenas de caracteres son iguales: [nicolas]$ test "abc" = "abc" ; echo $? 0 [nicolas]$ test "abc" = "Abc" ; echo $? 1 [nicolas]$ test "abc" = "abc " ; echo $? 1

cadena1 != cadena2 Devuelve verdadero si las dos cadenas de caracteres son diferentes.

3. Test aritmético valor1 -eq valor2 Devuelve verdadero si los dos valores aritméticos son iguales (equal): [nicolas]$ valor1=32 [nicolas]$ [ $valor1 -eq 32 ]; echo $? 0 [nicolas]$ [ $valor1 -eq 23 ]; echo $? 1

Atención: los tests de valores aritméticos se hacen con operadores de "texto" (-eq, -ne, le, etc.) mientras que los tests con cadenas de caracteres se realizan con operadores aritméticos (=, !=). valor1 -ne valor2 Devuelve verdadero si los dos valores aritméticos son diferentes (not equal). valor1 -lt valor2 Devuelve verdadero si valor1 es estrictamente inferior a valor2 (lower than). valor1 -le valor2 Devuelve verdadero si valor1 es inferior o igual a valor2 (lower or equal). valor1 -gt valor2

Devuelve verdadero si valor1 es estrictamente superior a valor2 (greater than). valor1 -ge valor2 Devuelve verdadero si valor1 es superior o igual a valor2 (greater or equal).

4. Test del entorno de usuario -o opción Devuelve verdadero si la opción del shell especificada está activa: [nicolas]$ set -o allexport off braceexpand on emacs on errexit off hashall on histexpand on history on ignoreeof off interactive-comments on keyword off monitor on noclobber off noexec off noglob off nolog off notify off nounset off onecmd off physical off posix off privileged off verbose off vi off xtrace off [nicolas]$ test -o emacs ; echo $? 0 [nicolas]$ test -o vi ; echo $? 1

5. Combinación de expresiones ! expresión Devuelve verdadero si la expresión es falsa, y viceversa: [nicolas]$ [ -d /etc ] ; echo $? 0 [nicolas]$ [ ! -d /etc ] ; echo $? 1

expresión1 -a expresión2

-a (and) representa el "y lógico" entre expresión1 y expresión2: [nicolas]$ valor=23 [nicolas]$ [ -d /etc -a $valor -eq 12 ] ; echo $? 1

El ejemplo anterior puede traducirse por: "si /etc es un directorio Y la variable $valor es igual a 12". expresión1 -o expresión2 -o (or) representa el "o lógico" entre expresión1 y expresión2: [nicolas]$ valor=23 [nicolas]$ [ -d /etc -o $valor -eq 12 ] ; echo $? 0

El ejemplo anterior puede traducirse por: "si /etc es un directorio O la variable $valor es igual a 12". \( expresión \) Se pueden agrupar varias expresiones para evitar toda ambigüedad en el campo de aplicación de !, -a y -o. [nicolas]$ valor=23 [nicolas]$ [ -d /etc -o $valor -eq 12 ] ; echo $? 0 [nicolas]$ [ ! \( -d /etc -o $valor -eq 12 \) ] ; echo $? 1

Las barras invertidas son necesarias para evitar una incorrecta interpretación de los paréntesis por parte del shell.

Operaciones aritméticas Como todo lenguaje de programación, el Bash ofrece las herramientas necesarias para el cálculo aritmético. Para ello, existen principalmente los comandos expr, let y bc.

1. expr expr es un antiguo comando externo del Bash y se presenta aquí sucintamente porque se prefiere el comando let que ofrece una sintaxis menos restrictiva. Este comando devuelve en su salida estándar el resultado de las expresiones aritméticas pasadas como argumentos. Su sintaxis es expr expresión.

Todos los elementos de la expresión deben ir separados por al menos un espacio, y ciertos operadores aritméticos llevan como prefijo una barra invertida para evitar toda confusión con los caracteres especiales del shell. Operadores aritméticos Los operadores aritméticos son:      

+: suma -: resta \*: multiplicación /: división entera %: resto de la división entera o módulo \( y \): paréntesis

Se utiliza generalmente una sustitución de comandos para asignar el resultado del comando expr a una variable. Se obtiene por ejemplo: [nicolas]$ expr 2 + 3 5 [nicolas]$ expr 2 - 3 -1 [nicolas]$ 14 [nicolas]$ 20 [nicolas]$ [nicolas]$ 4 [nicolas]$ 1

expr 2 + 3 \* 4 expr \( 2 + 3 \) \* 4 resultado=$(expr 9 / 2) echo $resultado expr $resultado % 3

Operadores lógicos Los operadores lógicos son:        

\|: o lógico \&: y lógico \=: mayor o igual =: igual !=: desigual

El álgebra de Boole (base matemática del razonamiento lógico) define el valor 1 como "verdadero" y 0 como "falso"; por ello, cuando una expresión es verdadera, expr devuelve 1 en su salida estándar con el código de retorno 0. Por el contrario, cuando una expresión es falsa, expr devuelve 0 en su salida estándar con el código de retorno 1. Por ejemplo:

[nicolas]$ 1 [nicolas]$ 0 [nicolas]$ 0 [nicolas]$ 1 [nicolas]$ 1 [nicolas]$ 0 [nicolas]$ 0

expr 2 = 2 echo $? expr 3 \> 6 echo $? expr 1 \| 0 expr 1 \& 0 expr \( 2 != 3 \) \& \( 6 \. El trabajo con variables se simplifica porque es posible asignar una variable dentro de una expresión, y los nombres de variables no van precedidos de un $. Existe un mayor número de operadores para el cálculo aritmético.

Como en el caso del comando test, let puede llamarse de dos maneras: let expresión o ((expresión)). Además, es posible especificar varias expresiones separadas por una coma en una misma llamada al comando. Operadores aritméticos Los operadores aritméticos son:       

+: suma -: resta *: multiplicación /: división entera %: resto de la división entera o módulo **: potencia =: asignación

Veamos distintos ejemplos de operaciones aritméticas realizadas mediante el comando let. La sintaxis $(()) se sustituye por el resultado de la expresión: [nicolas]$ let var=2+3

[nicolas]$ 5 [nicolas]$ [nicolas]$ 8 [nicolas]$ 2

echo $var (( var = 2**3 )) echo $var echo $((9/4))

Operadores lógicos Los operadores lógicos son:         

&&: y lógico ||: o lógico !: negación lógica =: mayor o igual ==: igual !=: desigual

Como en expr, el comando let es coherente con el álgebra de Boole: [nicolas]$ (( var=1 && 0 )) [nicolas]$ echo $? 1 [nicolas]$ echo $var 0

Otros operadores El comando let tiene también otros operadores, como:       

~: negación binaria >>: desplazamiento binario a la derecha 2 )); echo "código de retorno: $? - variable i: $i" código de retorno: 1 - variable i: 1 [nicolas]$ (( i++ > 2 )); echo "código de retorno: $? - variable i: $i"

código de retorno: 1 - variable i: 2 [nicolas]$ (( i++ > 2 )); echo "código de retorno: $? - variable i: $i" código de retorno: 1 - variable i: 3 [nicolas]$ (( i++ > 2 )); echo "código de retorno: $? - variable i: $i" código de retorno: 0 - variable i: 4

Comando read El comando read interrumpe la ejecución del shell hasta que el usuario introduzca una cadena de caracteres (aunque sea vacía) en su entrada estándar. Las palabras que componen la cadena de caracteres escrita por el usuario se asignan a las variables cuyos nombres se pasan como argumentos al comando read: [nicolas]$ read a b c 1 2 3 [nicolas]$ echo $a ; echo $b ; echo $c 1 2 3

Si hay más palabras que variables, la última variable contendrá el fin de la cadena de caracteres. En el caso inverso, las variables suplementarias serán nulas: [nicolas]$ 1 2 3 4 [nicolas]$ 1 2 3 4 [nicolas]$ 1 2 [nicolas]$ 1 2

read a b c echo $a ; echo $b ; echo $c

read a b c echo $a ; echo $b ; echo $c

Si se llama al comando read sin argumentos, la respuesta del usuario se asigna a la variable de entorno $REPLY: [nicolas]$ read respuesta del usuario [nicolas]$ echo $REPLY respuesta del usuario

Se puede hacer que la entrada de una frase esté precedida por la opción -p (prompt) del comando read: [nicolas]$ read -p "¿edad del capitán? " edad ¿edad del capitán? 12 [nicolas]$ echo $edad 12

Este comando se utiliza generalmente en los scripts interactivos; veamos un ejemplo de programa que pide la intervención del usuario: [nicolas]$ cat prog.sh #!/bin/bash # Se pide al usuario que escriba un nombre de archivo read -p "escriba un nombre de archivo: " archivo # Si el archivo no existe, # se sale del script con el código de retorno igual a 1 [ -e "$archivo" ] || exit 1 # Se dan las características del archivo: [ -f "$archivo" ] && echo "archivo de tipo estándar" [ -d "$archivo" ] && echo "archivo de tipo directorio" [ -r "$archivo" ] && echo "permiso de lectura activo" \ || echo "permiso de lectura desactivado" [ -w "$archivo" ] && echo "permiso de modificación activo" \ || echo "permiso de modificación desactivado" [ -x "$archivo" ] && echo "permiso de ejecución activo" \ || echo "permiso de ejecución desactivado" [nicolas]$ ./prog.sh escriba un nombre de archivo: zorglub [nicolas]$ echo $? 1 [nicolas]$ ./prog.sh escriba un nombre de archivo: /etc/passwd archivo de tipo estándar permiso de lectura activo permiso de modificación desactivado permiso de ejecución desactivado [nicolas]$ echo $? 0 [nicolas]$ ./prog.sh escriba un nombre de archivo: /root archivo de tipo directorio permiso de lectura desactivado permiso de modificación desactivado permiso de ejecución desactivado [nicolas]$ echo $? 0

Condiciones generales de uso Copyright - ©Editions ENI

Estructuras de control Las estructuras de control permiten ejecutar uno o más comandos según el resultado de una expresión. La expresión proporcionada como condición de la estructura puede ser cualquier comando; el código de retorno de este comando es determinante. Se usan principalmente los comandos test o let como condiciones. Sólo presentaremos las instrucciones "if", "for" y "while".

1. La instrucción if La instrucción "if" ejecuta una serie de comandos si la condición indicada es verdad. La sintaxis general es: if condición then serie de comandos si condición verdadera else serie de comandos si condición falsa fi

Cada palabra clave de la estructura (if, then, else y fi) debe encontrarse en una línea distinta; la cláusula "else" no es obligatoria. Veamos un ejemplo de uso: [nicolas]$ cat prog.sh #!/bin/bash if [ "$1" = "vale" ] then echo "está bien" else echo "no está bien" fi [nicolas]$ ./prog.sh vale está bien [nicolas]$ ./prog.sh novale no está bien

2. La instrucción for El bucle "for" ejecuta la misma serie de comandos tantas veces como valores haya en una lista dada; en cada iteración, una variable contiene el valor considerado en esta lista. Su sintaxis es: for variable in lista de valores do serie de comandos done

Por ejemplo: [nicolas]$ cat prog.sh #!/bin/bash for var in a b c 1 5 4 do echo "\$var=$var" done echo fin [nicolas]$ ./prog.sh $var=a $var=b $var=c

$var=1 $var=5 $var=4 fin

No es posible especificar límites para la lista de valores como en otros lenguajes. Sin embargo, el desarrollo de caracteres genéricos en nombres de archivos en el directorio actual resulta interesante: [nicolas]$ cd / [nicolas]$ ls bin dev home lib media opt dir1 boot etc initrd libro mnt proc root [nicolas]$ for f in b* > do > echo "directorio que empieza por b: $f" > done directorio que empieza por b: bin directorio que empieza por b: boot

sbin srv

sys tmp

usr var

3. La instrucción while La instrucción "while" ejecuta la serie de comandos mientras la condición es verdad: while condición do serie de comandos done

Por ejemplo: [nicolas]$ cat prog.sh #!/bin/bash ((i=0)) while ((i++ < 10)) do echo "\$i=$i" done echo fin [nicolas]$ ./prog.sh $i=1 $i=2 $i=3 $i=4 $i=5 $i=6 $i=7 $i=8 $i=9 $i=10 fin

Introducción

Aunque los usuarios normales no poseen los derechos necesarios para la administración del sistema, sin embargo pueden modificar su entorno personal. El usuario puede personalizar la definición de su cuenta (contraseña, nombre completo, shell predeterminado), modificar el comportamiento del shell que emplea (variables de entorno, alias...), adaptar la interfaz gráfica a sus gustos y, desde luego, organizar sus archivos en los directorios previstos al efecto.

Modificación de la cuenta El administrador crea las cuentas de usuario durante o después de la instalación del sistema. Sus definiciones contienen valores predeterminados que el usuario tiene derecho a ver y cambiar mediante los comandos siguientes. Los comandos finger y who, descritos en el capítulo Inicio de sesión y primeros comandos, devuelven información respecto a las cuentas de usuario. El archivo /etc/passwd contiene gran parte de esta información y sólo puede ser modificado por root. Ejemplo de archivo /etc/passwd: root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin nobody:x:99:99:Nobody:/:/sbin/nologin nicolas:x:500:100:Nicolas Pons:/home/nicolas:/bin/bash linus:x:504:100:Linus Torvalds:/home/linus:/bin/bash richard:x:505:100:Richard M. Stallman:/home/richard:/bin/bash ken:x:501:100:Ken Thompson:/home/ken:/bin/bash dennis:x:502:100:Dennis Ritchie:/home/dennis:/bin/bash eric:x:506:100:Eric S. Raymond:/home/eric:/bin/bash alan:x:507:100:Alan Cox:/home/alan:/bin/bash gordon:x:503:100:Gordon E. Moore:/home/gordon:/bin/bash

Cada línea de este archivo caracteriza una cuenta de usuario y los siete campos separados por : (dos puntos) son:  

  



El login (o nombre de usuario): es el nombre utilizado para conectarse al sistema. Debe ser único. La contraseña : esta contraseña no se encuentra en este archivo por razones de seguridad; el carácter x la reemplaza e indica una referencia al archivo /etc/shadow que no es accesible en lectura a los usuarios normales. El UID : identificador de la cuenta de usuario; normalmente es único. El GID : identificador del grupo principal de la cuenta. Nombre completo: llamado también GECOS de "General Electric Comprehensive Operating System" (el historial de este término se explica en la página del manual sobre el archivo /etc/passwd), este campo libre y opcional indica generalmente la identidad real de la persona asociada a la cuenta de Linux. El directorio personal: es el directorio de base del usuario en el que se encuentra al iniciar sesión.



El shell : es el programa que se ejecuta en el inicio de sesión. El shell predeterminado en GNU/Linux es el Bash.

Los demás archivos que regulan las cuentas de usuario son /etc/shadow, que contiene las contraseñas cifradas, /etc/group y /etc/gshadow, que definen los grupos de usuarios. chfn Un usuario puede modificar el campo GECOS asociado a su propia cuenta con el comando chfn. Toda la información necesaria puede indicarse en la línea de comandos, pero es más simple escribir únicamente el comando y responder a las preguntas propuestas: [nicolas]$ chfn Modificación de la información de finger para nicolas. Contraseña: Nombre[]: Nicolas Pons Oficina[]: Teléfono oficina[]: Teléfono casa[]: La información de finger ha cambiado.

El campo GECOS es opcional y actualmente se usa poco; los detalles del comando chfn se describen en el manual (man chfn). chsh Al igual manera que el comando anterior, chsh permite a un usuario modificar el shell predeterminado cuando se inicia sesión: [nicolas] $ chsh Modificación del shell para nicolas. Contraseña: Nuevo shell[/bin/bash]:

passwd Mientras no se haya asignado una contraseña a una cuenta, no es posible utilizarla para conectarse al sistema; por tanto, el administrador define generalmente una primera contraseña al abrir una cuenta y pide al usuario que la modifique cuanto antes, para evitar problemas de seguridad. Se permiten todos los caracteres en las contraseñas y se recomienda incluir tanto minúsculas como mayúsculas, cifras e incluso caracteres de puntuación o caracteres acentuados. Sin embargo, estos últimos pueden presentar problemas si se puede acceder al sistema desde varios terminales, y en particular con teclados con una disposición de teclas diferente (las teclas acentuadas no existen en un teclado QWERTY).

Se impone un número mínimo de seis caracteres y ciertas distribuciones truncan una contraseña más allá del octavo; imponer una contraseña de ocho caracteres constituye, pues, una buena solución. Además, no hay que utilizar una palabra corriente susceptible de encontrarse en un diccionario de palabras prohibidas, como qwerty, root o pinguino.

Las restricciones sobre las contraseñas (número mínimo de caracteres, número máximo de caracteres iguales a la antigua contraseña, número mínimo de minúsculas...) dependen de la configuración del sistema. La asignación de una contraseña a una cuenta de Unix se hace con el comando passwd; este comando ya se analizó en el capítulo Inicio de sesión y primeros comandos.

Datos personales Los datos de usuario -o más exactamente los archivos que contienen los datos de los usuarios- se guardan en distintos sitios en el sistema de archivos; conocer su ubicación es importante cuando se quiere guardar todos los datos de un usuario sin omitir ciertos archivos.

1. /home Los archivos pertenecientes a los usuarios se guardan mayoritariamente en los directorios personales asociados. El directorio personal de un usuario es generalmente un subdirectorio de /home con el nombre de la cuenta. Todos los archivos de configuración de las aplicaciones ejecutadas por el usuario se guardan aquí. Estos archivos de configuración tienen un nombre que empieza habitualmente por un punto para que no se listen de modo predeterminado con el comando ls. [nicolas]$ pwd /home/nicolas [nicolas]$ ls Escritorio Archivos Plantillas Público Vídeos Documentos Imágenes Música Descargas [nicolas]$ ls -a . .esd_auth Imágenes .pulse-cookie .. Archivos .imsettings.log .recently-used.xbel .bash_history .gconf .kde .setroubleshoot .bash_logout .gconfd .lesshst Descargas .bash_profile .gnome2 .local .themes .bashrc .gnome2_private .mc .thumbnails Escritorio .gnupg Plantillas Vídeos .cache .gstreamer-0.10 .mozilla .viminfo .config .gtk-bookmarks Música .xine .dbus .gtkrc-2.0-kde4 .nautilus .xsession-errors .directory .gvfs .openoffice.org .xsession-errors.old .dmrc .ICEauthority Público Documentos .icons .pulse

Se encontrará, por ejemplo, la configuración del navegador web Mozilla (y Firefox) para el usuario nicolas en el subdirectorio /home/nicolas/.mozilla.

2. /tmp El directorio /tmp es un espacio de almacenamiento común para todos los usuarios del sistema. Borrado regularmente por el administrador, no debería contener archivos de usuario importantes. Sin embargo, téngase presente que un usuario puede almacenar aquí archivos de forma temporal.

3. /var/spool/* Como se indica en el capítulo que detalla el árbol de Linux, el directorio /var/spool contiene las diferentes colas de espera de los servicios propuestos por el sistema. Muchos datos personales se encuentran aquí; por ejemplo:   

los trabajos de impresión en espera (/var/spool/lpd y /var/spool/cups); la definición de las tareas planificadas (/var/spool/cron y /var/spool/at); el correo electrónico de los usuarios aún no entregado a sus clientes de correo (/var/spool/mail).

Condiciones generales de uso Copyright - ©Editions ENI

Entorno de shell Cuando el usuario se conecta al sistema en un terminal de texto, se leen varios archivos al iniciar el shell para definir el entorno de trabajo.

1. /etc/profile El archivo /etc/profile es un script de shell que se ejecuta en primer lugar, al conectarse a un terminal de texto. Este archivo contiene las variables de entorno de base de todos los procesos, y sólo el administrador del sistema puede modificarlo. Por otra parte, este archivo ejecuta comandos en el entorno del shell de conexión. Este script sólo se interpreta en la conexión del usuario.

2. ~/.bash_profile, ~/.bash_login, ~/.profile

Tras leer el archivo /etc/profile, Bash busca el archivo ~/.bash_pro- file, ~/.bash_login o ~/.profile en este orden y ejecuta los comandos contenidos en el primero de estos scripts que encuentra y que está accesible en lectura. Este archivo tiene la misma función que el archivo /etc/profile, con la diferencia de que puede ser modificado por el usuario para cambiar su propio entorno. Como el archivo anterior, este script sólo se interpreta en la conexión; las modificaciones aportadas sólo son tenidas en cuenta tras una nueva conexión del usuario.

3. ~/.bashrc El archivo ~/.profile sólo se ejecuta en el inicio de sesión. Si el usuario dispone de un entorno gráfico, se ignora cuando el usuario inicia un emulador de terminal con un shell. Esto presenta problemas para todos los elementos, como los alias, definidos en el archivo ~/.profile, distintos de las variables de entorno. El archivo ~/.bashrc se usa para este fin porque se interpreta al arrancar cada nuevo shell Bash interactivo. En el caso de un shell no interactivo, si la variable de entorno $BASH_ENV contiene el nombre de un archivo, se ejecuta éste.

Se califica de interactivo un shell empleado para introducir comandos manualmente (con un prompt y una línea de comandos). Por el contrario, un shell no interactivo es, por ejemplo, el proceso lanzado para interpretar un script.

4. /etc/bashrc El archivo /etc/bashrc tiene la misma función que el archivo anterior a escala del sistema; sólo lo puede modificar el administrador. Invocado en el archivo ~/.bashrc, se lee en la ejecución de cada nuevo proceso Bash.

5. ~/.bash_logout Este script de shell sólo se ejecuta en la desconexión del usuario. Incluye por ejemplo los comandos de limpieza automática (eliminación de archivos de trabajo temporales) y la copia de datos personales.

Condiciones generales de uso Copyright - ©Editions ENI

Entorno gráfico La configuración del entorno gráfico depende del escritorio utilizado (KDE, GNOME...) y de las aplicaciones que contiene. Dicho esto, es una buena idea utilizarlo porque proporciona herramientas ergonómicas y amigables. Los menús propuestos por los entornos de escritorio permiten acceder a estas herramientas de configuración. Por ejemplo, en KDE el centro de control (systemsettings):

GNOME tiene un "Centro de control" (gnome-control-center) que reúne la mayoría de las herramientas de configuración del entorno:

Aunque el entorno y las aplicaciones gráficas se configuran en gran parte mediante herramientas gráficas, los archivos de configuración producidos por estas herramientas siguen siendo archivos de texto presentes en el directorio personal del usuario. Es fácil modificarlos con un editor como Vi o copiarlos en otras cuentas.

Condiciones generales de uso Copyright - ©Editions ENI

Copia de seguridad de los datos del usuario La copia de seguridad de todos los datos en un sistema Unix -incluyendo los archivos pertenecientes a los usuarios- es generalmente responsabilidad del administrador. Por ello el tema de la copia de seguridad se aborda en detalle en las obras de administración del sistema en Linux. Sin embargo, un usuario puede hacer su propia copia de seguridad de sus datos, aunque sólo sea para facilitar el transporte y la distribución de sus archivos en medios extraibles (disquetes, memoria USB...). Para ello, el formato de copia de seguridad más extendido en el mundo Linux es el formato de archivo tar, asociado al formato de compresión gzip. tar El comando tar es una herramienta de archivo prevista originalmente para funcionar con los lectores de cintas magnéticas (tape archiver). Se usa mucho en el mundo Unix y

particularmente en GNU/Linux, donde los archivos fuentes de los programas libres se archivan, principalmente, en este formato. Por compatibilidad con otros Unix, el comando GNU tar acepta, además de las opciones largas, las opciones cortas (monocarácter) precedidas o no del carácter -. Una de las opciones siguientes debe indicarse obligatoriamente para señalar al comando el tipo de acción que se debe emprender: c, --create r, --append u, --update

crear de un archivo. agregar archivos al final del archivo. agregar sólo los archivos más recientes que el archivo, útil para copias de seguridad incrementales.

x, --extract, extraer de archivos del archivo. -get mostrar la TOC (Table Of Contents) del archivo: lista de t, --list archivos contenidos en el archivo. Pueden agregarse otras opciones, entre las destacan: nombre fichero de archivo (archivo.tar por ejemplo); sin esta opción, los datos del archivo aparecen en la salida estándar. modo verboso; el comando muestra los archivos tratados durante v, --verbose el proceso. z, --gzip, -uso de la compresión en formato gzip. ungzip f, --file

Generalmente se usan, pues, las sintaxis siguientes:   

para crear un archivo: tar cvf para enumerar el contenido de un archivo: tar tvf para restaurar un archivo: tar xvf

Al crear un archivo, su nombre no debe formar parte de los archivos que hay que guardar. Así, se evitará incluir el propio archivo en la copia; un error clásico es escribir: tar cvf archive.tar. tar es una herramienta recursiva, por lo que un nombre de directorio pasado como argumento al comando implica el archivado completo del árbol subyacente. Veamos un ejemplo de creación, verificación y restauración de un archivo que contiene los archivos del usuario alan: [alan]$ cd /home [alan]$ ls -aR alan alan: . .. .bash_logout

.bash_profile

.bashrc

.gnome2

.mozilla

alan/.gnome2: . .. alan/.mozilla: . .. extensions

plugins

alan/.mozilla/extensions: . .. alan/.mozilla/plugins: . .. [alan]$ tar cvf /tmp/archivo.tar alan alan/ alan/.gnome2/ alan/.bashrc alan/.bash_logout alan/.mozilla/ alan/.mozilla/plugins/ alan/.mozilla/extensions/ alan/.bash_profile [alan]$ tar tvf /tmp/archivo.tar drwx------ alan/users 0 2011-02-22 17:35 alan/ drwxr-xr-x alan/users 0 2010-09-29 06:15 alan/.gnome2/ -rw-r--r-- alan/users 124 2010-06-22 17:15 alan/.bashrc -rw-r--r-- alan/users 18 2010-06-22 17:15 alan/.bash_logout drwxr-xr-x alan/users 0 2011-02-18 10:57 alan/.mozilla/ drwxr-xr-x alan/users 0 2009-07-27 05:01 alan/.mozilla/plugins/ drwxr-xr-x alan/users 0 2009-07-27 05:01 alan/.mozilla/extensions/ -rw-r--r-- alan/users 176 2010-06-22 17:15 alan/.bash_profile [alan]$ cd /tmp [alan]$ tar xvf archivo.tar alan/ alan/.gnome2/ alan/.bashrc alan/.bash_logout alan/.mozilla/ alan/.mozilla/plugins/ alan/.mozilla/extensions/ alan/.bash_profile [alan]$ ls -aR /tmp/alan /tmp/alan: . .. .bash_logout .bash_profile .bashrc .gnome2 .mozilla /tmp/alan/.gnome2: . .. /tmp/alan/.mozilla: . .. extensions plugins /tmp/alan/.mozilla/extensions: . .. /tmp/alan/.mozilla/plugins: . ..

La restauración de un archivo tar se hace en el directorio actual (/tmp/alan) de modo predeterminado. Para restaurar archivos en su lugar de origen, hay que situarse en el directorio de origen antes de extraer los archivos. Este comando es en principio sólo una herramienta de archivado y no un programa de compresión. A menudo se une a un programa de compresión para reducir el tamaño de los archivos. [alan]$ pwd /tmp [alan]$ ls -l archivo.tar -rw-r--r--. 1 alan users 10240 22 feb. 18:27 archivo.tar [alan]$ gzip archivo.tar [alan]$ ls -l archivo.tar.gz -rw-r--r--. 1 alan users 513 22 feb. 18:27 archivo.tar.gz

El uso de la compresión gzip con el formato tar está muy extendido en Internet y la extensión .tgz, más corta, se usa también para designar estos archivos pasados por tar y gzip. Además, la versión GNU del comando tar admite la compresión al vuelo con la opción z para el formato gzip; no siempre es así en los demás Unix. Por ejemplo: [alan]$ ls archivo.tar.gz archivo.tar.gz [alan]$ tar tvzf archivo.tar.gz drwx------ alan/users 0 2011-02-22 drwxr-xr-x alan/users 0 2010-09-29 -rw-r--r-- alan/users 124 2010-06-22 -rw-r--r-- alan/users 18 2010-06-22 drwxr-xr-x alan/users 0 2011-02-18 drwxr-xr-x alan/users 0 2009-07-27 alan/.mozilla/plugins/ drwxr-xr-x alan/users 0 2009-07-27 alan/.mozilla/extensions/ -rw-r--r-- alan/users 176 2010-06-22

17:35 06:15 17:15 17:15 10:57 05:01

alan/ alan/.gnome2/ alan/.bashrc alan/.bash_logout alan/.mozilla/

05:01 17:15 alan/.bash_profile

Se obtiene, en resumen:

Ark Para la copia de seguridad y la restauración de datos, existen diferentes herramientas integradas a los entornos de escritorio. Ark es una herramienta gráfica que permite generar archivos comprimidos como el programa Winzip de Windows.

Evidentemente, esta herramienta puede trabajar con archivos tar comprimidos en formato gzip.

Condiciones generales de uso Copyright - ©Editions ENI

Presentación de las principales herramientas de Linux Este capítulo presenta una serie de herramientas de Linux que todo usuario debería conocer. A menudo basta con una línea de comandos adecuada para efectuar los mismos tratamientos que un centenar de clics de ratón con un administrador de archivos gráfico. Al finalizar este capítulo el lector sabrá, entre otras cosas:    

buscar archivos según ciertos criterios y aplicarles un tratamiento; filtrar el contenido de archivos y las salidas de comandos con expresiones regulares; ordenar y separar datos; ver parcialmente el contenido de archivos.

1. find El comando find permite buscar, en uno o más árboles de directorios, archivos que respondan a ciertos criterios y aplicarles un tratamiento según una acción determinada. La sintaxis global del comando es: find ruta(s) parámetro(s) acción

La sintaxis del comando find no sigue las reglas elementales de sintaxis de los comandos de Linux descritos en el capítulo Inicio de sesión y primeros comandos.

a. Ruta de búsqueda Se especifica en el comando find una o más rutas de búsqueda; estas rutas son directorios del sistema de archivos y find se encarga de recorrer todo el árbol subyacente en busca de archivos. Si no se especifica una ruta, find inicia su búsqueda en el directorio actual: $ ls -R .: archivo1 ./dir1:

archivo2

dir1

dir2

./dir2: $ find . ./dir2 ./dir1 ./archivo2 ./archivo1 $ find . . ./dir2 ./dir1 ./archivo2 ./archivo1

Cuando se especifican varias rutas, se separan con espacios: $ find /var/spool/mail . /etc/skel /var/spool/mail /var/spool/mail/alan /var/spool/mail/linus /var/spool/mail/richard /var/spool/mail/gordon /var/spool/mail/eric /var/spool/mail/rpc /var/spool/mail/ken /var/spool/mail/dennis /var/spool/mail/nicolas . ./dir2 ./dir1 ./archivo2 ./archivo1 /etc/skel /etc/skel/.gnome2 /etc/skel/.bashrc /etc/skel/.bash_logout /etc/skel/.mozilla /etc/skel/.mozilla/plugins /etc/skel/.mozilla/extensions /etc/skel/.bash_profile

b. Expresiones de selección Los criterios de selección, o expresiones, empiezan con un - (guión) seguido por sus parámetros. Por ejemplo, la expresión -name nomarc pide al comando find que busque sólo los archivos cuyo nombre sea nomfic. La línea de comando completa, para una búsqueda en todo el árbol de Linux, es: find / -name nomarc 2>/dev/null

Un usuario normal no tiene los permisos suficientes para acceder a todos los archivos presentes en el sistema. Como por lo general sólo se buscan los archivos a los que se puede acceder, habitualmente se suprimen los mensajes de error del comando find

debidos a esta falta de permiso de acceso, redirigiendo la salida de errores estándar al archivo /dev/null. El comando find cuenta con un gran número de parámetros de selección; veremos a continuación las principales expresiones. -name motivo El parámetro -name afecta al nombre de los archivos presentes en los árboles de búsqueda. El motivo puede contener los mismos caracteres genéricos de reemplazo que el shell, pero el comando find debe interpretarlos; por ello, el motivo se pone generalmente entre apóstrofes para inhibir la interpretación del shell. Por ejemplo, los archivos cuyo nombre empieza por una s en el árbol subyacente de /usr: $ find /usr -name ’s*’ 2>/dev/null /usr/src /usr/libexec/perf-core/scripts /usr/libexec/perf-core/scripts/python/sctop.py /usr/libexec/perf-core/scripts/python/syscall-counts-by-pid.pyc /usr/libexec/perf-core/scripts/python/syscall-counts-by-pid.py /usr/libexec/perf-core/scripts/python/syscall-counts-by-pid.pyo /usr/libexec/perf-core/scripts/python/syscall-counts.pyo /usr/libexec/perf-core/scripts/python/syscall-counts.py /usr/libexec/perf-core/scripts/python/bin/syscall-counts-by-pidreport /usr/libexec/perf-core/scripts/python/bin/syscall-counts-report ...

-size [+-](bck) La expresión -size determina el tamaño de los archivos que se quieren buscar. El tamaño de los archivos se indica en número de bloques, precedido eventualmente del signo + o -; eso significa: -size 12 -size 12 -size +12

archivos que usan exactamente doce bloques de datos, por tanto un tamaño comprendido entre 11 y 12 bloques. archivos que usan menos de doce bloques de datos, por tanto de un tamaño estrictamente inferior a 12 bloques. archivos que usan más de doce bloques de datos, por tanto de un tamaño estrictamente superior a 12 bloques.

Los bloques de datos tienen un tamaño predeterminado de 512 bytes, pero la unidad puede especificarse añadiendo el carácter b, c, k, M o G justo después del tamaño: b c

bloques de datos de 512 bytes (valor predeterminado). bloques de datos de 1 byte.

k, M o G

bloques de datos de 1 KB, 1 MB o 1 GB.

Por ejemplo, los archivos cuyo tamaño es de 10 KB en el árbol /usr: $ find /usr -size 10k 2>/dev/null /usr/libexec/ck-get-x11-server-pid /usr/libexec/nm-avahi-autoipd.action /usr/libexec/pulse/proximity-helper /usr/libexec/mission-control-5 /usr/libexec/udisks-helper-drive-detach ... $ ls -l /usr/libexec/ck-get-x11-server-pid -rwxr-xr-x. 1 root root 9920 6 oct 00:32 /usr/libexec/ck-get-x11server-pid $ ls -l /usr/libexec/nm-avahi-autoipd.action -rwxr-xr-x. 1 root root 9300 15 oct 21:24 /usr/libexec/nm-avahiautoipd.action $ ls -l /usr/libexec/pulse/proximity-helper -rwsr-xr-x. 1 root root 9596 23 feb 2010 /usr/libexec/pulse/proximity-helper $ ls -l /usr/libexec/mission-control-5 -rwxr-xr-x. 1 root root 10120 9 oct 00:34 /usr/libexec/missioncontrol-5 $ ls -l /usr/libexec/udisks-helper-drive-detach -rwxr-xr-x. 1 root root 9944 19 may 2010 /usr/libexec/udiskshelper-drive-detach

-mtime [+-] La expresión -mtime especifica la fecha de la última modificación de los archivos buscados en número de días. Como en el parámetro -size, el número de días puede ir precedido de los signos - y +: archivos modificados hace 3 días, o sea entre 72 horas (3 x 24 horas) y 96 horas (4 x 24 horas). -mtime - archivos modificados hace menos de 3 días, o sea menos de 72 horas (3 x 24 horas). 3 -mtime archivos modificados hace más de 3 días, o sea más de 96 horas (4 x 24 horas). +3 -mtime 3

-perm Esta expresión permite recuperar todos los archivos con permisos de acceso particulares. Los permisos pueden indicarse en notación octal o simbólica, por ejemplo: $ find /etc -perm 700 2>/dev/null /etc/lvm /etc/cups/ssl /etc/selinux/targeted/modules/active /etc/pki/CA/private /etc/sssd

/etc/polkit-1/localauthority $ find /etc -perm u=rwx 2>/dev/null /etc/lvm /etc/cups/ssl /etc/selinux/targeted/modules/active /etc/pki/CA/private /etc/sssd /etc/polkit-1/localauthority $ ls -ld /etc/lvm drwx------. 5 root root 4096 18 feb 11:05 /etc/lvm $ ls -ld /etc/cups/ssl drwx------. 2 root lp 4096 17 sept 18:30 /etc/cups/ssl $ ls -ld /etc/selinux/targeted/modules/active drwx------. 3 root root 4096 18 feb 17:31 /etc/selinux/targeted/modules/active $ ls -ld /etc/pki/CA/private drwx------. 2 root root 4096 30 jun 2010 /etc/pki/CA/private $ ls -ld /etc/sssd drwx------. 3 root root 4096 18 feb 11:07 /etc/sssd $ ls -ld /etc/polkit-1/localauthority drwx------. 7 root root 4096 18 feb 11:01 /etc/polkit-1/localauthority

-newer La expresión -newer busca todos los archivos con una fecha de modificación más reciente que el archivo de referencia pasado como parámetro. Este parámetro de selección es muy práctico para efectuar copias de seguridad incrementales (guardar únicamente archivos modificados después de la última copia): $ touch ref $ ls -l total 8 -rw-r--r--. 1 nicolas users 0 23 -rw-r--r--. 1 nicolas users 0 23 -rw-r--r--. 1 nicolas users 0 23 drwxr-xr-x. 2 nicolas users 4096 23 drwxr-xr-x. 2 nicolas users 4096 23 $ find . -newer ref $ echo texto >> archivo1 $ find . -newer ref ./archivo1

feb. feb. feb. feb. feb.

09:10 09:10 09:26 09:09 09:09

archivo1 archivo2 ref dir1 dir2

-user Este parámetro permite recuperar todos los archivos pertenecientes a un mismo usuario. El parámetro puede ser el login o el UID del usuario: $ id nicolas uid=500(nicolas) gid=100(users) grupos=100(users) $ find /var -user nicolas 2> /dev/null /var/cache/gdm/nicolas /var/cache/gdm/nicolas/dmrc /var/spool/mail/nicolas $ find /var -user 500 2> /dev/null /var/cache/gdm/nicolas /var/cache/gdm/nicolas/dmrc

/var/spool/mail/nicolas

-group Al igual que la expresión anterior, -group permite buscar todos los archivos pertenecientes a un mismo grupo de usuarios. De nuevo, se puede indicar indiferentemente el nombre del grupo o su GID.

c. Operadores sobre las expresiones Las expresiones se evalúan como operaciones booleanas: devuelven verdadero o falso. Es posible combinar varias expresiones; para ello, existe una serie de operadores. -and o -a Colocado entre dos expresiones, el operador -and (o -a) efectúa un Y lógico entre las dos expresiones. El operador -and se utiliza de modo predeterminado cuando no se indica ningún operador. La sintaxis expresión1 -and expresión2 equivale a expresión1 expresión2. Por ejemplo, para buscar todos los archivos que pertenecen al usuario nicolas y cuyo nombre empieza por s en el directorio /tmp: $ find /tmp -user nicolas -and -name ’s*’ 2> /dev/null /tmp/keyring-6wqI14/ssh /tmp/sv6h.tmp /tmp/.esd-500/socket $ find /tmp -user nicolas -name ’s*’ 2> /dev/null /tmp/keyring-6wqI14/ssh /tmp/sv6h.tmp /tmp/.esd-500/socket

-or u -o Este operador efectúa un O lógico entre dos expresiones. Por ejemplo, para buscar todos los archivos que pertenecen al usuario nicolas y cuyo nombre empieza por s en el directorio /tmp: $ find /tmp -user nicolas -or -name ’s*’ 2> /dev/null /tmp/keyring-6wqI14 /tmp/keyring-6wqI14/gpg /tmp/keyring-6wqI14/pkcs11 /tmp/keyring-6wqI14/ssh /tmp/keyring-6wqI14/control /tmp/OSL_PIPE_500_SingleOfficeIPC_78d1f4adfd9e62660b247a5f42d4d7c /tmp/virtual-nicolas.MyGDbR /tmp/.ICE-unix/1758 /tmp/virtual-nicolas.fpLGsV ...

-not o ! El operador -not (o !) es la negación lógica. Debe colocarse justo antes de la expresión correspondiente. Por ejemplo, para buscar todos los archivos cuyo nombre no empieza por s en el directorio /tmp: $ find /tmp -not -name ’s*’ 2>/dev/null /tmp /tmp/keyring-6wqI14 /tmp/keyring-6wqI14/gpg /tmp/keyring-6wqI14/pkcs11 /tmp/keyring-6wqI14/control /tmp/OSL_PIPE_500_SingleOfficeIPC_78d1f4adfd9e62660b247a5f42d4d7c /tmp/alan /tmp/virtual-nicolas.MyGDbR /tmp/.X11-unix /tmp/.X11-unix/X0 ...

Los paréntesis Los paréntesis permiten definir el orden de los operadores lógicos. Se colocan antes y después de un conjunto de expresiones para formar una sola a nivel lógico.

Los paréntesis tienen un significado particular para el shell, por lo que hay que protegerlos con el carácter de cita \ (barra invertida). Por ejemplo: $ find /tmp -not -name ’s*’ -or -user nicolas 2>/dev/null /tmp /tmp/keyring-6wqI14 /tmp/keyring-6wqI14/gpg /tmp/keyring-6wqI14/pkcs11 /tmp/keyring-6wqI14/ssh /tmp/keyring-6wqI14/control /tmp/OSL_PIPE_500_SingleOfficeIPC_78d1f4adfd9e62660b247a5f42d4d7c /tmp/alan /tmp/virtual-nicolas.MyGDbR /tmp/.X11-unix ... $ find /tmp -not \( -name ’s*’ -or -user nicolas \) 2>/dev/null /tmp /tmp/alan /tmp/.X11-unix /tmp/.X11-unix/X0 /tmp/vmware-root /tmp/.ICE-unix /tmp/pulse-FDPK5kbTSV2P /tmp/pulse-PKdhtXMmr18n /tmp/archive.tar.gz /tmp/orbit-gdm ...

En el primer ejemplo, se enumeran los archivos cuyo nombre no empieza por s o que pertenecen a nicolas. En el segundo ejemplo, no se enumeran ni los archivos que empiezan por s, ni los que pertenecen a nicolas.

d. Acciones -print La acción predeterminada (para el comando GNU, presente en Linux) que se aplica a cada archivo encontrado por el comando find es -print que muestra el nombre de la instancia encontrada: $ find . . ./ref ./dir2 ./dir1 ./archivo2 ./archivo1 $ find . -print . ./ref ./dir2 ./dir1 ./archivo2 ./archivo1

Las rutas de los archivos mostrados son relativas a la ruta de búsqueda especificada en el comando find. -exec Para ejecutar un comando externo del shell por cada instancia encontrada, se usa la directiva de acción -exec. Las llaves {} se usan para especificar la ruta del archivo encontrado en el comando que se debe ejecutar por find. Para delimitar el fin de la directiva -exec, se termina obligatoriamente el comando con la secuencia de caracteres \;. Por ejemplo, para borrar todos los archivos cuyo nombre empieza por la letra s en el directorio actual con el comando rm: $ ls cosa cubo sofia sonrisa tarta toro $ find . -name ’s*’ -exec rm {} \; $ ls cosa cubo tarta toro tren truco

tren

truco

-ok La directiva -ok funciona igual que -exec pero hay que confirmar, antes de ejecutar el comando externo, en cada instancia de archivo encontrada:

$ ls cosa tarta tren truco $ find . -name ’t*’ -ok rm {} \; < rm ... ./tarta > ? s < rm ... ./tren > ? n < rm ... ./truco > ? s $ ls cosa tren

Las preguntas planteadas por el comando find se inscriben en su salida de error; en este caso no hay que redirigirla. Se corre el riesgo de no ver aparecer las preguntas de la directiva -ok. -ls La acción -ls muestra, en detalle, los archivos encontrados, como el comando ls -ldi. El resultado del ejemplo siguiente equivale al comando find . -exec ls -ldi {} \;: $ find . -ls 934631 4 drwxr-xr-x 934108 0 -rw-r--r-./ref 934648 4 drwxr-xr-x ./dir2 934634 4 drwxr-xr-x ./dir1 934652 0 -rw-r--r-./archivo2 934651 4 -rw-r--r-./archivo1

4 nicolas 1 nicolas

users users

4096 feb. 23 10:14 . 0 feb. 23 09:26

2 nicolas

users

4096 feb. 23 09:09

2 nicolas

users

4096 feb. 23 09:09

1 nicolas

users

0 feb. 23 09:10

1 nicolas

users

6 feb. 23 09:27

2. grep El comando grep permite buscar en uno o más archivos, o en la entrada estándar, las líneas correspondientes a un filtro. La sintaxis general de grep es: grep opción(es) filtro archivo(s)

Al utilizar la entrada estándar para filtrar la salida del comando ps, se limita el resultado a las líneas que contienen una cadena de caracteres en particular; por ejemplo, para encontrar rápidamente el PID del proceso sleep: $ ps -ef UID root root root root root root ...

PID 1 2 3 4 5 6

PPID 0 0 2 2 2 2

C 0 0 0 0 0 0

STIME 09:45 09:45 09:45 09:45 09:45 09:45

TTY ? ? ? ? ? ?

TIME 00:00:02 00:00:00 00:00:00 00:00:00 00:00:00 00:00:00

CMD /sbin/init [kthreadd] [ksoftirqd/0] [migration/0] [watchdog/0] [events/0]

root 1528 root 1542 root 1550 nodaemon root 1555 /dev/tty2 root 1557 /dev/tty3 root 1559 /dev/tty4 root 1561 /dev/tty5 root 1565 /dev/tty6 root 1573 simple-slave -root 1576 verbose -a root 1591 daemon --n root 1635 rtkit 1661 daemon root 1682 root 1686 nicolas 1698 nicolas 1699 nicolas 2162 metadata nicolas 2490 nicolas 2603 $ ps -ef | grep nicolas 2490 nicolas 2605

1 1 1

0 09:46 ? 0 09:46 ? 0 09:46 ?

00:00:00 crond 00:00:00 /usr/sbin/atd 00:00:00 /usr/sbin/gdm-binary -

1

0 09:46 tty2

00:00:00 /sbin/mingetty

1

0 09:46 tty3

00:00:00 /sbin/mingetty

1

0 09:46 tty4

00:00:00 /sbin/mingetty

1

0 09:46 tty5

00:00:00 /sbin/mingetty

1

0 09:46 tty6

00:00:00 /sbin/mingetty

1550

0 09:46 ?

00:00:00 /usr/libexec/gdm-

1573

0 09:46 tty1

00:00:06 /usr/bin/Xorg :0 -nr -

1

0 09:46 ?

00:00:00 /usr/sbin/console-kit-

1 1

0 09:46 ? 0 09:46 ?

00:00:00 /usr/libexec/upowerd 00:00:00 /usr/libexec/rtkit-

1573 1477 1686 1698 1

0 0 0 0 0

00:00:00 00:00:00 00:00:03 00:00:00 00:00:00

1699 1699 sleep 1699 1699

0 10:16 pts/0 3 10:18 pts/0

00:00:00 sleep 9999 00:00:00 ps -ef

0 10:16 pts/0 0 10:18 pts/0

00:00:00 sleep 9999 00:00:00 grep sleep

09:46 09:46 09:46 09:46 09:48

? ? ? pts/0 ?

pam: gdm-password sshd: nicolas [priv] sshd: nicolas@pts/0 -bash /usr/libexec/gvfsd-

La línea que afecta al propio proceso grep se incluye en el resultado porque la cadena de caracteres "sleep" está presente en la línea de comandos. Otro ejemplo, buscando esta vez en archivos pasados como argumentos al comando grep; todas las líneas que se refieren al usuario nicolas en los archivos /etc/passwd y /etc/group: $ grep nicolas /etc/passwd /etc/group /etc/passwd:nicolas:x:500:100:Nicolas Pons:/home/nicolas:/bin/bash /etc/group:users:x:100:nicolas,linus,richard,ken,dennis,eric,alan,gord on

Dado que el comando grep tiene varios nombres de archivo como argumentos, muestra, además de las líneas correspondientes al filtro, el nombre del archivo en el que se encuentra la línea. Para el resto de los ejemplos, se usará el archivo deportistas con una lista de personas que practican uno o más deportes. El formato de este archivo es (los campos se separan con espacios):

nombre apellido sexo deporte1,deporte2...

Veamos el contenido: gilberto garcía hombre ping-pong daniel rigal hombre ping-pong,carrera francisco cornaz hombre vela gerardo cani hombre natación juana barrera mujer natación,marcha nicolas pons hombre petanca,carrera,ping-pong esteban olivar hombre petanca patricio chekib hombre squash,vela sofia py mujer carrera,tenis maria baeza mujer marcha julia ramírez mujer tenis,petanca verónica garcía mujer vela,carrera claudio bermejo hombre carrera,petanca willy mario hombre carrera,squash

a. Opciones Opción -v La opción -v del comando grep imprime sólo las líneas que no corresponden al filtro. Por ejemplo, para ver todas las líneas que no contienen el deporte "carrera": $ grep -v carrera deportistas gilberto garcía hombre ping-pong francisco cornaz hombre vela gerardo cani hombre natación juana barrera mujer natación,marcha esteban olivar hombre petanca patricio chekib hombre squash,vela maria baeza mujer marcha julia ramírez mujer tenis,petanca

La opción -v puede usarse también para suprimir la línea del proceso grep en el primer ejemplo del apartado con: $ ps -ef | grep nicolas 2490 nicolas 3624 $ ps -ef | grep nicolas 2490

sleep 1699 1699 sleep 1699

0 0 | 0

10:16 pts/0 12:18 pts/0 grep -v grep 10:16 pts/0

00:00:00 sleep 9999 00:00:00 grep sleep 00:00:00 sleep 9999

Se pueden encadenar varios filtros seguidos mediante los tubos proporcionados por el shell. Opción -c Para conocer únicamente el número de líneas que concuerdan con el filtro, se usa la opción -c:

$ grep carrera deportistas daniel rigal hombre ping-pong,carrera nicolas pons hombre petanca,carrera,ping-pong sofia py mujer carrera,tenis verónica garcía mujer vela,carrera claudio bermejo hombre carrera,petanca willy mario hombre carrera,squash $ grep -c carrera deportistas 6

Opción -l La opción -l muestra únicamente los nombres de archivos que cuentan con líneas que concuerdan. Por ejemplo, para encontrar todos los archivos en /etc que tienen el número 192: $ grep -l 192 /etc/* 2>/dev/null /etc/dnsmasq.conf /etc/hosts /etc/jwhois.conf /etc/mke2fs.conf /etc/ntp.conf /etc/pm-utils-hd-apm-restore.conf /etc/rsyslog.conf /etc/services

La redirección del error permite suprimir los mensajes respecto a la falta de permisos de acceso del usuario normal para leer ciertos archivos. Opción -n El número de línea donde se encuentra la línea correspondiente se muestra con la opción -n: $ grep -n carrera deportistas 2:daniel rigal hombre ping-pong,carrera 6:nicolas pons hombre petanca,carrera,ping-pong 9:sofia py mujer carrera,tenis 12:verónica garcia mujer vela,carrera 13:claudio bermejo hombre carrera,petanca 14:willy mario hombre carrera,squash

Opción -i La opción -i le indica a grep que ignore la distinción entre mayúsculas y minúsculas en las comparaciones: $ grep petanca deportistas nicolas pons hombre petanca,carrera,ping-pong julia ramírez mujer tenis,petanca claudio bermejo hombre carrera,petanca [francisco]$ grep -i petanca deportivos nicolas pons hombre petanca,carrera,ping-pong esteban olivar hombre petanca julia ramírez mujer tenis,petanca

claudio bermejo hombre carrera,petanca

Opción -w Finalmente, la opción -w considera el filtro como una palabra entera. Así, si se busca todos los hombres en el archivo deportivo, la línea donde se encuentra la persona "julia ramírez" no debe aparecer: $ grep hombre deportistas gilberto garcía hombre ping-pong daniel rigal hombre ping-pong,carrera francisco cornaz hombre vela gerardo cani hombre natación nicolas pons hombre petanca,carrera,ping-pong esteban olivar hombre petanca patricio chekib hombre squash,vela julia ramírez mujer tenis,petanca claudio bermejo hombre carrera,petanca willy mario hombre carrera,squash $ grep -w hombre deportistas gilberto garcía hombre ping-pong daniel rigal hombre ping-pong,carrera francisco cornaz hombre vela gerardo cani hombre natación nicolas pons hombre petanca,carrera,ping-pong esteban olivar hombre petanca patricio chekib hombre squash,vela claudio bermejo hombre carrera,petanca willy mario hombre carrera,squash

b. Expresiones regulares Los filtros del comando grep pueden ser expresiones regulares. Las expresiones regulares sobre líneas de texto son del mismo tipo que los caracteres genéricos utilizados para los nombres de archivos en el shell, pero no son idénticas. Los principales metacaracteres de las expresiones regulares son: . * [a-n] ˆ $ \

cualquier carácter una vez (equivale al carácter genérico ?). cero instancias o más del carácter anterior. un carácter de la lista, como en los caracteres genéricos. principio de línea. final de línea. inhibición del metacarácter siguiente, como en el carácter de cita.

El equivalente del carácter genérico * en shell es .* en la expresión regular (cualquier carácter repetido cero o más veces). Por ejemplo, para listar sólo las líneas que empiezan por "g": $ grep ’ˆg’ deportistas gerardo cani hombre natación

gilberto garcía hombre ping-pong

Los filtros con metacaracteres deben aparecer entre apóstrofes para no ser interpretados por el shell. Para las líneas que empiezan por "g" y terminan por "n": $ grep ’ˆg.*n$’ deportistas gerardo cani hombre natación

Esto es tan solo una idea aproximada de las expresiones regulares. Existen libros de la misma colección, como "Programación shell en Unix/Linux", que analizan esta cuestión.

3. cut El comando cut permite extraer columnas o campos seleccionados a partir de su entrada estándar o de archivos. Extracción de campos La primera sintaxis del comando cut para extraer campos es: cut -f campo(s) -d delimitador archivo(s)

Cuando se especifican varios campos, los números se separan con comas. Para mostrar sólo el tercero y el sexto campo del archivo /etc/passwd: $ cat /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin nicolas:x:500:100:Nicolas Pons:/home/nicolas:/bin/bash linus:x:504:100:Linus Torvalds:/home/linus:/bin/bash richard:x:505:100:Richard M. Stallman:/home/richard:/bin/bash ken:x:501:100:Ken Thompson:/home/ken:/bin/bash dennis:x:502:100:Dennis Ritchie:/home/dennis:/bin/bash eric:x:506:100:Eric S. Raymond:/home/eric:/bin/bash alan:x:507:100:Alan Cox:/home/alan:/bin/bash gordon:x:503:100:Gordon E. Moore:/home/gordon:/bin/bash $ cut -f 3,6 -d : /etc/passwd 0:/root 1:/bin 500:/home/nicolas 504:/home/linus 505:/home/richard 501:/home/ken 502:/home/dennis 506:/home/eric 507:/home/alan 503:/home/gordon

Extracción de columnas El separador de campos es un carácter definido por la opción -d, por lo que no es posible ordenar líneas en las que la información esté espaciada por un número indeterminado de espacios. Para extraer ciertos datos del comando ls -l, por ejemplo, se usa la noción de columna con el comando cut, es decir, para la salida del comando 1s -1 siguiente: $ ls -l total 16 -rw-r--r--. -rw-r--r--. -rw-r--r--. drwxr-xr-x. drwxr-xr-x. -rw-r--r--

1 1 1 2 2 1

nicolas nicolas nicolas nicolas nicolas nicolas

users 6 23 feb. users 0 23 feb. users 0 23 feb. users 4096 23 feb. users 4096 23 feb. users 465 23 feb.

09:27 09:10 09:26 09:09 09:09 12:24

archivo1 archivo2 ref dir1 dir2 deportistas

La sintaxis es: cut -c columnas archivo(s)

Las columnas se definen por los números del primer y del último carácter que las componen, separados por un guión. Si se omite el límite inferior, cut considera el primer carácter de la línea. Asimismo, si se omite el límite superior, se usará implícitamente el último carácter de la línea. Como en la extracción de campos, se puede especificar varias columnas separando sus definiciones por comas. Por ejemplo, para ver los permisos de los archivos, su tamaño y su nombre filtrando la salida del comando ls -l anterior mediante el comando cut: $ ls -l | cut -c 2-10,28-32,48total 16 rw-r--r-6 archivo1 rw-r--r-0 archivo2 rw-r--r-0 ref rwxr-xr-x 4096 dir1 rwxr-xr-x 4096 dir2 rw-r--r-- 465 deportistas

4. sort El comando sort ordena las líneas de un archivo (o su entrada estándar) y devuelve el resultado en su salida estándar. Su sintaxis general es: sort -t delimitador +campo.carácter opción(s) archivo

El archivo de ejemplo frutas utilizado en este párrafo es:

manzana.2 tomate.10 pera.4

En su expresión más simple, sort ordena alfabéticamente por el primer carácter de cada línea: $ sort frutas manzana.2 pera.4 tomate.10

La clasificación puede empezar a partir de cualquier carácter de cualquier campo en el archivo. Se usa entonces la sintaxis -kn.m donde n es el número de campo y m el número del carácter en el campo. Si el número de carácter se omite, la ordenación se efectuará a partir del primer carácter del campo especificado. A diferencia del comando cut, el separador de campos predeterminado es uno o más caracteres de espacio. Además, es modificable con la opción -t. Veamos una clasificación a partir del tercer carácter en el primer campo de cada línea: $ sort -k1.3 frutas tomate.10 manzana.2 pera.4

Veamos una clasificación sobre el primer carácter del segundo campo de cada línea: $ sort -t. -k2 frutas tomate.10 manzana.2 pera.4

La opción -n clasifica los campos numéricos en función de su valor aritmético: $ sort -t. -n -k2 frutas manzana.2 pera.4 tomate.10

Para terminar, la opción -r invierte la ordenación del comando sort: $ sort -r frutas tomate.10 pera.4 manzana.2

5. head, tail Los comandos head y tail permiten respectivamente mostrar sólo el principio o el final de los archivos.

El comando head muestra de modo predeterminado las diez primeras líneas de un archivo. Se puede modificar esta opción a las N primeras líneas del archivo con la sintaxis head -nN. El comando tail muestra de modo predeterminado las diez últimas líneas de un archivo. Se puede cambiar este valor de dos modos: tail -nN tail -n+N

muestra las N últimas líneas del archivo. muestra desde la línea N hasta el final del archivo.

En resumen, se obtiene:

El comando tail se usa también para consultar archivos escritos al mismo tiempo por otros procesos, como archivos de registro. La opción -f le indica al comando tail que lea las nuevas líneas del archivo de entrada a medida que estén disponibles; esto permite controlar el crecimiento del archivo.

Sólo se puede utilizar la opción -f de tail especificando un archivo. Es imposible emplearlo cuando el comando lee los datos en su entrada estándar. Para detener la visualización con la opción -f, se interrumpe el comando con las teclas [Ctrl]+[c].

Introducción La configuración del sistema es responsabilidad del administrador. Sin embargo, es bueno que el principiante sepa efectuar ciertas tareas administrativas para instalar y quitar programas complementarios, configurar el servicio de impresión, utilizar sus dispositivos de audio y de red, etc. Las operaciones indicadas en este capítulo requieren, en su mayor parte, los permisos del usuario root.

Condiciones generales de uso Copyright - ©Editions ENI

Instalar programas Los programas que funcionan en Linux se distribuyen en diferentes formatos:  

los paquetes RPM (Red Hat Package Manager); los paquetes Debian;



los archivos comprimidos (véase capítulo Administración de la cuenta de usuario).

1. Los paquetes RPM Creado por la empresa Red Hat, RPM (Red Hat Package Manager) es una herramienta de gestión de paquetes de programas para Linux. Su distribución bajo licencia GPL ha contribuido a su notoriedad y actualmente la emplea un gran número de distribuciones de Linux, como Mandriva y SuSE. Un paquete se presenta en forma de archivo con extensión .rpm y contiene, además de los archivos de la aplicación, información general sobre el paquete, como la versión, la descripción y el script de instalación. El nombre típico de un archivo de paquete RPM es foo-1.0-1.i386.rpm. Este nombre de archivo indica el nombre del paquete (foo), la versión (1.0), el número de revisión o "release" (1) y la arquitectura (i386) para la que se ha compilado el software. Si el nombre incluye src o noarch en lugar de la arquitectura, significa que se trata respectivamente de un paquete que contiene únicamente los archivos fuente del programa o de un paquete independiente de la arquitectura. Los paquetes RPM se manejan mediante el comando rpm. Instalación Para instalar o actualizar un paquete RPM, la sintaxis utilizada es: rpm -Uvh paquete.rpm

Las opciones indican: - instalación del paquete si aún no está en el sistema o actualización en caso U contrario. modo verboso; el comando rpm muestra en salida el paquete que está -v tratando. visualizar una barra de progreso que muestra el avance de la instalación en -h curso. Por ejemplo: [root]# rpm -ivh vorbis-tools-1.4.0-5.fc18.x86_64.rpm Preparing... ########################################### [100%] Updating / installing... 1:vorbis-tools-1:1.4.0-5.fc18 #################################### [100%]

Desinstalación

La sintaxis del comando rpm para la desinstalación de paquetes es algo diferente; no hay que pasar el nombre de un archivo RPM como argumento, sino sólo el nombre del paquete que hay que borrar: rpm -e paquete

La opción -e (erase) es la que ordena al comando rpm borrar un paquete del sistema: [root]# rpm -e vorbis-tools-1.4.0-5.fc18.x86_64.rpm error: package vorbis-tools-1.4.0-5.fc18.x86_64.rpm is not installed [root]# rpm -e vorbis-tools [root]#

Los editores de las distribuciones suelen proporcionar herramientas como yum o urpmi, que permiten gestionar paquetes RPM de forma sencilla.

2. Los paquetes Debian Los paquetes Debian, utilizados por la distribución del mismo nombre, tienen la extensión.deb para los paquetes binarios y .dsc para los paquetes de fuentes. Al igual que el formato RPM, el formato Debian está bajo licencia GPL. Por consiguiente, otras distribuciones de Linux también lo usan. Además, los nombres de archivo de estos paquetes contienen también un cierto número de indicaciones. Así, un archivo llamado foo_1.0-1.deb significa que estamos ante un paquete Debian con el software foo en la versión 1.0 y que el número de revisión aportado por el desarrollador al crear el paquete es 1. La principal herramienta de manejo de archivos de Debian es dpkg. Instalación La sintaxis básica para la instalación de un paquete .deb es: dpkg -i paquete.deb

La opción -i (install) permite instalar el archivo Debian especificado como argumento: [root]# dpkg -i vim_6.1.018-1_i386.deb Selecting previously deselected package vim. (Reading database ... 53816 files and directories currently installed.) Unpacking vim (from vim_6.1.018-1_i386.deb) ... Setting up vim (6.1.018-1) ...

Desinstalación Según el efecto buscado, se usará -r (remove) para borrar el software conservando los archivos de configuración:

dpkg -r paquete

O -P (purge) para borrar todos los archivos del paquete: dpkg -P paquete

Así: [root]# ls /etc/vim/vimrc /etc/vim/vimrc [root]# dpkg -r vim (Reading database ... 54685 files and directories currently installed.) Removing vim ... dpkg - warning: while removing vim, directory `/etc/vim’ not empty so not removed. dpkg - warning: while removing vim, directory `/usr/share/doc/vim/html’ not empty so not removed. dpkg - warning: while removing vim, directory `/usr/share/doc/vim’ not empty so not removed. [root]# ls /etc/vim/vimrc /etc/vim/vimrc [root]# dpkg -P vim (Reading database ... 53821 files and directories currently installed.) Removing vim ... Purging configuration files for vim ... [root]# ls /etc/vim/vimrc ls: /etc/vim/vimrc: No such file or directory

3. Los archivos comprimidos Una gran mayoría de las aplicaciones utilizadas en Linux está bajo licencia GPL y asimiladas, por lo que los archivos fuentes de la mayor parte de los programas están disponibles en forma de archivos comprimidos. Se pueden conseguir estos archivos en webs dedicadas a las aplicaciones de Linux y en los CD-ROM que acompañan a algunas revistas de informática. Estos archivos tienen habitualmente la extensión .tar.gz o .tgz en el caso de archivos creados mediante el comando tar y comprimidos con gzip. Instalación Para instalar una aplicación distribuida en este formato, es preciso:  

descomprimir el archivo .tgz en el directorio /tmp o /usr/src previsto a tal efecto; explorar los archivos contenidos en el archivo y recuperar el archivo llamado normalmente README o INSTALL.

Los desarrolladores de estos programas se esfuerzan en indicar, en este archivo README, el proceso detallado de instalación.

Desinstalación Generalmente no hay un procedimiento de desinstalación que acompaña a las aplicaciones en forma de archivos comprimidos; la desinstalación de este software requiere un buen conocimiento del producto y de los archivos que lo acompañan para evitar dejar archivos huérfanos

Herramientas de administración Existen en Linux diversas herramientas que facilitan la administración del sistema. Éstas son adecuadas para la mayoría de tareas administrativas normales realizadas por un usuario principiante. Herramientas específicas de una aplicación Ciertas herramientas han sido desarrolladas por los autores de una aplicación y están dedicadas a ella; es el caso de la herramienta SWAT (Samba Web Administration Tool). Herramientas específicas de una distribución de Linux Los editores de una distribución desarrollan otras herramientas para permitir la configuración básica de dicha distribución en particular. Para encontrar las herramientas que acompañan a la distribución, se recomienda a quien empieza y a quien quiera administrar su sistema que lea la información indicada en la documentación y durante la instalación. Las distribuciones de Mandriva cuentan con un centro de control gráfico. Las distribuciones Red Hat y Fedora vienen con un conjunto de herramientas cuyo nombre empieza por system-config-* y a las que puede accederse mediante menús de la interfaz gráfica: [root]# cd /usr/bin [root]# ls system-config-* system-config-authentication system-config-date system-config-keyboard system-config-printer

system-config-printer-applet system-config-samba system-config-services system-config-users

La distribución Ubuntu, y en general las basadas en la interfaz GNOME, ofrece distintas herramientas de administración desde el centro de control de GNOME:

En cuanto a SuSE, sus principales herramientas de configuración del sistema se llaman yast (Yet Another System Tool) y yast2; la primera propone una interfaz de línea de comandos y la segunda, una interfaz gráfica. Veamos una captura de pantalla de yast2:

Herramientas genéricas de Linux Finalmente, existen otras herramientas genéricas, como Webmin, que no están vinculadas a una distribución o a una aplicación. Webmin propone al programador toda una serie de rutinas para el desarrollo de módulos de administración. El número de módulos desarrollados es muy alto y actualmente se puede administrar casi la totalidad de servicios de un sistema Linux con la interfaz propuesta por Webmin, es decir, mediante un navegador web:

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF