Czy w Bash gwarantowane jest, że rozszerzenia symboli wieloznacznych będą w porządku?


53

Czy rozszerzenie znaku wieloznacznego w Bash jest gwarantowane w kolejności alfabetycznej? Jestem zmuszony podzielić duży plik na 10 Mb, aby mogły zostać zaakceptowane przez moje repozytorium Mercurial.

Pomyślałem więc, że mogę użyć:

split -b 10485760 Big.file BigFilePiece.

a następnie zamiast:

cat BigFile | bigFileProcessor

Mógłbym zrobić:

cat BigFilePiece.* | bigFileProcessor

Na swoim miejscu.

Jednak nie mogłem znaleźć nigdzie, co gwarantowałoby, że rozwinięcie gwiazdki (aka wildcard, aka *) zawsze będzie w kolejności alfabetycznej, tak aby .aabyło wcześniej .ab(w przeciwieństwie do kolejności znaczników czasu lub czegoś podobnego).

Czy są jakieś wady mojego planu? Jak duży jest koszt wydajności catwspólnego utworzenia pliku?


4
Na pewno wybierasz niewłaściwe podejście. Jeśli administrator nałoży limit wielkości plików, które masz w repozytorium, powinieneś z nim porozmawiać. Mówiąc o rozszerzeniu - zawsze widziałem, że rozszerzenie jest alfanumeryczne.
Mircea Vutcovici,

1
Zawsze możesz przepuścić, sortjeśli potrzebujesz dodatkowej manipulacji zamówieniem.
Warner

2
Pamiętaj, że Mercurial może zarządzać plikami o dowolnym rozmiarze, ograniczonym ilością dostępnej pamięci RAM. Otrzymasz ostrzeżenie, jeśli dodasz duży plik, ponieważ Mercurial zakłada, że ​​może on przechowywać plik w pamięci. W celu scalenia Mercurial musi przechowywać dwa pliki w pamięci. Komputery z małą ilością pamięci RAM mogą mieć zatem problemy ze sprawdzeniem pliku. Właśnie testowałem go, a hg commitna Npliku MB wymaga około 3 * NMB pamięci RAM i hg updatewymaga około 2 * NMB pamięci RAM. Dotyczy to Mercurial 1.5 w systemie Linux.
Martin Geisler,

Odpowiedzi:


67

Tak, ekspansja globowania jest alfabetyczna.

Ze strony Bash man:

Rozszerzenie nazwy ścieżki

Po podziałowi na słowa, chyba że -fopcja została ustawiona, bash skanuje każde słowo znakami *, ?oraz [. Jeśli pojawi się jeden z tych znaków, to słowo jest traktowane jako wzór i zastępowane alfabetycznie uporządkowaną listą nazw plików pasujących do wzorca.


@Dennis Williamson, Masz pojęcie, czy nadal byłoby to prawdą, jeśli użytkownik ma ustawiony inny język?
Zoredache,

5
@Zoredache: W rzeczywistości jest określony przez POSIX: opengroup.org/onlinepubs/007908775/xsh/glob.htmlŚcieżki są uporządkowane zgodnie z bieżącym ustawieniem kategorii LC_COLLATE, patrz specyfikacja XBD, LC_COLLATE [ opengroup.org / onlinepubs / 007908775 / xbd /… ”i dlatego powinieneś robić rzeczy takie jak ls -l [[:lower:]]zamiast ls -l [a-z].
Dennis Williamson

Pamiętaj, że kolejność jest alfabetyczna, więc BigFilePiece.10 pojawi się przed BigFilePiece.2
Ken

@DennisWilliamson - Dlaczego dwie pary nawiasów kwadratowych? Wydaje mi się, że jeden działa dokładnie tak samo.
ArtOfWarfare

2
@ArtOfWarfare: Spróbuj tego: mkdir lctest; cd lctest; touch w; touch z; ls -l [:lower:]; echo =====; ls -l [[:lower:]]. Plik „z” jest wymieniony tylko na sekundę, lsponieważ żąda pojedynczych liter nazw plików. Pierwszy ls- ten bez zewnętrznych nawiasów kwadratowych - prosi o jednoznakowe nazwy plików z listy znaków „:”, „l”, „o”, „w”, „e” i „r”. W obu przypadkach najbardziej zewnętrzne nawiasy kwadratowe ograniczają wyrażenie w nawiasie, które zawiera znaki i klasy. W przypadku [[:lower:]]wewnętrznych nawiasów kwadratowych, dwukropków i słowa nazwa klasy znaków. ...
Dennis Williamson,

4

Jest to udokumentowane zachowanie bash, abyś mógł na nim polegać w swoich skryptach. Od dawna odnosi się to również do innych powłok kompatybilnych z Bourne'em ... choć mogą istnieć przypadki narożne dotyczące składania lub znaków innych niż alfanumeryczne.

(Wynikowa lista bashbędzie w prawie „ASCII-betical” --- z wyjątkiem tego, że małe i wielkie litery będą zestawiane razem, tak jakby nie było różnic, ale z małymi literami przed ich odpowiednikami wielkich liter. Wszystkie nie - alfabetyczne powinny być zestawiane w tej samej kolejności, w jakiej występują w ASCII).

Jak zauważyli inni, może to być zaburzone przez ustawienia środowiska związane z językiem: ogólnie LANG, a dokładniej LC_COLLATE. W najbezpieczniejszym przypadku może być uruchamianie poleceń zależnych od kolejności globalnego uporządkowania w ramach envpolecenia, aby wyczyścić środowisko (używając -ilub, -uw stosownych przypadkach) lub przepuścić wyniki, sortaby zapewnić niezawodne sekwencjonowanie.


4
Wygląda na to, że w procesie sortowania wszystkie znaki niealfanumeryczne są ignorowane . Tak więc „=”, „_”, „~” nie może być użyte do wymuszenia uruchomienia lub zakończenia pliku (odpowiednio) listy.
Otheus

3

Podczas gdy ekspansje glob są sortowane alfabetycznie, są one również zgodne z ustawieniami językowymi powłoki.

Pamiętaj, aby ustawić to na „C” w skrypcie, jeśli zamierzasz być przenośny.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.