NOMBRE
glob − Generación de nombres de rutas de ficheros
DESCRIPCIÓN
Hace mucho tiempo, en Unix V6, había un programa en /etc/glob que expandía patrones con comodines. Poco después este programa se convirtió en una orden incorporada en el shell.
Hogaño existe también una rutina de biblioteca glob(3) que efectúa esta función para un programa de usuario.
Las reglas son como sigue (POSIX 1003.2, 3.13).
CONCORDANCIA DE COMODINES
Una cadena de caracteres es un patrón con comodines si contiene uno al menos de los caracteres ’?’, ’*’ o ’[’. La generación de nombres de caminos (en inglés, ’globbing’) es la operación que expande un patrón con comodines formando una lista de nombres de caminos de ficheros que concuerdan con el patrón. La concordancia se define así:
Un signo de cierre de interrogación ’?’ (no entre corchetes) concuerda con cualquier carácter simple.
Un asterisco ’*’ (no entre corchetes) concuerda con cualquier cadena de caracteres, incluyendo la cadena vacía.
Clases de
caracteres
Una expresión entre corchetes ’[...]’
donde el primer carácter tras el corchete de apertura
’[’ no es un signo de cierre de
admiración ’!’, concuerda con un
carácter simple; a saber, cualquiera de los
caracteres encerrados entre los corchetes. La cadena
encerrada entre los corchetes no puede estar vacía;
por ello, el corchete de cierre ’]’ puede estar
entre los corchetes, siempre que sea como el primer
carácter. (Así, ’[][!]’ concuerda
con uno de los tres caracteres ’[’.
’]’ y ’!’.)
Rangos
Existe un convenio especial: dos caracteres separados por el
guión ’-’ denotan un rango. (Así,
’[A-Fa-f0-9]’ es equivalente a
’[ABCDEFabcdef0123456789]’.) Se puede incluir el
guión ’-’ con su sentido literal
poniéndolo como el primer o el último
carácter entre los corchetes. (Así,
’[]-]’ concuerda justo con uno de los dos
caracteres ’]’ o ’-’, y
’[--/]’ concuerda con uno de los tres caracteres
’-’, ’.’, ’ /’.)
Complementación
Una expresión ’[!...]’ concuerda con un
carácter simple; a saber, cualquier carácter
que no concuerde con la expresión obtenida al quitar
el primer cierre de admiración ’!’ de
ella. (Así, ’[!]a-]’ concuerda con
cualquier carácter simple excepto ’]’,
’a’ y ’-’.)
Uno puede anular el significado especial de ’?’, ’*’ y ’[’ haciéndolos preceder de una barra inclinada invertida ’\’, o, en caso de formar parte de una orden del shell, encerrándolos entre comillas. Entre corchetes, estos caracteres se representan a sí mismos. Así, ’[[?*\]’ concuerda con uno de los cuatro caracteres ’[’, ’?’, ’*’ y ’\’.
NOMBRES DE CAMINOS
La expansión se aplica a cada uno de los componentes de un nombre de camino por separado. Una barra inclinada ’/’ en un nombre de camino no puede concordar con un comodín ’?’ ni ’*’, ni con un rango como ’[.-0]’. Un rango no puede contener un carácter ’/’ explícito; esto llevaría a un error de sintaxis.
Si un nombre de fichero comienza con un punto ’.’, este carácter debe concordar explícitamente. (Así, ’rm *’ no borrará, por ejemplo, .profile, y ’tar -c *’ no archivará todos sus ficheros; ’tar -c .’ es mejor.)
LISTAS VACÍAS
La bonita y simple regla dada arriba: ’expandir un patrón de comodines a una lista de nombres de caminos que concuerdan’ fue la definición original de Unix. Le permitía a uno tener patrones que se ’expandían’ a una lista vacía, como en
xv -wait 0 *.gif *.jpg |
donde quizás no había ningún fichero GIF presente (y esto no es un error). Sin embargo, POSIX requiere que un patrón de comodines se deje sin cambios cuando sea sintácticamente incorrecto o cuando la lista de nombres de camino concordantes esté vacía. Con bash uno puede forzar el comportamiento clásico estableciendo allow_null_glob_expansion=true y con zsh con setopt null_glob. (Problemas similares ocurren por todas partes. Por ejemplo, donde guiones viejos tengan
rm ’find . -name "*~"’ |
los nuevos requerirán
rm -f no-tal-fichero ’find . -name "*~"’ |
para evitar mensajes de error de rm llamado con una lista de argumentos vacía.)
OBSERVACIONES
Expresiones
regulares
Observe que los patrones de comodines no son expresiones
regulares, aunque son algo similares. Lo primero, concuerdan
con nombres de ficheros en vez de con texto, y lo segundo,
los convenios no son los mismos: p.ej., en una
expresión regular ’*’ significa cero o
más copias de lo precedente.
Ahora que las expresiones regulares tienen expresiones de corchetes donde la negación se indica por un acento circunflejo ’^’, POSIX ha declarado que el efecto de un patrón ’[^...]’ está indefinido. En zsh tiene el mismo efecto que ’[!...]’.
Clases de
caracteres e internacionalización
Por supuesto los rangos significaban originalmente rangos
ASCII, así que ’[ -%]’ significaba
’[ !"#$%]’ y ’[a-z]’
quería decir "cualquier letra
minúscula". Algunas implementaciones de Unix
generalizaron esto de forma que un rango X-Y significara el
conjunto de caracteres cuyos códigos estuvieran entre
los de X y los de Y. Sin embargo, esto requiere que el
usuario conozca la codificación de caracteres que se
emplee en el sistema local, y aún más, esto no
es conveniente si la secuencia de clasificación para
el alfabeto local difiere del ordenamiento de los
códigos de caracteres. Por lo tanto, POSIX
extendió grandemente la notación de corchetes,
tanto para patrones de comodines como para expresiones
regulares. Antes vimos tres tipos de elementos que pueden
estar en una expresión de corchetes; a saber, (I) la
negación, (II) caracteres simples explícitos,
y (III) rangos. POSIX especifica los rangos de una manera
más útil internacionalmente y añade
tres tipos más:
(III) Los rangos X-Y comprenden todos los caracteres que caigan entre X e Y (incluidos) en la secuencia de clasificación en curso según se defina en la categoría LC_COLLATE para la localización o escenario actual.
(IV) Clases de
caracteres nombradas, como
[:alnum:] [:alpha:] [:blank:] [:cntrl:]
[:digit:] [:graph:] [:lower:] [:print:]
[:punct:] [:space:] [:upper:] [:xdigit:]
de modo que uno pueda decir ’[[:lower:]]’ en vez
de ’[a-z]’, con el significado de cualquier
letra minúscula, y esto funcione por ejemplo
también en Dinamarca, donde hay tres letras en el
alfabeto después de la zeta. Estas clases de
caracteres están definidas por la categoría
LC_CTYPE en el escenario en curso.
(V) Símbolos de colación, como ’[.ch.]’ o ’[.a-acute.]’, donde la cadena entre ’[.’ y ’.]’ es un elemento de colación definido por el escenario en curso. Observe que esto puede ser un elemento multi-carácter.
(VI) Expresiones de clase de equivalencia, como ’[=a=]’, donde la cadena entre ’[=’ y ’=]’ es cualquier elemento de colación de su clase de equivalencia, según se defina para el escenario en curso. Por ejemplo, ’[[=a=]]’ podría ser equivalente a ’[aáàäâãäå]’ (aviso: esto es Latin1); esto es, equivalente a ’[a[.a-acute.][.a-grave.][.a-umlaut.][.a-circumflex.][.a-tilde.][.a-ring.]]’.