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?

Sanki
źródło
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
źródło
@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.

Jim Dennis
źródło
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.

adapttr
źródło