2009-07-14

ESR? te voy a dar ESR!

Como para que quede asentado, ESR también me parece un pelotudo importante, tanto o más que RMS (que al menos tiene un montón de código atrás de él, no 'solamente' fetchmail). El problema de ESR es que, si no sos como él, sos un pelotudo. O que se permite hablar de lo feo que es programar en/con/bajo Windows sin haberlo hecho en la puta vida. Y principalmente, que pretende ser el portavoz de una comunidad hacker que, definida por él, es un montón de ESR. Pero ese es tema para otro post, si no creyera que es mejor no darle importancia.

Obviamente, estoy hablando de dos personas que han escrito toneladas de código open-source de calidad, pero ahórrenme eso. Si los logros de una persona fuesen excusa, no podríamos criticar a nadie. Y sus logros no tienen gran cosa que ver con los problemas que cito.

2009-07-11

El editor de textos Vim

Este tutorial tiene varias imprecisiones, la principal es la alternancia indiscriminada entre Vi y Vim, como si fueran la misma cosa. Habré de editarlo.

El editor de textos Vi es uno de los primeros y más usados en entornos Unix. Su interfaz es legendaria por lo discreta, y puede desesperar a más de un usuario que recién lo conoce. Tal vez le de una idea de su uso el que algunos lo llamen vile (vil). Sin embargo, una vez que aprenda cómo moverse en él, su capacidad de trabajo aumentará enormemente. Su nombre, dicho sea de paso, es abreviado de Visual Interface. Sí, los hackers también gustamos de la ironía. Este programa fue creado por Bill Joy, uno de los hackers creadores de los sistemas operativos BSD, los "primos" de Linux; y luego fundador de Sun Microsystems, famosa empresa de informática.

Vim tiene un tutorial propio, para activarlo abra una consola y use el comando vim tutor. Si desea el tutorial en castellano, copie el archivo /usr/share/vim/tutor/tutor.es a su directorio personal y ábralo con el comando vim ~/tutor.es, o directamente conéctese como root, copie el archivo tutor a tutor.old (por si acaso) y renombre tutor.es como tutor antes de ejecutar el comando mencionado arriba.

La versión actual de Vi, Vim (VI iMproved, Vi Mejorado) tiene dos interfazs, una en modo texto puro (abierta con el comando vi) y otra gráfica, con botones para acciones como abrir, guardar, copiar, etc. (abierta con el comando gvim). Una diferencia fundamental es que, al menos en nuestro caso, la teclas Fin e Inicio no funcionan en la versión de texto puro.

El tutorial le enseñará a moverse por vi en unos 25 o 30 minutos. Nosotros intentaremos darle algunos consejos y trucos básicos sobre el programa para despertar su interés. Por otra parte, si necesita más ayuda, ejecute dentro de vi el comando :help para ver el menú de ayuda.

Uso básico de Vim

Cree con Vi un archivo de texto nuevo desde una consola con el comando vim archivonuevo. Verá una serie de tildes (que indican que esas líneas no contienen nada), y debajo en la última línea, el nombre de archivo y su extensión en líneas y carácteres. Esa última línea sirve para introducir comandos. Aquí ha llegado el momento de explicar algo básico de Vi: hay dos "modos de trabajo" (totalmente separados de si la interfaz es gráfica o no). En el "modo de inserción" (Insert mode) usted puede escribir texto en el archivo. En el "modo normal" (Normal mode) usted puede ejecutar comandos y funciones sobre el texto. Al abrir Vi el modo por defecto es el normal, por lo que lo que escriba se verá en la línea de abajo y se tomará como comandos. Para entrar al modo edición, use la tecla i o Insert (Pulsar Insert otra vez activa "sobreescribir", tenga cuidado). Para salir del modo de inserción pulse Esc.

Inserción de texto

Pulse i entonces, y escriba algunas líneas de texto. Note que en Vi una línea es lo que está delimitado por retornos de carro (pulsaciones de la tecla Enter), no lo que se vea en una línea en la pantalla. Lo notará en Gvim pulsando Fin para desplazarse. Al terminar o cansarse, pulse Esc para volver al modo normal.

Moviéndose y pulsando teclas en modo normal, notará a veces que no sólo la tecla i lo lleva al modo inserción. Entre otras, la tecla a abre la inserción, pero moviendo el cursor un espacio. La tecla o abre una nueva línea debajo del cursor.

Moviéndonos por el texto

Ahora que ha escrito algunas líneas, veamos cómo mover el cursor para editar. Aunque las teclas del cursor funcionan perfectamente, la mejor solución (especialmente si sabe tipear con los 10 dedos) es usar el modo normal y las teclas h, j, k, l (respectivamente Izquierda, Abajo, Arriba, Derecha). Esto puede parecer ridículo, pero están justo al alcance de su mano derecha en la posición normal de tipeo. Muévase por el texto e inserte algo más de texto.

Además de ese movimiento simple, usted puede usar el comando w para desplazarse de una palabra a la siguiente, o b para ir a la anterior. Pero pongamos que usted quiere moverse a una línea determinada dentro del archivo: puede hacerlo con el comando G y el número de la línea, de este modo: 104G lo llevará a la línea de texto 104, si existe. G a secas lo lleva al final del archivo. Para volver al principio, use gg.

Borrar, cortar, copiar y pegar

Para borrar letras en modo normal, use la tecla x (puede por supuesto borrar con Backspace y Supr en modo inserción, pero aquí hablamos de comandos. Puede también borrar una palabra completa con d o desde la posición del cursor hasta el fin de una palabra con dw. Para borrar toda una línea, use dd.

¿Qué pasa si queremos borrar varias líneas? La solución: lleve el cursor a la primera línea, y escriba el número de líneas a borrar antes de escribir dd. Por ejemplo, 11dd borrará 11 líneas hacia abajo, incluyendo la del cursor. Use un número para repetir una acción esa cantidad de veces. 12u deshace los últimos doce cambios, por ejemplo. 10j mueve el cursor 10 líneas hacia abajo.

En realidad, lo que el comando d hace es cortar el texto y ponerlo en un registro. Si ha usado Office XP, recordará que tenía varios (12 si la memoria no nos falla) portapapeles disponibles, en los que almacenar datos para copiar y pegar. Vim hace esto desde hace mucho tiempo, y dispone de más registros: como mínimo, las letras del alfabeto inglés (evite usar la ñ o la ç para esto. O mejor, pruebe). Como decíamos, las operaciones con d equivalen a cortar texto. Es posible también copiar texto, y se hace de la misma manera pero con la tecla y (de yank, "tirar"). Esto copia el texto seleccionado a un registro. Para pegar texto, se usa el comando p.

Ahora que hemos visto cómo cortar, copiar y pegar, introduciremos un tema muy agradable: el modo visual. Usando el comando v puede usar el cursor para seleccionar texto. Simplemente mueva el cursor hasta abarcar todo el texto que quiera, y pulse d o y. Esto también lo sacará del modo visual.

Ahora que hemos visto los conceptos de modo visual y de corte y copia, veamos esos registros de los que hablábamos. Para ser estrictos, los registros no sólo abarcan las letras del alfabeto. Sin embargo, los símbolos y números que pueden usarse como registros tienen fines especiales, que le dejaremos descubrir (ejecute :help reg). Para activar un registro determinado, ejecute "letra. Por ejemplo, "a activa el registro a. Para ver todos los registros ocupados ejecute :reg.

Vimos que puede activar un registro con "letra. Si usa las mayúsculas, el texto que copie o corte se agregará al registro sin sobreescribir lo que había. Ejemplo: si usa "A, el texto que luego corte se agregará al registro a. Si este registro contenía algo, ahora tendrá eso y lo que agregue luego.

Usted puede llamar a un registro antes de copiar, cortar o pegar. El último registro activado permanece, por lo que no debe llamarlo para cortar y luego para pegar; con una vez basta.

Deshacer y Rehacer

Para deshacer una acción (por ejemplo, si fue demasiado lejos usando dd) puede usar el comando u (por undo, deshacer). Obtendrá el mismo efecto usando :undo, pero u es más rápida de escribir. Para rehacer lo deshecho, use la combinación Control + R. Una cosa más: usted puede usar U (en mayúsculas, sí) para deshacer todos los cambios hechos en una línea determinada.

Guardar datos a archivo y salir

Todavía no le hemos dicho cómo salir y guardar datos, algo esencial. Si abrió el archivo como dijimos (vim nombredearchivo en una consola), la solución es el comando ZZ, que cierra Vim y guarda el archivo. Pero si abrió Vim a secas y empezó a escribir texto en un archivo sin nombre, la última línea le protestará "No hay un nombre de fichero". Use entonces :wq archivo (write, quit; escribir, salir) para guardar los datos y salir (obviamente, también puede usar los comandos por separado). Este es otro concepto de Vi: muchos de los comandos se ingresan con dos puntos antes. Note que podría también escribir :write quit archivo para dar la misma orden de manera más legible, pero tomaría más tiempo. Por otro lado, podría usar esta opción para "salvar como...", guardando en otro archivo.

Como ve, cuando está tipeando un simple :w en modo normal guarda sus datos. Si no quiere guardar lo editado (por ejemplo, cuando abre archivos de sistema y no quiere alterar nada) puede salir sin guardar con el comando :q!. El signo de exclamación en un comando permite aplicarlo sin importar que hayan cambios que guardar. Otra posibilidad es usar :e! para volver a abrir el mismo archivo (u otro, si lo especifica luego) desde la última vez que lo guardó. De nuevo: :e! vuelve a cargar la última versión guardada del archivo que tenemos abierto; :e! otroarchivo abre "otroarchivo" (puede ser un archivo nuevo) y descarta todo cambio que hayamos hecho en el archivo actual.

Impresión de textos

Para imprimir un archivo (suponiendo que el sistema de impresión funciona bien) el comando :ha (o :hardcopy) copia el texto del archivo a un archivo temporario Postscript y lo envía a la impresora (Postscript es una tecnología de impresión popular en diseño gráfico). Puede redirigir la salida del comando a un archivo postscript, como si esto fuese el shell: :ha > archivo.ps. Ahora puede abrir ese archivo con Ghostview o KGhostview (o Evince, o GPDF, como prefiera). También puede usar el programa de consola ps2pdf para convertirlo a pdf y distribuirlo: ps2pdf archivo.ps archivo.pdf.

Pueden también imprimirse un número arbitrario de líneas (desde el comienzo del archivo) agregando ese número antes de ha, como ejemplo: :24ha imprime 24 líneas del archivo abierto.

Búsqueda de texto

Una de las funciones más importantes para un programador o un administrador de un sistema Linux, en Vim se hace con el comando /. Por ejemplo:

/rogelio

buscará la palabra "rogelio" entre el cursor y el final del archivo. Si la encontró, y quiere ver otras apariciones, pulse n (next, siguiente). Para buscar entre el cursor y el principio del documento, use ? y luego n:

?rogelio

busca la primera aparición de esa palabra antes del cursor; n busca la anterior a esa, etc. Como puede que el nombre esté en mayúsculas (Rogelio), puede usar :set ignorecase para que las búsquedas no hagan distinción entre mayúsculas y minúsculas, o :set noignorecase para el comportamiento normal. Por último, pongamos que usted está ante la palabra variabledenombrelargo y quiere buscar la siguiente aparición de esa palabra en el texto. Para evitar errores de tipeo, ponga el cursor encima de alguna letra de esa palabra, y use el comando *, que toma la palabra bajo el cursor como patrón de búsqueda.

Con esto usted puede editar perfectamente archivos de configuración. Lo sabemos, porque hasta hace poco, era nuestra única experiencia con Vi y eso nunca nos impidió tener un sistema perfectamente funcionante. Sin embargo, seguiremos con algunos otros conceptos para darle una mejor visión de lo que el editor puede hacer.

Uso intermedio de Vim

Configuración de Vim

Puede configurar vi "al vuelo" con el comando :set opción, o guardar los cambios que quiera editando el archivo ~/.vimrc y escribiendo en él set opción. Un ejemplo: abra un archivo con Vim y ejecute el comando :set number. Eso activa la numeración de líneas, algo muy útil para un programador. Hay montones de opciones posibles, algunas de ellas ya activadas en el programa, otras que puede agregar usted. Como precaución, haga una copia del archivo de configuración: dentro de vim, ejecute lo siguiente:

:e ~/.vimrc

para abrir el archivo,

:w ~/.vimrc-back

para guardarlo con otro nombre, y finalmente

:e ~/.vimrc

para poder, ahora sí, editar con confianza. En caso de errores, use el comando cp ~/.vimrc-back ~/.vimrc para recuperar el archivo original.

En general, cualquier comando con dos puntos que sirva para cambiar el comportamiento de vi debería poder aplicarse en el archivo de configuración simplemente quitándole los dos puntos. El archivo de ayuda de vi (obtenible con el comando :help) tiene bastante información sobre las opciones disponibles.

Búsquedas avanzadas

Ya vimos la manera más básica de hacer búsquedas, simplemente con / y ?. Ahora veamos algunos trucos más.

Supongamos que usted quiere buscar la palabra "cien", pero no las palabras "ciento" o "ciencia". Para hacer la distinción, la búsqueda debe ser: /cien\>. Ese \> quiere decir "aquí termina la palabra que busco". Del mismo modo, podemos delimitar la búsqueda para evitar "conciencia" usando /\<cien\>.

Lo que veremos a continuación no es exclusivo de Vim. Las expresiones regulares son una de las herramientas más importantes en muchos lenguajes de programación, y están disponibles en el shell Bash, en Vim, en otros editores de texto... Una expresión regular es una manera de expresar un patrón de búsqueda. El comando "buscar una cadena de texto que comience con la frase foo y termine con la frase bar" es una expresión regular, o por lo menos podría expresarse con una. En realidad, cualquiera de las búsquedas anteriores usa expresiones regulares (aunque las más simples).

Veamos primero los casos simples: una palabra al principio de una línea puede buscarse con /^palabra, donde el ^ indica "comienzo de la línea". Así mismo, /palabra$ buscamos "palabra" al final de una línea.

El punto equivale al comodín ? del shell: es un reemplazo por cualquier carácter: buscar la expresión r.ma encontraría tanto rama como rema, rima, etc. Incluso encontraría r ma. Ahora, puede ocurrírsele "¿Qué pasa si quiero buscar una frase que contenga un punto?" Bueno, la manera de que se busque un punto (o algún otro caracter, como $ o ^, que forman parte de expresiones y tienen significado aparte, es "desreferenciarlos" con una barra inversa (el caracter \) antes: la expresión /\.com buscará específicamente la frase ".com".

Las expresiones regulares son un tema enorme, y merecen verse aparte. Usar Google puede devolverle varios tutoriales buenos para empaparse más en el tema. El mismo Vi dispone, en la ayuda, de una sección dedicada al manejo de esta poderosa herramienta.

Edición de múltiples archivos a la vez

Dentro de Vim es posible abrir varios archivos y editarlos "a la vez". Para abrir dos archivos en ventanas de buffer distintas, debe usar el comando :split.

Supongamos que editamos el archivo rogelio.txt. Supongamos que de pronto necesitamos agregar algún dato a este archivo, un dato que está en backup.txt. Puede abrir ese archivo en otra ventana de vim con el comando :split backup.txt. También puede abrir una subventana con un archivo nuevo vacío, con el comando :new. Ahora podrá ver ambos archivos y copiar texto de uno a otro. Para moverse de un archivo al otro, puede usar Control + w, w (es decir, primero la combinación Control + w y luego w). Puede cerrar una ventana grabando los datos y usando :close o Control + w, c, o cerrar todas las ventanas excepto la actual con el comando :only (todos los otros archivos deberán estar guardados, si no, use :only! o :wonly).

Puede ver que una de las ventanas es de mayor tamaño que la otra. Para cambiar el tamaño de una ventana, use Control + w y luego + o -.

Por último, si prefiere ventanas verticales, puede usar los comandos :vsplit y :vnew. Abajo mostramos una imagen de Vim editando dos archivos a la vez en ventanas horizontales:

Por supuesto, puede abrir la cantidad de ventanas que quiera, pero el texto se hará más difícil de leer.

Además de la comodidad visual de tener dos archivos presentes a la vez, Vim permite tener múltiples archivos abiertos, viendo uno solo por vez. Puede abrirlos directamente desde la línea de comandos, escribiendo vi archivo archivo2 archivo3 o desde Vi, con el comando :hide edit archivo2, lo que oculta el primer archivo. Para abrir varios archivos a la vez, use el comando :args archivo2 archivo3 para abrir otros archivos (esto cierra el archivo abierto).

Una vez que tenga varios archivos abiertos y ocultos, se estará preguntando cómo pasar de uno a otro. Es posible moverse entre los archivos con el comando :next (:wnext para guardar los cambios o :next! para pasar sin guardar) para ir al archivo siguiente, o :previous para ir al archivo anterior. Puede también saltar entre dos archivos con la combinación Control + ^, pero en teclados españoles esto requiere usar la tecla Shift para poder escribir ^, y es prácticamente imposible.

Con esto damos por terminado nuestro tutorial de Vi. Esperamos que le interesen las demás posibilidades de este excelente programa, y le recomendamos que pasee por la ayuda para aprender muchísimo más. En particular, debería visitar el capítulo 10 para aprender a hacer búsqueda y reemplazo, el capítulo 27 para aprender sobre búsquedas y expresiones regulares, y el tutorial si quiere practicar.

Ahora que sabe editar archivos, no tendrá problemas para ver y modificar los archivos de configuración.

Administración de usuarios y permisos en Linux

Apenas comience a usar Linux "seriamente", o al menos, apenas empiece a curiosear por el sistema, una de las ganas o curiosidades que tendrá será de agregar nuevos usuarios. Es cierto que la mayoría de las distribuciones pensadas para uso masivo

Los programas principales a conocer son useradd, userdel, passwd, chmod y chown. Pero además veremos algunos archivos de configuración importantes, entre ellos /etc/groups, /etc/passwd y otros.

Agregar usuarios

Para agregar un usuario nuevo deberá usar el comando useradd. La sintaxis es simple, aunque permite algunas opciones interesantes si está trabajando en una red.

useradd rogelio

agrega al usuario rogelio y crea su directorio personal, /home/rogelio.

useradd -c "Rogelio Feliz" rogelio

crea al usuario rogelio con un comentario, "Rogelio Feliz" (el comentario es generalmente usado para guardar el nombre completo). Ahora que el usuario existe, debemos darle un password (sí, es esencial darle un password). Esto se hace con el comando passwd.

passwd roger

Deberá escribir un password (preferentemente seguro) para el usuario, y repetirlo para evitar errores. No verá el password que está escribiendo por motivos de seguridad. Note que puede cambiar su password personal (si es el usuario root, el de cualquier usuario) usando el comando passwd.

Otra posibilidad es usar (si su distribución lo incluye) el comando useradd, que en un solo paso crea el usuario, le pide el password a asignar, crea el directorio home, y agrega otros datos. El correspondiente comando para borrar usuarios (que por cierto no borra el directorio home del usuario eliminado) es deluser.

Una vez creado el usuario y su password, veamos el archivo que controla las posibilidades de ese usuario:

El archivo /etc/passwd

Este archivo guarda mucha de la información esencial de los usuarios. Su estructura es de frases separadas por el símbolo ":". Cada línea se ve como éstas:

nombre:password:UID:GID:comentario:home:shell
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/sh
rogelio:x:503:505:Rogelio Feliz:/home/rogelio:/bin/bash

La primera línea es un agregado nuestro para mostrar el significado de cada grupo. Note tres cosas: el password es representado por una x. Esto es porque el sistema de seguridad guarda los passwords encriptados dentro del archivo /etc/shadow. De esta manera, obtener un password de usuario es mucho más difícil. Además, cada usuario tiene dos números que lo distinguen: su UID o User IDentification, un número que identifica al usuario inequívocamente) y su GID o Group IDentification, el identificador de grupo. La UID distingue a un usuario en una red: dos usuarios en dos PCs distintas pueden llamarse "rogelio", pero sólo si su UID es la misma (por ejemplo, 501) podrán compartir datos fácilmente. Las UID de usuarios parten desde 500; las inferiores se reservan para procesos y servicios particulares. Veremos esto más abajo. La GID es lo que identifica al grupo del usuario (normalmente, el grupo tiene el mismo nombre que el usuario), y tiene características parecidas.

Veamos una línea del contenido del archivo de passwords, /etc/shadow (deberá abrirlo con el usuario root):

rogelio:$1$sIQg6Ctl$k46yZEWYHC6631Ymf.HQh0:12320:0:99999:7:::

Como vemos, este archivo también tiene secciones separadas por ":". Tenemos el login; el password encriptado; los días (desde una fecha estándard, 12320 días) en que el password no ha cambiado; los días antes de que el password pueda cambiarse (0); el tiempo en días luego del cual hay que cambiar el password (99999, infinito); los días de advertencia para cambiar el password (7); los días luego de la expiración antes de deshabilitar la cuenta (0); los días desde una fecha estándar que la cuenta ha estado deshabilitada (0) y un campo reservado.

Antes de seguir, debemos decir que la manera de eliminar un usuario es usar el comando userdel, que acepta la opción -r para eliminar todos sus archivos y directorios.

Grupos

En Linux y Unix, podemos tener tres posibilidades por defecto (después, root puede hacer absolutamente lo que quiera) respecto a grupos y archivos:

  1. Ser el dueño de un archivo. Podemos hacer lo que queramos con él
  2. Pertenecer al grupo del dueño: podemos hacer lo que el dueño quiera, pero no editar los permisos y grupos del archivo.
  3. No pertenecer al grupo: igual que arriba, pero en general con aún menos permisos que los usuarios pertenecientes al grupo.

Los grupos se administran mediante el archivo /etc/group. Para entender más, veamos unas líneas de ejemplo:

rogelio:x:505:
floppy:x:19:rogelio,marcos

Como ve, la línea se divide en cuatro partes: grupo:password:GID:usuarios en el grupo (separados por comas). Los passwords también están referidos al archivo shadow. Para agregar un usuario a un grupo, simplemente escríbalo al final de la línea. Es recomendable no agregar un usuario a un grupo a menos que sea indispensable. El que un usuario esté en demasiados grupos puede plantear problemas de seguridad.

Cambiar dueño y grupo

El comando chown permite cambiar el dueño y grupo de un archivo o grupo de ellos. Su uso es bastante simple:

chown -Rc rogelio:rogelio archivos

cambia recursivamente el dueño y grupo de los archivos definidos a rogelio y rogelio respectivamente. Note que deberá usar el usuario root para poder cambiar el dueño de un archivo.

Permisos

Hemos visto ya el significado de los conceptos "ID de usuario" e "ID de grupo", además de las divisiones entre dueño, grupo y otros usuarios. Ahora veamos cómo afectan estos conceptos nuestra vida cotidiana en Linux.
Cada archivo creado en el sistema tiene un dueño y un grupo. En su mayor parte, el dueño es el usuario root, y el grupo es el del usuario root. Un ejemplo: los archivos del directorio /usr/bin tienen como dueño y grupo a root. Pero además, todos los archivos tienen distintos permisos de uso. Todos los usuarios del sistema pueden leer los archivos en /usr/bin y ejecutarlos gracias a los permisos determinados para ellos, que sólo el dueño puede cambiar. Si usted guarda sus documentos personales en el directorio ~/Documentos, el dueño y grupo serán los suyos. Los demás usuarios podrán leer los archivos y (tal vez) ejecutarlos, pero no podrán modificarlos. Para cambiar esto, veamos qué permisos puede tener un archivo.

En Unix, cualquier archivo tiene tres tipos principales de permiso: permiso de lectura, permiso de escritura, y permiso de ejecución. Cada uno de ellos debe definirse como "sí" o "no" para el dueño, el grupo y los demás usuarios. Esto se puede hacer mediante el comando chmod. Chmod tiene una sintaxis compleja, y vamos a dividirla en partes.
Chmod, como los demás comandos, acepta opciones. Por eso, la sintaxis simplificada sería
chmod opciones modo archivos

Entre las opciones, las esenciales son sin duda -R (recursivo, abarca también a archivos dentro de subdirectorios), y -c (verboso, pero sólo informa sobre los archivos que cambian sus permisos). Veamos ahora los modos de uso.

Los modos de chmod se dividen en tres partes: los usuarios afectados, el cambio realizado y el permiso afectado:

  1. Los usuarios se describen según las letras u (dueño), g (grupo), o (otros, todos los usuarios que no pertenecen al grupo) y a (all, todos: dueño, grupo, y otros).
  2. El cambio realizado se expresa con + (activar), - (desactivar) o = (reemplazar los anteriores por los que estamos seleccionando ahora).
  3. Por último, el permiso a cambiar (estamos simplificando un poco) puede ser de lectura (r, read), escritura (w, write), o ejecución (x, execution).
Así, un posible uso de chmod es el de hacer ejecutable un archivo (por ejemplo un script de shell que acabamos de escribir): chmod u+x script.sh:

[rogelio@Edhellond rogelio]$ ls
bin/  script.sh  docs/  tmp/
[rogelio@Edhellond rogelio]$ chmod -c u+x borrados.log
el modo de `borrados.log' cambia a 0744 (rwxr--r--)
[rogelio@Edhellond rogelio]$

Puede además establecer permisos para varios usuarios a la vez separando con comas los modos:

[rogelio@Edhellond rogelio]$ chmod -c u+rwx,go=rx archivo
el modo de `borrados.log' cambia a 0755 (rwxr-xr-x)
[rogelio@Edhellond rogelio]$

Como ve, primero cambiamos los permisos del dueño (u +rwx), luego los del grupo y de otros (go =rw).

Usted puede querer usar en ocasiones la opción -R (recursivo) para cambiar los permisos de un montón de archivos a la vez. El ejemplo mejor es cuando copie archivos desde un CD grabado en Windows a un directorio: ¡todos los archivos están marcados como ejecutables! (Windows no tiene una estructura de permisos). La opción obvia sería chmod -Rc a-x * (cambiar todos los archivos en este directorio y sus subdirectorios eliminando el permiso de ejecución), pero hay un problema: esto también afecta a los directorios, y los directorios deben tener permiso de ejecución para poder ver lo que contienen. debemos entonces discriminar y usar chmod sólo sobre los archivos comunes. Para esto usaremos un pseudo script. El comando find debería hacer lo que queremos, y la manera es ésta:

find . -type f -exec chmod -c a-x {} \;

Podría grabar esto como un script y llamarlo "unwinder" o algo así. esto significa, más o menos: buscar en este directorio todo lo que sea un archivo y ejecutar el comando chmod para quitar los permisos de ejecución. La otra posibilidad es usar

chmod -Rc a-x ./*

a secas y luego agregar permiso de ejecución a los directorios a mano, con

chmod -c a+x directorio

uno por uno.

chmod también tiene un modo numérico. Dado que los permisos r, w y x pueden expresarse por números en notación octal (r=4, w=2, x=1), es posible usar chmod como vimos en el tutorial de scripts:

chmod 755 archivo

es otra manera de decir

chmod u+rwx,go+rx archivo

Entendamos un poco más: al decir chmod 755 estoy diciendo "para el dueño, aplicar permisos de lectura (4), escritura (2) y ejecución (1) que suman 7 (4+2+1). Para los otros dos (grupo y otros) aplicar lectura y ejecución solamente (4+1)."

Un error común al trabajar con chmod y chown es ejecutar chown después de chmod. chown altera los permisos, por lo que siempre debería primero cambiar el dueño y grupo de un archivo, y luego definir los permisos.

Políticas de permisos

No es una buena idea alterar permisos de archivos así porque sí. Particularmente, no debería cambiar permisos de dispositivos (directorio /dev). Los permisos y usuarios son una parte integral de la estructura de seguridad de una distribución, y en general hay otros pasos que pueden dar el mismo efecto.

Use con cuidado chmod, preferentemente en su directorio personal y sus archivos. Una buena idea si realmente le interesa la privacidad es ocultar el contenido de su directorio a los demás usuarios: eso se hace con el comando

chmod o-rx $HOME

Ahora ningún otro usuario salvo root podrá ver el contenido de su directorio personal.

Si le interesa el tema, consulte el uso de los comandos y archivos con man.

Reduciendo el tipeo de comandos: uso de áliases y de scripts

En todos los tutoriales hemos hablado de comandos de consola, comandos que muchas veces son bastante largos de tipear y recordar, especialmente si empezamos a agregar opciones a cada uno. Para solucionar esto, lo más efectivo es el uso de áliases o scripts. Un alias (plural áliases, creemos) es un "acceso directo" de consola. Se definen en un archivo determinado, y al escribirlos reemplazan su nombre por el comando especificado. Un script es un archivo ejecutable, escrito en lenguaje de shell (Bash es también, además de un shell, un lenguaje en el que programar), que contiene comandos y estructuras. Los scripts pueden ser tan simples como una sucesión de comandos, o tan complejos como se quiera. Veremos primero los aliases para dar una introducción.

Aliases de shell

La manera más simple de crear un alias (y la más inútil) es usar el comando alias:

alias list="ls -la"

hace que, desde ese momento, ejecutar list nos devuelva el resultado de ls -la. Desgraciadamente, apenas cierre su terminal el alias se perderá. Esto puede servir para testear un alias rápidamente, sin hacer cambios "definitivos". Para hacer esto permanente, tendrá que editar su archivo de preferencias del shell, ~/.bashrc.

Como lo mejor es siempre la práctica, vamos a crear un alias y ver qué podemos hacer con él. Abra con un editor de texto el archivo .bashrc de su directorio personal (/home/su_usuario/, por si no lo recuerda) y baje hasta la última línea. Este archivo en nuestro caso se ve de la siguiente manera, y contiene, como podrá ver, varios áliases:

# .bashrc

# User specific aliases and functions

alias daleclick="/usr/sbin/pppd call daleclick"
alias desconecta="killall pppd"
alias claws="/usr/local/bin/athlon-sylpheed"

# Source global definitions

if [ -f /etc/bashrc ]; then
 . /etc/bashrc
fi

Como ve, para crear un alias se debe escribir alias nombre="comando" o alias nombre='comando'. El uso de comillas simples o dobles depende de si en el comando debe usar comillas dobles o simples respectivamente (para decirlo de manera simple, consulte info bash para más datos sobre los áliases)

En este ejemplo, crearemos un alias para poder abrir rápidamente una consola aterm con Midnight Commander desde otra. Esto requiere, obviamente, que haya instalado los paquetes aterm y mc. Además, deberá estar corriendo un administrador de ventanas para usar el alias.

El comando entonces será alias consola="/usr/bin/aterm -tr -trsb -sh 40 -fg grey -e '/usr/bin/mc'"
Después de guardar el archivo, simplemente ejecute el comando bash para cargar las actualizaciones que acaba de hacer. Ahora puede ejecutar el alias consola.

Scripts de Bash

En principio, un script de shell puede hacer el mismo trabajo de un alias: simplemente cree en su directorio personal un subdirectorio llamdo bin, y en él guarde, por ejemplo, el archivo siguiente:

#!/bin/bash
/usr/bin/aterm -tr -trsb -sh 40 -fg grey -e '/usr/bin/mc'

llame al archivo consola.bash y ejecute el comando chmod -766 consola.bash (esto suponiendo que se encuentre en el directorio bin, de otro modo, escriba la ruta al archivo). Ahora podrá ejecutar el comando consola del mismo modo que si fuese un alias.

Por supuesto, usar scripts sólo como accesos directos es perderse el 99% de sus posibilidades. Para aprovechar realmente la capacidad del shell debería aprender a programar en él, consultando el manual y algún sitio sobre programación para principiantes. BASH permite el uso y creación de variables de distintos tipos, dispone de lazos y condicionales, y en resumen es un buen acercamiento a la programación. Digamos que aprender BASH u otro de los numerosos shells disponibles es lo que debe hacer para avanszar en GNU/Linux después de aprender a escribir código HTML a mano.

Para no dejarlo con las ganas (un tutorial de programación completo está más allá del alcance de este tutorial) veremos algunos scripts simples.

Scripting básico

Cree con un editor de texto un archivo llamado script1.sh. La extensión .sh no es necesaria, pero ayuda a ver que el archivo es un script de shell. Guarde el archivo en el directorio /home/su_usuario/bin/ (si el directorio no existe, créelo). Ahora escriba en él lo siguiente:

#!/bin/bash
echo "Adiós, Mundo!"
exit

Cierre el archivo y ejecute el siguiente comando:

chmod 0755 ~/bin/script1.sh

Eso cambia los permisos del archivo y lo hace ejecutable por el dueño (su usuario). Ahora ejecútelo simplemente escribiendo script1.sh en la línea de comandos. Verá lo siguiente:

[rogelio@Edhellond bin]$ script1.sh 
Adios, Mundo!
[rogelio@Edhellond bin]$

Paremos ahora un momento. Veamos los pasos a cumplir para tener un script funcionante:

  1. Escribir el archivo con un editor de textos y guardarlo (preferentemente en un directorio de ejecutables, como /usr/local/bin/, o ~/bin/
  2. Cambiar los permisos del script a ejecutable con chmod 0755 script
  3. Correr el programa
  4. Corregirlo si hace falta (no hay que repetir todos los pasos) y volver a correrlo

En realidad, la única diferencia si no guarda el archivo en un directorio de ejecutables (uno que esté en su path) es que deberá escribir la ruta completa al archivo para ejecutarlo. Es por eso que todos los scripts configure de los paquetes para compilar deben ejecutarse con ./configure: le estamos diciendo al shell "ejecutá el archivo que está en este directorio, no otro".

Ahora que sabemos a grandes rasgos cómo crear un script "por fuera", veamos lo que debe contener.

La primera línea del script que hemos visto es #!/bin/bash, y le dice al shell que el script debe interpretarse con el ejecutable /bin/bash por más que el shell usado sea otro (hay al menos otros 6 shells bastante populares, entre ellos ksh, ash y el propio sh). Recuerde agregar esa línea en sus scripts.

Debajo de esa línea, vemos un comando, echo. El comando echo repite en la pantalla (o en otro destino si es redireccionado) lo que lleva como argumento. En este caso, el script escribe "Adios, Mundo!", y termina (eso hace el comando exit). Note que, por ahora, nos abstuvimos de usar acentos o símbolos como ¡ que no forman parte del código ASCII simple de caracteres. Pruebe en su shell si el usar acentos no es problema.

Veamos ahora algo más interesante. El siguiente script le pregunta su nombre, lo escribe con un saludo y escribe la fecha y hora:

#!/bin/bash
# Creamos dos variables a usar más tarde.
Fecha=`date +%A`
Hora=`date +%T`
# Ahora empezamos a usar comandos.
echo "¡Hola!"
echo "¿Cuál es su nombre?"
echo "Por favor escríbalo y presione Enter"
read Nombre
# Aquí usamos las variables obtenidas
echo "¡Hola $Nombre,"
echo "es $Fecha y son las $Hora."
echo "Bienvenido a $HOSTNAME!"
exit

Veamos un poco. Para empezar, aparte de la primera línea, cualquier otra que empiece con un numeral (#) es un comentario. Los comentarios no son interpretados por el shell, sirven para que usted sepa lo que el script está haciendo.
Luego de los comentarios, vemos dos variables, llamadas Fecha y Hora. Es importante que escriba las líneas sin dejar espacios: Fecha = `date +%A` no funcionará. Así mismo, debe escribir los comandos a interpretar entre acentos graves. Hay tres símbolos importantes: las comillas ", los apóstrofes o comillas simples ' y los acentos graves `. Cada uno sirve para propósitos distintos: los acentos marcan que lo que contienen debe ejecutarse y el resultado tomarse como valor.
Además, vemos el comando read, que sirve para tomar texto de la pantalla (entre otras cosas). Aquí, usamos la variable Nombre para guardar lo que escribimos a read.
Al final, usamos un echo para unir todo. Note cómo usamos las variables: para usar el valor que una variable contiene, la escribimos con un signo $ delante. La variable $HOSTNAME es una variable de sistema que contiene el nombre que su PC recibe, y por eso no debimos crearla al principio del script.
El resultado de ejecutar el script es el que sigue:

[rogelio@Edhellond bin]$ script2.sh 
¡Hola!
¿Cuál es su nombre? Por favor 
escríbalo y presione Enter
Rogelio Feliz
¡Hola Rogelio Feliz,
es miércoles y son las 16:36:21.
Bienvenido a Edhellond.TierraMedia.Arda!
[rogelio@Edhellond bin]$

Uso de scripts de limpieza

Con lo que hemos explicado, y algún conocimiento de comandos extra, ya puede empezar a hacer scripts simples de mantenimiento. Por ejemplo, podríamos hacer un script que borre los archivos terminados en tilde (archivos de respaldo creados por editores de texto) en el directorio actual y sus subdirectorios:

#!/bin/bash 
echo "Este script borra todo archivo de respaldo
echo "del directorio actual y sus subdirectorios,"
echo "pidiéndole confirmación."
# Podríamos quitar la opción -i,
# pero es algo peligroso para el primer intento.
# Cuando note que funciona bien, puede eliminar 
# la confirmación de borrado.
rm ~/*~ -riv
rm ./.*~ -riv
echo "Operación terminada"
exit

Y el resultado de ejecutar script3.sh (sí, es un nombre inspirado) es:

[rogelio@Edhellond rogelio]$ script3.sh
Este script borra todos los archivos de respaldo
del directorio actual y sus subdirectorios,
pidiéndole confirmación.
rm: no se puede efectuar `lstat' sobre `./*~': No such file or directory
rm: ¿borrar el fichero regular `./.xinitrc~'? (s/n) s
`./.xinitrc~' borrado
Operación terminada
[rogelio@Edhellond rogelio]

Note que nos avisa que no existen archivos de respaldo "normales" en el directorio. Después, la segunda pasada borra los archivos ocultos de respaldo. Por supuesto, hay maneras bastante más eficientes de hacer esto, pero se las dejamos "como ejercicio".

Sabemos que esto no es más que la punta del iceberg. Esperamos que las posibilidades que le dejamos ver le den la curiosidad para aprender más. En la web debería poder encontrar montones de recursos sobre creación de scripts, empezando por manuales de uso de Linux, y llegando a tomos dedicados exclusivamente al shell.

Ksysv e Init - Configuración avanzada del arranque

En Linux, es posible configurar detalladamente el arranque. El programa que nos interesa es init, se ubica en el directorio /sbin, y sus archivos de configuración (en el caso de Mandriva Linux) en los subdirectorios de /etc/rc.d. Para la distribución Debian GNU/Linux y distribuciones basadas en Debian como UbuntuLinux, estos archivos se encuentran en el directorio /etc/init.d y sus subdirectorios. Por lo demás, la estructura de directorios será semejante.

El contenido del directorio /etc/rc.d es éste:

[rogelio@Edhellond rogelio]$ ls /etc/rc.d
init.d/  rc0.d/  rc2.d/  rc4.d/  rc6.d/     rc.modules*
rc*      rc1.d/  rc3.d/  rc5.d/  rc.local*  rc.sysinit*
[rogelio@Edhellond rogelio]$

init.d/ contiene una serie de scripts de servicios, o daemons, cosas que deben mantenerse funcionando. Los programas que se ejecutan una sola vez no van aquí, sino que deberían incluirse como líneas en el archivo /etc/rc.local

Cuando su máquina arranca, lo que pasa es, entonces:

  • El cargador de arranque arranca, y llama al núcleo.
  • El núcleo busca en diversos lugares (/etc/, /sbin/, etc.) y ejecuta el primero que encuentra.
  • init ahora ejecuta /etc/rc.d/rc.sysinit
  • rc.sysinit ejecuta su contenido, y luego ejecuta rc.serial si éste existe.
  • init ahora ejecuta el archivo /etc/rc.d/rc.local
  • init ejecuta todos los scripts para el nivel de ejecución actual.

El nivel de ejecución puede editarse en el archivo /etc/inittab . En él verá varias líneas comentadas (es decir, que no se ejecutan) y luego la importante: algo como

id:3:initdefault:

donde el nivel de ejecución, en nuestro caso, es 3, y en su máquina es posible que sea 5. Veamos todos:

  • El nivel 0 es el que el sistema usa para apagarse. Consiste en las órdenes killall y halt .
  • 1 es el nivel de ejecución linux single. Es el modo de usuario único, y le permite reparar su máquina ante algunos fallos graves, como olvidar el password de root, o corregir una metida de pata en el contenido de /etc/inittab Si, por ejemplo, se confunde y hace que el nivel de ejecución por defecto sea "Apagar", inicie la máquina con el comando linux single en el cargador de arranque y edite el archivo a algo razonable como 3 o 5.
  • 2 es el nivel multiusuario en modo texto, sin soporte para redes.
  • 3 es el nivel multiusuario, en modo texto, completo.
  • 4 es un nivel no usado (en Mandrake, equivale al nivel 3).
  • 5 es el modo multiusuario gráfico.
  • 6 es el nivel para reiniciar la máquina. Si presiona la combinación Control + Alt + Del se ejecuta el comando init 6

Para nuestra delicia (es ironía, sí) otras distribuciones han decidido alterar todo este orden por considerarlo inútil para sus propósitos. Este, por ejemplo, es el contenido del archivo /etc/inittab en UbuntuLinux (traducción nuestra):

# /etc/init.d ejecuta los scripts S (start, iniciar) y K (kill, terminar)
# al cambiar de nivel de ejecución
#
# Runlevel 0 es apagar.
# Runlevel 1 es el modo single-user, para reparar el sistema.
# Runlevels 2-5 son todos el modo multiusuario
# Runlevel 6 es reiniciar.

Por lo cual le sugerimos que más allá de confiar en nosotros, vea el archivo /etc/inittab de su distribución y comprenda por usted mismo qué está pasando en su distribución.

El editor ksysv
Para ver qué puede hacer en cada uno de los niveles, vaya al menú "Configuración - Arranque e init" y haga click en "Editor de inicio SysV". Como usuario normal, no podrá editar la configuración, sólo verla. Conéctese como root desde su login gráfico, o abra una terminal, conéctese como root en ella, y ejecute el comando ksysv (si no lo tiene, instálelo). El programa le pedirá elegir su distribución, y luego le mostrará una ventana dividida en muchos niveles de ejecución... Usted puede arrastrar y soltar elementos entre niveles, y activar o desactivar servicios en cada nivel.

Verá que la diferencia entre el nivel 3 y el nivel 5 es el uso del daemon dm, el servicio de conexión en modo gráfico. A la izquierda tiene una lista con servicios disponibles, luego a la derecha la lista de niveles con arriba los servicios activos y debajo los inactivos; luego una ventana donde se muestran las acciones. Por último, en la barra de estado, una serie de casillas para determinar los niveles mostrados. Un consejo: antes de tocar algo, vaya al menú de Archivo y seleccione "Guardar como" o "Guardar configuración" para tener algo a lo que volver en caso de problemas. Si pasa algo malo, basta volver a abrir la aplicación, y seleccionar en el menú Archivo "Volver a la configuración anterior". Esto presupone que usted puede cargar el inicio gráfico, cosa que a veces no es posible. Para no correr riesgos, lo mejor es hacer una copia de seguridad del directorio /etc/rc.d y todo lo que contiene.

Con esto terminamos con la configuración del booteo. Esperamos que pueda optimizar el funcionamiento de su máquina, o que al menos ahora comprenda qué es lo que pasa cuando usted presiona el botón de encendido.

Por supuesto, es posible editar todo esto en consola a mano, pero el tener una herramienta gráfica tan buena nos hace recomendarla, si puede instalarla. Es posible que su distribución incorpore otras herramientas gráficas. Un ejemplo: Ubuntu Linux en su versión 05.10 incluye un manager de los servicios directamente desde el menú. Hay que aclarar que por otro lado esa aplicación no permite la configuración de todos los servicios. Una herramienta muy potente es por ejemplo drakxservices, incluída en la distribución Mandriva Linux. Permite administrar qué servicios se activan al arranque, así como activar o desactivar servicios inmediatamente.

Soporte Técnico: Ayuda doctor!

La ayuda en Linux se presenta de varias maneras. Cada sistema Linux tiene por un lado las llamadas "manpages" o páginas del manual, que aparecen al usar una consola con los comandos man e info. Por otro lado, cada distribución hace su propia documentación para describir sus programas y su configuración particular. Además, se suelen incluír los documentos "HOWTO" (o traducidos al español: "COMO") que explican un tema en particular con gran detalle. En tercer lugar está la comunidad de usuarios, un grupo enormemente distribuido, que puede ayudarlo muchísimo con sus problemas. Si usted compró una distribución en caja, pongamos por ejemplo Mandriva Linux 8.2, incluirá manuales de uso. Si bajó los archivos de Internet, como mínimo tendrá la documentación online en sus CDs.

Si la documentación que usted tiene en su PC no le alcanza, o usted no sabe que le alcanza (algo que esperamos solucionar con este CD), puede recurrir a la red.
Lo primero que usted debería hacer es visitar el sitio de la distribución que usted usa, y agregarlo a sus favoritos. Cada distribución proporciona mucha ayuda, listas de hardware soportado, enlaces útiles, etc. Saber inglés puede ayudarlo mucho en su búsqueda.
Si no encuentra en ese sitio la solución, el siguiente paso es una búsqueda en Google. Simplemente con escribir las palabras que mejor describan su problema y su distribución usted debería encontrar algo.
Si esto tampoco funciona, puede probar visitando los foros de discusión de su distribución particular, y en especial los enlaces que le damos aquí.

El Sistema de Ayuda en GNU/Linux

El sistema de ayuda actual en Linux está disperso entre varios formatos: archivos legibles por el programa man, otros legibles por el programa info, otros de texto puro, otros como HOWTOs o COMOs, la ayuda de KDE y GNOME en formato (al menos la primera) Docbook, los foros, listas de correo, tutoriales, etc. Una de las tareas más importantes que nos queda por completar en la comunidad Linux, es la de lograr la unificación de esos sistemas en uno o en un número menor (o al menos lograr un sistema coherente de ayuda). Pero por el momento, veamos lo que tenemos, y tratemos de aprovecharlo.

Este tutorial se dedica a la parte de la ayuda que no está incluída en sistemas gráficos, como la Ayuda de KDE o GNOME, que es bastante fácil de consultar. También evitamos tratar aquí los manuales de ayuda de su distribución porque no sabemos cuál de ellas usa usted, y porque, en algunos casos, sólo está disponible en el paquete pago: la edición download (gratuita) de, por ejemplo, Mandriva Linux no incluye los manuales que la empresa hace (sí incluye HOWTOs, man, etc.).

Para empezar: usen el comando apropos. Apropos toma el argumento (la palabra buscada) que le damos y nos devuelve el montón (o no) de páginas de manual en las que esa palabra o frase aparece en la descripción de un comando. Por ejemplo, escribir
apropos internet
nos devuelve un listado de páginas de manual:

[rogelio@Edhellond rogelio]$ apropos internet
MIME [mime]          (1)  - Multipurpose Internet Mail Extensions
nslookup             (8)  - query Internet name servers interactively
xinetd               (8)  - the extended Internet services daemon
xinetd.conf [xinetd] (5)  - Extended Internet Services Daemon configuration file
[adriano@Edhellond adriano]$

Evidentemente, el resultado tal vez no sea lo que buscábamos. En ese caso, deberemos pensar en otra palabra para conseguir mejores resultados, o buscar en los HOWTOs o en la red. El caso particular de estar buscando una manera de conectarnos es particularmente difícil de este modo, porque los comandos necesarios (desde una conexión por módem) son pppd y chat. Sus descripciones son pobres, para ser amables con ellos. Por otro lado, la conexión en Linux está cubierta muy bien por kppp, un programa del entorno KDE que provee la misma funcionalidad, tiene muy buena ayuda y es muy fácil de usar. Búsquelo en su menú entre los programas de internet.

Una última aclaración: si el comando apropos no devuelve nada, lo más probable es que la base de datos en que el programa se basa no haya sido creada todavía. Para crearla, ejecute el siguiente comando como usuario root:

make whatis

Luego de la espera podrá usar el comando apropos.

Man

Man es el sistema de ayuda más importante en Linux. Los otros dos grandes "sistemas" son info (descrito más abajo) y la opción --help al ejecutar un programa desde una terminal o consola.

Abra una terminal desde su entorno gráfico, y ejecute
man man
para ver la página de man sobre sí mismo.

Los documentos de man se dividen en secciones, según sean:

  1. Comandos
  2. Llamadas al sistema (funciones para el núcleo)
  3. Llamadas a librerías
  4. Archivos especiales
  5. Formatos de archivos y convenciones
  6. Juegos
  7. Paquetes de macros y convenciones
  8. Comandos a ejecutar por root
  9. Funciones del núcleo

No se preocupe por no entender el propósito de alguna sección ahora. Principalmente, usará las secciones 1, 5, 7 y 8. En realidad, normalmente ni siquiera necesitará usar secciones, pero de todos modos, la manera de hacerlo es
man nº programa (por ejemplo, man 5 mail)
Las principales opciones y maneras de usar man para un principiante son:
man -a programa (por ejemplo, man -a ls)
man -k programa
-a indica que se muestren todas las secciones del manual que tengan referencias al programa. Por ejemplo, man -a man devuelve todas las entradas de man, no sólo la de la sección 1.

-k sirve, igual que el comando apropos, para encontrar qué programa hace algo. por ejemplo, man -k mail me devuelve todos los programas relacionados con la palabra mail en su descripción, con las correspondientes secciones, y una explicación de para qué sirve cada uno.

Para salir de las páginas de man, basta apretar la tecla q.

Help

help es el complemento de man para comandos internos del shell. Pruebe ejecutar help help para saber qué está incluído aquí y qué no. Como regla general, si al pedir ayuda de un comando (y ese comando existe en el sistema) no pasa nada con man o info, pruebe con help. ¿Ejemplos? alias, exit, echo...

Info

El comando info fue creado para superar algunas ausencias del otro gran comando de ayuda: man. Está planteado de manera de hacerlo mucho más flexible de usar, con links para navegación estilo web, por ejemplo. Pasemos a tocar un poco.

Para empezar, haga una prueba simple. Abra una terminal y escriba

info

Eso muestra la "homepage" de info. En ella puede ver que ? lista todos los comandos usables dentro de info, d vuelve a la home, n avanza, p retrocede y b va al inicio de cada página (next, previous, beginning). h abre una ayuda a los principiantes.

Ahora pase al segundo punto: con Tab, lleve el cursor al siguiente link más cercano, y pulse Enter sobre ese enlace. Los enlaces se reconocen por llevar : en su estructura (por ejemplo, Info: es un enlace). Para seguir un enlace, suponiendo que no llegó a él con Tab, puede poner el cursor en la palabra-enlace y dar Enter.

Para moverse puede por supuesto usar las flechas del teclado, pero también la barra espaciadora (avanza una página) o Backspace (retrocede una página). Con Control + L puede recargar la página de info.

Un comando muy útil es S. Permite buscar cadenas de texto dentro del archivo info. El comando Esc + S busca hacia atrás. Con esto tiene una idea básica del uso de man e info, que por su propia naturaleza no pueden ser demasiado complejos. Esperamos que los aproveche para poder aprender mucho más sobre su Linux!

Los HOWTOs, Tutoriales y otras formas de ayuda en la red

Los HOWTOs o COMOs son documentos en formato HTML (páginas web) con información sobre un tema específico, pero no sobre un programa específico. Por ejemplo, el PPP HOWTO cubre todo lo referente al protocolo Point to Point, que se encarga de manejar conexiones a otras computadoras, desde una red local a la internet. Suelen ser muy completos, técnicos, jugosos y difíciles de comprender. Conviene leerlos dos veces, porque la información que buscamos (aunque sea "busque en tal lado") está. Suelen incluirse en las distribuciones, por lo que bastaría un comando como urpmi howto en Mandriva Linux para poderlos instalar, si es que no lo estaban ya. Pueden encontrarse también en la red, claro, dado que normalmente hay una persona que se ocupa de cada uno y lo mantiene actualizado. Pueden encontrar COMOs (las traducciones e innovaciones en HOWTOs al castellano) en el proyecto LuCAS.
Las FAQ (Frequently Asked Questions, preguntas más frecuentes) son otra manifestación de estos documentos, pero tienden a responder dudas puntuales y comunes, por lo que pueden ser mejores para un usuario inexperto. Se encuentran en el sitio de cada aplicación en particular.

Los tutoriales en internet y los foros de discusión / listas de correo / etc. son indudablemente la opción más cómoda muchas veces, pero hay que saber encontrar los adecuados y cómo usarlos. Uno muy bueno para usuarios de la distribución Mandriva Linux es el de mandrivausers, con gente muy amable, una sección de traducción de mensajes e incluso gente que ha pasado a otras distribuciones como Gentoo o Debian pero que sigue participando mucho solamente porque el foro es excelente. Dispone incluso de una sección de traducción para que los usuarios que no hablan inglés puedan publicar sus dudas y recibir respuesta. Por último, busque en Linux Google o Justlinux.

En Argentina, el sitio principal para un usuario debería ser su LUG (Linux Users Group). Para encontrar el suyo, visite el núcleo de todos los LUGs de Argentina: el LUGAr. El LUGAr tiene un sitio hijo, AULA (AULA Une a los Linuxeros Argentinos), que se encarga de nuclear la información y documentación de todos los LUGs. El proyecto AULA aún no está terminado a la fecha, pero para el momento en que lea esto debería haber nacido.

Consejos generales al usar un foro o una lista de correos:

  • No crea que se le debe una respuesta, mucho menos inmediata. Sea amable con la gente que puede responder a su pregunta. Después de todo, usted no está pagando para que le resuelvan su problema. Los autores han visto personalmente a un usuario reclamar porque no había una respuesta a su problema -de manera agresiva además- veinte minutos luego de publicar su primer mensaje a un foro, a las dos de la mañana de un sábado. Dicho esto, las respuestas a problemas en las listas de correo suelen ser muy rápidas y amables. Intente que sigan siendo rápidas y amables: haga preguntas claras y corteses.
  • No crea que el que responde conoce el problema de antemano. Algunas descripciones de cuelgues o problemas se limitan a decir "Mi navegador X se cuelga. Qué hago?" o "No me anda Internet", lo que hace necesaria toda una serie de mensajes y grandes pérdidas de tiempo. Demuestre que intenta salir del problema, no que quiere todo servido. Recibirá más ayuda de este modo.
  • Intente describir a sí mismo el problema lo mejor que pueda, y escríbalo. Relea el texto e intente con eso reproducir el problema para ver qué tan claro ha sido. Avise si ha buscado algo en internet y por qué no le sirvió, si lo hizo.
  • Intente dar un título claro a su mensaje (es decir, algo distinto de "AYUDAAAAAA", o "Tengo problemas").
  • No grite. Escribir todo con MAYUSCULAS en la red equivale a gritar, y es muy molesto de leer.

Búsqueda de archivos y texto

Uno de los pasos importantes en la configuración de un sistema es la búsqueda de los archivos a configurar. Aunque la interfaz de búsqueda humana (preguntarle a alguien) suele ser suficiente; en este tutorial veremos la manera de buscar archivos o cadenas de texto ("texto" siendo cualquier cosa: números, etc.) dentro de ellos. Usaremos 2 comandos: find y grep.

Nuevamente, al decir "archivos" hablamos de archivos, directorios, dispositivos. Todo en Unix es un archivo. Es cierto, no se pueden ver algunos de esos archivos como a todos los otros. Pero sí puede buscárselos.

Además, una vez que encontramos los archivos, podemos trabajar con ellos: modificarlos, guardar la lista, renombrar... Muchas cosas. Es la ventaja de usar sistemas con interfazs de usuario tan potentes. Pero pasemos a los comandos.

find

Find busca archivos en un directorio y sus subdirectorios. Si no se especifica uno en particular, busca desde el directorio actual. El uso de find es:

find archivo expresión

Por ejemplo, el comando que sigue busca y muestra los nombres de todos los archivos en el árbol de directorios /usr/src hasta los situados tres directorios debajo de /usr/src (si no comprende esto lea la ayuda de find, especialmente la opción -maxdepth), que terminen con ".rpm" y cuyos tamaños sean mayores a 100 kbytes. Las expresiones pueden incluir opciones generales, comparaciones (para distinguir entre archivos), y acciones que afectan al resultado de la búsqueda. Por ejemplo, en el comando abajo, -maxdepth es una opción, -name y -size son comparaciones; -print (que no es necesaria en este caso) es una acción:

find /usr/src -maxdepth 3 -name '*.rpm' -size +100k -print

El resultado del comando en nuestro caso es:

 find /usr/src -maxdepth 3 -name '*.rpm' -size +100k -print
/usr/src/RPM/SRPMS/centericq-4.9.7-1.src.rpm
/usr/src/RPM/SRPMS/sylpheed-0.9.7-1.src.rpm

Por lo dicho, find es el comando a usar si está buscando archivos. Un uso simple de find: buscar un archivo determinado en un directorio y sus subdirectorios:

[rogelio@Edhellond rogelio]$ find -name rime*
./docs/rime10.txt
[rogelio@Edhellond rogelio]$

Como ve, encontramos el archivo "rime.txt" dentro del subdirectorio docs. Por si le interesa, es el libro "La balada del viejo marinero", un poema de S.T.Coleridge. Puede encontrarlo en el sitio del proyecto Gutenberg, junto con cientos de otros clásicos, totalmente gratis. Seguiremos usando el archivo para demostrarle el uso de grep.

grep

Este comando busca texto que coincida con el patrón pedido. Sus posibles opciones son muchísimas, pero las esenciales puede que sean éstas que veremos:

  • -número muestra número líneas de texto antes y después de las coincidencias. Variantes: -A número (After, después) y -B número (Before, antes)
  • -f archivo se ejecuta sobre ese archivo
  • -i no diferencia entre mayúsculas o minúsculas

Usemos grep entonces. Para empezar, un ejemplo fácil:

[rogelio@Edhellond rogelio]$ grep -n -e Mariner docs/rime10.txt
1:The Project Gutenberg Etext of The Rime of the Ancient Mariner
20:The Rime of the Ancient Mariner
29:**The Rime of the Ancient Mariner by Samuel Taylor Coleridge**
267:It is an ancient Mariner,
285:The Mariner hath his will.
290:The bright-eyed Mariner.
315:The bright-eyed Mariner.
364:"God save thee, ancient Mariner!
556:"I fear thee, ancient Mariner!
709:"I fear thee, ancient Mariner!"
829:When the Mariner's trance is abated.
1067:The Mariner, whose eye is bright,
[rogelio@Edhellond rogelio]$

busca todas las líneas que contengan la cadena de texto "Mariner" en el archivo rime10.txt, y les agrega el número de línea. Si hubiésemos usado la opción -i la lista sería más larga. (encontraría, por ejemplo, "MARINER" y "mariner", e incluso "mariners". Si quisiéramos encontrar una palabra exacta, usaríamos la opción -w:

[rogelio@Edhellond rogelio]$ grep -w "Sun's" docs/rime10.txt -n
520:The Sun's rim dips; the stars rush out:
[rogelio@Edhellond rogelio]$

Note que, si no hubiésemos usado las comillas dobles alrededor de "Sun's", el resultado no habría sido el buscado.

Ahondando un poco en el uso de grep, veamos algo más sobre expresiones regulares. Estas bestias son herramientas poderosísimas para usar grep (y también en edición avanzada de textos). Básicamente, una expresión regular es un patrón de búsqueda más o menos complejo. Por ejemplo: grep [1-9] usa una expresión regular, que en este caso busca cualquier número entre 1 y 9. Si agrego un '^' al principio de la expresión, se buscan todos los carácteres salvo esos. Hay abreviaturas como [:alnum:], que busca cualquier carácter alfanumérico. El comando sería grep [[:alnum:]], con dobles corchetes. Esto es una característica de las expresiones regulares, llamada clase. Una clase define un grupo de caracteres, en este caso los alfanuméricos.

[rogelio@Edhellond rogelio]$ grep [3-6] docs/rime10.txt -n
23:July, 1994  [Etext #151]
36:people, on about 250 million computers currently in existence: 
37:then we will have given about 15.1 billion Etexts away when the
66:Files by the December 31, 2001.  [10,000 x 100,000,000=Trillion]
82:Champaign, IL 61825
101:or cd etext93 [for new books]  [now also in cd etext/etext93]
131:sending a request within 30 days of receiving it to the person
195:or addition to the etext, or [3] any Defect.
234:[3]  Pay a trademark license fee to the Project of 20% of the
239:     Benedictine College" within the 60 days following each
251:Internet (72600.2026@compuserve.com); TEL: (212-254-5093)
252:*END*THE SMALL PRINT! FOR PUBLIC DOMAIN ETEXTS*Ver.04.29.93*END*
[rogelio@Edhellond rogelio]$

grep también puede usarse para buscar archivos, usando las opciones -l y -r:

grep -l 'main' *.c

busca todos los archivos que contengan la cadena main y terminen en .c;

grep -r 'hola' /home

busca recursivamente (bajando por los subdirectorios) desde /home, la cadena hola. Para estos usos conviene en realidad usar una combinación de grep y find.

Cuándo usar uno u otro

Normalmente, find se usa para encontrar nombres de archivo buscando en los directorios. grep es para buscar cadenas de texto en archivos o en la consola (puede hacerse un grep de lo que un comando devuelve como resultados. Por ejemplo, podría hacerse grep del resultado del comando ls. Ahora, como un directorio en Linux también es técnicamente un archivo, es posible hacer muchas cosas que en principio a uno no se le ocurren. El uso depende entonces de lo que quiera y sepa hacer. De todos modos, info comando o man comando le darán la ayuda que está buscando. Un último truco: info ``Finding Files'' (note el uso de acentos graves al principio de la cadena y apóstrofes al final).

Combinación de comandos

Supongamos que queremos archivar una búsqueda, o verla más cómodamente (el desplazamiento por la pantalla de terminal no es eterno). Tenemos dos opciones: una es correr

find archivo buscado > archivo

lo que guarda en el archivo el resultado de la búsqueda.

La segunda opción es combinar un comando antes de find:

less `find /usr/include -name '*.h' | xargs grep -l mode_t`

es una combinación algo extensa: hace que combinemos (con el comando xargs) los comandos grep (de búsqueda de cadenas en archivos) con find (de búsqueda de archivos); luego pasamos el resultado al comando less, que los presenta en pantalla. Si en lugar de éste usamos vi o algún otro editor de texto, podremos editar la búsqueda inmediatamente para darle el formato que deseemos.

Encontrará, leyendo a lo largo del manual de find, que se usan mucho los comandos find y xargs combinados, separados por un |. Por ahora, sepan que el símbolo | representa una tubería o pipe, y que ésta es una herramienta que toma el resultado de una acción y lo lleva a otro comando. Especialmente, veremos que find se usa en scripts de backup o de limpieza: buscar archivos a almacenar o borrar. Con info find encontrarán muchos ejemplos de esto.

Ya estamos listos. Es hora de ver el uso de un editor de textos profesional, o de ver cómo crear y usar scripts si prefiere.