bash
został pierwotnie zaprojektowany pod koniec lat 80. jako częściowy klon ksh
z niektórymi interaktywnymi funkcjami csh / tcsh.
Początki globowania należy znaleźć we wcześniejszych powłokach, na których się opiera.
ksh
sam 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]
), $1
był 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 sh
znaleziono 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 rm
z listą plików pasujących do tego wzorca.
grep a.\*b *.txt
działałby glob
jako:
["glob", "grep", "a.\252b", "*.txt"]
*
Powyżej zostały podane przez ustawienie 8th trochę na tym charakterze, zapobiegając glob
od traktując go jako zamiennika. glob
usunie 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 extglob
implementują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 a
po 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 ...
ksh93
teraz 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
?