2012-09-26 16 views
8

I błahy wokół z extended globbing w bash, ale istnieje pewne dziwności z odwrotnym matcher !(PATTERN). Rozważmy następujący przykładDlaczego ten wzór pasuje do `ab`, ale nie do` ba`?

$ touch ab ba 
$ shopt -s extglob 

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

Teraz wygląda !() dopasowuje pusty łańcuch, ale dlaczego nie *a*!(a) mecz ba?

Sądziłem, że w drugim przykładzie ab pasuje jak tak

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

co z kolei mogłoby sugerować mecz ba w trzecim przypadku jak tak

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

ale wygląda tak nie robi nie działa.

Nawet biorąc pod uwagę chciwość, to nie ma dla mnie żadnego sensu. czego mi brakuje?

edit:
jestem na GNU bash, Version 4.1.7(2)-release (i386-apple-darwin10.4.0)

+0

samo zachowanie na 'GNU bash, wersja 4.1.5 (1) -release (x86_64-pc-linux-gnu) ' –

+0

Na razie będę zakładać, że jest to błąd w bash. Mój raport o błędzie: https://groups.google.com/d/topic/gnu.bash.bug/KkQNOi8F7q4/discussion – user123444555621

Odpowiedz

1

To rzeczywiście dziwne. Mogę odtworzyć twoje zachowanie. Ta dziwność to * za znakiem a. Kiedy wykonuję twój kod:

$ echo *a*!(a) 
ab 

... tak jak opisano. Ale jeśli pominąć tę drugą * pasuje oba pliki

$ echo *a!(a) 
ab ba 

co oznacza, że ​​elementy pasujące powinny być poprawne. Pytanie brzmi, dlaczego ta druga gwiazdka nie pasuje do łańcucha zerowego w pierwszym przykładzie. Dokumentacja mówi, że powinna pasować do łańcucha pustego, ale wydaje się, że to nie działa poprawnie.

Może nasze wersje bash nie pasują do dokumentacji?

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

to działa:() dodaje się do dwuznaczności

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

dziwne: *a*!(a)c, zapałki abc i bac (co jest normalne zachowanie)

Powiązane problemy