Bash
“區分大小寫是 Linux 文件系統而非 Linux 作業系統的功能”是什麼意思?
我剛剛讀到下面的句子:
區分大小寫是 Linux 文件系統而非 Linux 作業系統的功能。
我從這句話中得出的結論是,如果我在 Linux 機器上,但我正在使用使用 Windows 文件系統格式化的設備,那麼區分大小寫將不是問題。
我嘗試了以下方法來驗證這一點:
$ ~/Documents: mkdir Test temp $ ~/Documents: touch Test/a.txt temp/b.txt $ ~/Documents: ls te* b.txt
它只列出了
temp
目錄中的文件,這是預期的,因為我在 Linux 文件系統中。當我導航到 Windows 文件系統(注意:我使用的是 WSL2)時,我仍然得到相同的結果,但我希望它會列出兩個目錄中的文件,而忽略區分大小寫。
$ /mnt/d: mkdir Test temp $ /mnt/d: touch Test/a.txt temp/b.txt $ /mnt/d: ls te* b.txt
我用 bash 和 zsh 都試過了。
我覺得它在某種程度上與 bash(或 zsh)有關,因為我還讀到 bash 強制區分大小寫,即使在使用不區分大小寫的文件系統時也是如此。
此測試適用於 Powershell,因此這意味著文件系統確實不區分大小寫。
在這裡,您正在執行:
ls te*
使用您的shell的一項稱為通配或文件名生成(POSIX 中的路徑名擴展)的功能,而不是 Linux 系統或 Linux 上使用的任何文件系統的功能。
te*
由 shell擴展為與該模式匹配的文件列表。為此,shell 向系統請求目前目錄中的條目列表(通常使用
readdir()
C 庫的函式,該函式在下面將使用系統特定的系統呼叫(getdents()
在 Linux 上)),然後將每個名稱與模式。除非您已將 shell 配置為不區分大小寫(請參閱
nocaseglob
zsh 或 bash 中的選項)或使用 glob 運算符來切換不區分大小寫(如 中的(#i)
擴展 glob 運算符zsh
),te*
否則只會擴展到名稱為的文件列表以readdir()
開頭報告te
,即使系統或下面的文件系統上的路徑名解析不區分大小寫或可以像 NTFS 一樣。