2012-09-26 11 views
8

Jugueté con extended globbing en bash, pero hay alguna rareza con el matcher inverso !(PATTERN). Considere el siguiente ejemplo¿Por qué este patrón coincide con `ab`, pero no con` ba`?

$ touch ab ba 
$ shopt -s extglob 

$ echo *a* 
ab ba 
$ echo !(a)*a* 
ab ba 
$ echo *a*!(a) 
ab 

Ahora parece que !() coincide con la cadena vacía, pero ¿por qué no lo hace *a*!(a) partido ba?

que supone que en el segundo ejemplo ab está adaptada al igual que

!(a) -> "" 
* -> "" 
a -> "a" 
* -> "b" 

que a su vez podría sugerir un partido de ba en el tercer caso al igual que

* -> "b" 
a -> "a" 
* -> "" 
!(a) -> "" 

pero parece que este doesn no funciona

Incluso teniendo en cuenta la codicia, eso no tiene ningún sentido para mí. ¿Qué me estoy perdiendo?

edición:
Estoy en GNU bash, Version 4.1.7(2)-release (i386-apple-darwin10.4.0)

+0

mismo comportamiento en 'GNU bash, versión 4.1.5 (1) -release (x86_64-pc-linux-gnu) ' –

+0

Por ahora, voy a asumir que este es un error en Bash. Mi informe de error: https://groups.google.com/d/topic/gnu.bash.bug/KkQNOi8F7q4/discussion – user123444555621

Respuesta

1

Este es de hecho extraño. Podría reproducir tu comportamiento. La extrañeza es * detrás del personaje a. Cuando ejecuto su código:

$ echo *a*!(a) 
ab 

... es como usted lo describió. Pero si me salto esa segunda * que coincide con los dos archivos

$ echo *a!(a) 
ab ba 

Lo que significa que sus elementos coincidentes deben ser correctos. La pregunta es, ¿por qué este segundo asterisco no coincide con la cadena nula en el primer ejemplo? Como la documentación dice que debe coincidir con la cadena nula, pero parece que esto no funciona correctamente.

¿Quizás nuestras versiones de bash no coinciden con la documentación?

$ bash --version 
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin11) 
Copyright (C) 2007 Free Software Foundation, Inc. 
1

Esto funciona:() que se añade para eliminar la ambigüedad

echo @(*a*)!(a) 
echo !(a)@(*a*) 

extraño: *a*!(a)c, partidos abc y bac (que es un comportamiento normal)

Cuestiones relacionadas