Bash

在 Bash 中,萬用字元擴展是否保證有序?

  • August 5, 2021

Bash 中萬用字元的擴展是否保證按字母順序排列?我被迫將一個大文件分成 10 Mb 的片段,以便我的 Mercurial 儲存庫可以接受它們。

所以我想我可以使用:

split -b 10485760 Big.file BigFilePiece.

然後代替:

cat BigFile | bigFileProcessor

我可以:

cat BigFilePiece.* | bigFileProcessor

在它的位置。

但是,我找不到任何地方可以保證星號(又名萬用字元,又名*)的擴展總是按字母順序排列,所以它.aa在之前.ab(而不是時間戳排序或類似的東西)。

另外,我的計劃有什麼缺陷嗎?cat一起 ing 文件的性能成本有多大?

是的,globbing 擴展是按字母順序排列的。

Bash man頁面:

路徑名擴展

分詞後,除非-f已設置該選項,否則 bash 會掃描每個單詞中的字元*?[. 如果出現這些字元之一,則該詞被視為一種模式,並替換為按字母順序排列的與該模式匹配的文件名列表。

它記錄了行為,bash因此您可以在腳本中依賴它。很長一段時間以來,其他 Bourne 兼容的 shell 也是如此……儘管可能存在關於大小寫折疊或非字母數字字元的極端情況。

(結果列表bash將按幾乎“ASCII-betical”的順序排列——除了小寫和大寫字母將被整理在一起,就好像沒有大小寫差異一樣,但小寫字母在大寫等效項之前整理。所有非-alphabetics 應該按照它們在 ASCII 中出現的順序排列)。

正如其他人指出的那樣,這可能會受到與語言相關的環境設置的干擾:通常是 LANG,更具體地說是 LC_COLLATE。在命令下執行依賴於全域擴展排序的命令可能是最安全的,env以清除環境(使用-i-u酌情)或通過管道傳輸結果sort以確保穩健的排序。

引用自:https://serverfault.com/questions/122737