miércoles, 9 de marzo de 2011

El manual de Linux

Con Linux, como digno descendiente (libre) de UNIX que es, viene incluido un manual. Es un manual electrónico, al alcance del usuario con tan solo pulsar algunas teclas desde cualquier terminal. No es simplemente una variante más extensa y mejor presentada de la ayuda básica que los propios programas proporcionan al pasarle el parámetro --help. Es algo más, una fuente actualizada, completa y autorizada sobre el funcionamiento del sistema; no sólo de sus programas de usuario, también de sus herramientas de administración, de sus archivos de configuración e incluso de funciones y llamadas al sistema de interés para el programador.

El acceso al manual se consigue utilizando el comando:

$ man <nombre_del_programa_o_elemento>

Para aprender sobre el propio comando man teclearíamos:

$ man man

En esas páginas podemos leer algunas cosas muy útiles sobre el propio uso de este manual electrónico. Por ejemplo que el manual se divide en distintas secciones o categorías de información:
  1. Programas ejecutables y guiones del intérprete de órdenes (shellscripts)
  2. Llamadas del sistema (funciones ofrecidas por el núcleo)
  3. Llamadas de la biblioteca (funciones contenidas en las bibliotecas del sistema)
  4. Ficheros especiales (se encuentran generalmente en /dev)
  5. Formatos de ficheros y convenios (por ejemplo /etc/passwd)
  6. Juegos
  7. Paquetes de macros y convenios (por ejemplo man, groff)
  8. Órdenes de administración del sistema (generalmente solo son para root)
Cada página de manual presenta la información organizada en una serie de apartados:
  • NAME - El nombre del comando o elemento seguido por una breve descripción.
  • SYNOPSIS - Un resumen de cómo usarlo y de las opciones que permite.
  • DESCRIPTION - Una descripción más detallada del funcionamiento.
  • EXAMPLES - Algun ejemplo de uso típico.
  • SEE ALSO - Referencia a otros programas o elementos relacionados.
Cuando solicitamos la página de manual de un elemento sin especificar nada más, se nos mostrará la primera página que se encuentre para dicho elemento buscando, por orden numérico, en las distintas secciones del manual. Este funcionamiento podría hacer que dejáramos de ver cierta información de interés por existir distintos elementos con el mismo nombre clasificados en distintas secciones del manual. Por ejemplo, para acceder al manual del comando passwd, basta con teclear:

$ man passwd

Pero si lo que buscamos es información sobre el archivo de configuración estándar passwd (almacenado en /etc) deberíamos indicar la sección del manual donde se encuentran esas páginas -en este caso la quinta-, ya que de lo contrario nos mostraría la primera que encuentre:

$ man 5 passwd

Como a priori no tenemos por qué saber si existen elementos con el mismo nombre en distintas secciones del manual, para que el sistema nos permita ver todas las páginas usaríamos:

$ man -a passwd

Así cuando cerremos la página pulsando la tecla q el programa man nos permitirá navegar por las siguientes páginas encontradas (si las hubiera).

Otro parámetro muy útil del programa man, es el que nos permite buscar aquellas páginas de manual que contengan en su descripción (apartado NAME) cierta palabra. Por ejemplo, para buscar todos los programas relacionados con comparación de datos usaría:

$ man -k compare

Hay que tener en cuenta que si se usan dos o más palabras clave se realiza un OR lógico entre ellas. Si lo que queremos es hacer un AND para "refinar" una búsqueda, por ejemplo buscando compare files, podríamos hacerlo filtrando con grep así:

$ man -k compare | grep files

Cuando estemos consultando páginas de manual en pantalla, podremos, además de movernos por el documento electrónico usando las teclas correspondientes (flechas arriba y abajo, avanza página y retrocede página, etc.) buscar texto en las mismas usando la funcionalidad correspondiente del paginador que use el programa man. En el caso de less (el más habitual) lo haríamos tecleando /palabra_a_buscar y pulsando Enter. Cada ocurrencia de la cadena buscada quedará resaltada y si además queremos ir posicionándonos sobre las mismas iremos pulsando la tecla n (de next) .

Si lo único que queremos saber es para qué sirve cierto programa, por ejemplo porque hemos visto su archivo ejecutable al listar el contenido de un directorio como /bin, podemos usar man con la opción -f, o mejor, el programa whatis que hace lo mismo y es más fácil de recordar:

$ whatis nc

Para ver la descripción de cada programa contenido en un directorio de ejecutables como /bin podemos combinar los siguientes comandos:

$ whatis $(ls -1 /bin)

O mejor aún, si queremos ver la descripción de todos los programas que podemos ejecutar podemos pasarle a bash el siguiente bucle en una sola línea:

$ for d in $(echo $PATH|tr : ' ');do whatis $(ls -1 $d);done|less

Y estirando un poco más el asunto podemos generar un listado con la descripción de todos los programas ordenados alfabéticamente así:

for d in $(echo $PATH|tr : ' ');do whatis $(ls -1 $d);done|sort > lista_programas.txt

Otra forma interesante de acceder a la información del manual puede ser ojear los elementos para los que existen páginas en éste, una buena forma para descubrir cosas nuevas (de las cuales podríamos desconocer incluso su existencia). En el caso de los programas y comandos nos podrían servir los dos trucos anteriores, pero si lo que nos interesan son los archivos de configuración y formatos estándares (sección 5) podríamos asomarnos al directorio donde se guardan de la siguiente forma:

$ ls /usr/share/man/man5

Para ver la descripción que el manual proporciona para cada elemento podríamos usar:

$ whatis $(ls -1 /usr/share/man/man5 | sed 's/.5.gz//')

Cambiando el número 5 por el de la sección que nos interese ojearíamos los elementos para los que existen páginas en esa sección del manual. Algunos ejemplos de información útil en la sección 7 son los siguientes:
  • Sobre la jerarquía del sistema de archivos: man hier
  • Sobre la codificación ASCII: man ascii
  • Sobre la codificación ISO 8859-1 (o Latin-1): man latin1
  • Sobre la codificación UTF-8 (Unicode): man utf8
Por último, una de las formas en que podríamos convertir páginas de manual especialmente densas o extensas (como la de bash) a formato PDF para su posterior impresión:

$ man -t bash | ps2pdf - bash_manual.pdf