bash
inicialmente fue diseñado a finales de los 80 como un clon parcial de ksh
algunas características interactivas de csh / tcsh.
Los orígenes del globbing se deben encontrar en los caparazones anteriores sobre los que se basa.
ksh
en sí es una extensión del shell Bourne. El shell Bourne en sí (lanzado por primera vez en 1979 en Unix V7) fue una implementación limpia desde cero, pero no se apartó por completo del shell Thompson (el shell de V1 -> V6) e incorporó características del shell Mashey.
En particular, los argumentos de comando todavía estaban separados por espacios en blanco, |
ahora era el nuevo operador de tubería pero ^
todavía era compatible como una alternativa (y también explica por qué lo hace [!a-z]
y no [^a-z]
), $1
seguía siendo el primer argumento para un script y la barra diagonal inversa seguía siendo el carácter de escape . Muchos de los operadores regexp ( ^\|$
) tienen un significado especial propio en el shell.
El shell Thompson se basó en una utilidad externa para el globbing. Cuando se sh
encuentra sin comillas *
, [
o ?
s en el comando, ejecutaría el comando glob
.
rm *.txt
terminaría ejecutando glob como:
["glob", "rm", "*.txt"]
y glob terminaría ejecutándose rm
con la lista de archivos que coinciden con ese patrón.
grep a.\*b *.txt
correría glob
como:
["glob", "grep", "a.\252b", "*.txt"]
Lo *
anterior se ha citado estableciendo el 8vo bit en ese carácter, evitando que lo glob
trate como un comodín. glob
luego eliminaría ese bit antes de llamar grep
.
Para hacer el equivalente con regexps, eso habría sido:
regexp rm '\.txt$'
O:
regexp rm '^[^.].*\.txt$'
para excluir archivos de puntos.
La necesidad de escapar de los operadores, ya que funcionan como caracteres especiales de shell, el hecho de que .
, común en los nombres de archivo es un operador regexp, hace que no sea muy apropiado hacer coincidir los nombres de archivo y complicado para un principiante. En la mayoría de los casos, todo lo que necesita son comodines que puedan reemplazar uno ( ?
) o cualquier número ( *
) de caracteres.
Ahora, diferentes shells agregaron diferentes operadores de globbing. Hoy en día, los globos ksh y zsh (y hasta cierto punto, bash -O extglob
que implementan un subconjunto de globos ksh) son funcionalmente equivalentes a expresiones regulares con una sintaxis que es menos engorrosa de usar con los nombres de archivo y la sintaxis de shell actual. Por ejemplo, en zsh
(con la extensión Extendedglob), puede hacer:
echo a#.txt
si desea (poco probable) que coincida con los nombres de archivo que consisten en secuencias a
seguidas de .txt
. Más fácil que echo (^a*\.txt$)
(aquí usando llaves como una forma de aislar a los operadores de expresiones regulares de los operadores de shell que podrían haber sido una forma en que los shells podrían lidiar con eso).
echo (foo|bar|<1-20>).(#i)mpg
Para archivos mpg (sin distinción entre mayúsculas y minúsculas) cuyo nombre base es foo, bar o un número decimal del 1 al 20 ...
ksh93
ahora también puede incorporar expresiones regulares (básicas, extendidas, perl-like o "aumentadas") en sus globos (aunque es bastante defectuoso) e incluso proporciona una herramienta para convertir entre glob y regexp ( printf %R
, printf %P
):
echo ~(Ei:.*\.txt)
al partido (no oculta) txt con E XTended expresiones regulares, entre mayúsculas i nsensitively.
rm -- ^[^.].*\.txt$
lugar derm -- *.txt
?