bashzostał pierwotnie zaprojektowany pod koniec lat 80. jako częściowy klon kshz niektórymi interaktywnymi funkcjami csh / tcsh.
Początki globowania należy znaleźć we wcześniejszych powłokach, na których się opiera.
kshsam jest przedłużeniem powłoki Bourne'a. Sama powłoka Bourne'a (po raz pierwszy wydana w 1979 roku w Unixie V7) była czystą implementacją od zera, ale nie odbiegała całkowicie od powłoki Thompson (powłoka V1 -> V6) i zawierała funkcje z powłoki Mashey.
W szczególności argumenty poleceń były nadal oddzielone spacjami, |był teraz nowym operatorem potoku, ale ^nadal był obsługiwany jako alternatywa (a także wyjaśnia, dlaczego tak robisz, [!a-z]a nie [^a-z]), $1był nadal pierwszym argumentem skryptu, a ukośnik odwrotny był nadal znakiem ucieczki . Tak wiele operatorów wyrażeń regularnych ( ^\|$) ma specjalne znaczenie w powłoce.
Powłoka Thompsona opierała się na zewnętrznym narzędziu do globowania. Kiedy shznaleziono cytowane *, [lub ?S w poleceniu, by go uruchomić poprzez polecenie glob.
rm *.txt
skończyłby z globem jako:
["glob", "rm", "*.txt"]
a glob skończyłby rmz listą plików pasujących do tego wzorca.
grep a.\*b *.txt
działałby globjako:
["glob", "grep", "a.\252b", "*.txt"]
*Powyżej zostały podane przez ustawienie 8th trochę na tym charakterze, zapobiegając globod traktując go jako zamiennika. globusunie ten bit przed zadzwonieniem grep.
Aby zrobić odpowiednik wyrażeń regularnych, byłoby to:
regexp rm '\.txt$'
Lub:
regexp rm '^[^.].*\.txt$'
aby wykluczyć pliki kropkowe.
Konieczność ucieczki przed operatorami, ponieważ podwajają się one jako znaki specjalne powłoki, fakt, że .często w nazwach plików jest operatorem wyrażenia regularnego, sprawia, że dopasowanie nazw plików nie jest zbyt odpowiednie i skomplikowane dla początkującego. W większości przypadków potrzebujesz tylko symboli wieloznacznych, które mogą zastąpić jeden ( ?) lub dowolną liczbę ( *) znaków.
Teraz różne powłoki dodały różnych operatorów globowania. Obecnie globusy ksh i zsh (i do pewnego stopnia bash -O extglobimplementujące podzbiór globów ksh) są funkcjonalnie równoważne wyrażeniom regularnym z składnią, która jest mniej kłopotliwa w użyciu z nazwami plików i bieżącą składnią powłoki. Na przykład w zsh(z rozszerzeniem rozszerzonymglob) możesz:
echo a#.txt
jeśli chcesz (mało prawdopodobne), aby dopasować nazwy plików składające się z sekwencji apo których następuje .txt. Łatwiej niż echo (^a*\.txt$)(tutaj użycie nawiasów klamrowych jako sposobu odizolowania operatorów wyrażeń regularnych od operatorów powłoki, które mogłyby być jednym ze sposobów, w jaki powłoki mogłyby sobie z tym poradzić).
echo (foo|bar|<1-20>).(#i)mpg
Dla plików mpg (bez rozróżniania wielkości liter), których basename to foo, bar lub liczba dziesiętna od 1 do 20 ...
ksh93teraz może również zawierać wyrażenia regularne (podstawowe, rozszerzone, podobne do Perla lub „rozszerzone”) w swoich globach (chociaż jest dość błędne), a nawet zapewnia narzędzie do konwersji między glob i regexp ( printf %R, printf %P):
echo ~(Ei:.*\.txt)
do meczu (nie ukryte) txt plików z E Xtended wyrażeń regularnych, CASE- I nsensitively.
rm -- ^[^.].*\.txt$zamiast tegorm -- *.txt?