bashinicialmente fue diseñado a finales de los 80 como un clon parcial de kshalgunas características interactivas de csh / tcsh.
Los orígenes del globbing se deben encontrar en los caparazones anteriores sobre los que se basa.
kshen 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]), $1seguí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 shencuentra 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 rmcon la lista de archivos que coinciden con ese patrón.
grep a.\*b *.txt
correría globcomo:
["glob", "grep", "a.\252b", "*.txt"]
Lo *anterior se ha citado estableciendo el 8vo bit en ese carácter, evitando que lo globtrate como un comodín. globluego 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 extglobque 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 aseguidas 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 ...
ksh93ahora 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?