1 de marzo de 2006

cosas que odio de unix, capítulo...

Te pasas años usando cosas hasta que al final te das cuenta de que algo simplemente está mal hecho. Unix tiene muchas cosas mal hechas (creo que ya he escrito bastante sobre ello en este blog) al igual que tiene otras bien. Asi que hoy me toca continuar mi propia tradición

Man. Man es una puta mierda. ¿Por qué las secciones están divididas por números? No se si soy el único, pero jamás he sabido ni quiero saber cual es la sección man correspondiente a la sección de funciones de librerias. Es la 3. Pero a mi no me importa, de verdad. Antes que "man 3 opendir" preferiría algo más lógico, como "man lib opendir", por ejemplo. No entiendo porque me tengo que aprender de memoria una tabla de correspondencias "número -> sección de manual". Es más, no me extrañaría que en alguna de esas certificaciones te obligaran a saberte de memoria algo tan estúpido.

Luego está el tema de los parámetros. Intenta crear un archivo que tenga el mismo nombre que uno de los parámetros. "touch --help". ¿A qué me refiero realmente, a un archivo o a la ayuda? Si, se puede evitar con "touch -- --help", pero esa no es la cuestión. La cuestión es que en Unix, en la linea de comandos típica de bash, los parámetros comparten el mismo espacio de nombres que el sistema de archivos. Y eso no está bien, porque por definición implica que a veces los dos van a "chocar". El "--" es una forma de decir al shell que ignore a las opciones y se centre en los archivos, pero se usa las pocas veces que la gente se encuentra con estos casos en la consola, ¿cuanta gente lo usa en scripts? A todo script al que le pases un parámetro a un ejecutable le puedes pasar "--help", y los resultados son muy divertidos. Me pregunto como podría afectar eso al entramado de scripts y de historias que tenemos en unix, o incluso si se puede utilizar esta falta de comprobación de ciertos parámetros como agujero de seguridad (cosas más raras se han visto en windows)

Es un hack muy útil, pero lo ideal sería un sistema que funcionara siempre.

10 comentarios:

  1. Pues no se que usos le darás tu al man, seguro que uno mejor que el que yo le doy (man <programa que no tengo ni putas de como funciona>), pero a mí me parece bastante bueno y no como el poco intuitivo "info" que sinceramente no tengo idea de como funciona, man info xD

    Saludos

    ResponderEliminar
  2. "man programa" funciona muy bien si. Y "man opendir". El problema viene cuando haces "man open", que tiene hasta TRES páginas distintas, una en la sección "1", otra en la sección "2" y otra en la "3" (si tienes instaladas las páginas man del posix). Cada vez que tengo que buscar una de las 3 en particular tengo que andar como un idiota adivinando que sección corresponde a cada número.

    ResponderEliminar
  3. Bueno, algo mas curioso es el comportamiento de la linea de comandos cuando uno quiere hacer algo "ingenioso":

    #!/bin/bash
    firefox -remote openURL\(%1,new-tab\) \& || firefox %1 &

    Escapar el & en la primera mitad de la instrucción no me parece nada intuitivo, pero funciona.

    Estoy escribiendo el comando de memoria, ahora estoy en el laburo con el XP.

    ResponderEliminar
  4. #!/bin/bash
    firefox -remote openURL\(${1},new-tab\) \& || firefox ${1} &

    ResponderEliminar
  5. ¿Por qué las secciones están divididas por números?

    Porque man es un comando que funciona como una funcion sobrecargada, y si no usa diferentes tipos de datos para diferenciar las secciones de los comandos/funciones/etc man no sabria que se le esta pidiendo.

    Claro que podrian haber dicho que si se dan dos parametros el segundo es la sección entonces el comando seria:

    man comando sección

    y no habria problema, lo que sucede es que si uno le dice a man:

    man comando1 comando2

    Primero te muestra la ayuda del comando1 y despues la del comando2, o sea que se le puede pedir información de mas de un comando al mismo tiempo. Por lo que mi idea no fue pensada por los que diseñaron man. ¿Por que?

    Bien, supongo que en los tiempos que no habia monitores, y corrijame alguien si estoy equivocado, todo se mandaba por la impresora, entonces si uno tenia una duda con una serie de comandos lo mas practico era mandarlos directo a la impresora con un solo comando, y si eran de direntes secciones, cada grupo de "numero palabra" era interpretado como "sección comando/funcion". Obviamente eso ya no nos parece nada practico.

    ResponderEliminar
  6. Ojo, en ningún momento me he quejado de que las secciones de man estén divididas, de lo que me quejo es que estén divididas POR NUMEROS.


    (Y si, "man lib open" imposibilita crear una página man para "lib", pero de la misma manera de la que tampoco hoy se puede crear una página man "1")


    Eso de la impresora tiene mucho sentido.


    Hay que tener en cuenta que esto no es ninguna "reliquia histórica". Es decir, lo que importa de man son sus contenidos. Se podría crear una utilidad (un script cortito, de hecho) que "mapeara" cosa como "lib" a su sección correspondiente. Lo que me fastidia es que el estándar de hoy sean los numeritos, hay mejores maneras de crear sistemas de documentación (e info no es el mejor de ellos tampoco)

    ResponderEliminar
  7. "(Y si, "man lib open" imposibilita crear una página man para "lib", pero de la misma manera de la que tampoco hoy se puede crear una página man "1")"

    No, ese no es el problema, el problema es que las funciones sobrecargadas reconocen como deben actuar con los dostos dependiendo de su tipo. O sea que para man si los datos son alfanumericos es comando o función, y si es numerico es sección.

    Claro que seria interesante que hubiera un comando para pasar explicitamente la sección como alfanumerico, pero hasta donde sé, esa opción no existe.

    Algo asi como:

    man -slib open -sgam tetris

    Por poner un ejemplo.

    Saludos

    ResponderEliminar
  8. Se puede crear perfectamente una implementación que al hacer un "man lib", reconozca "lib" como la sección, y lo mismo con otras pocas secciones. Lo único que tienes que evitar es crear páginas man como "lib", "cmd"....que funcionarían igual de todas maneras porque un solo parámetro "man lib" no está especificando ninguna sección y "man lib lib" la está especificando igualmente.


    Y si, esto rompería la función de concatenar la petición de varias páginas man consecutivas (algo que francamente no me importa en absoluto) De hecho siendo sinceros no solo no deberían utilizar cadenas de texto para identificar secciones, sino un sistema de "tagging" que permitiera hacer búsquedas con respeto a unas palabras claves determinadas para poder llegar a hacer algo del tipo "enseñame una lista de las páginas man de comandos de gnome", pero ese es otro tema a semi-redactar para otro blog

    ResponderEliminar
  9. La busqueda a partir de palabras clave ya existe, o por lo menos yo vengo utilizando algo asi hace bastante tiempo:

    man -k palabraclave

    Claro que si uno mira la documentación de man aparece un laconico:

    -k Equivalente a apropos.

    Entonces:

    man apropos

    busca strings en la base de datos "whatis"

    Y asi podemos seguir un rato, deberia decir:

    -k busca strings en las paginas man

    Esas son algunas de las cosas que todos odiamos en linux, que a veces la ayuda no sirve de ayuda.

    ResponderEliminar
  10. "Man -k " es básicamente un grep, no hay más que hacer "man -k open" para darse cuenta de lo mucho que le falta para ser útil..

    ResponderEliminar