題:
OS X中的bash不區分大小寫嗎?
verboze
2011-08-17 20:41:59 UTC
view on stackexchange narkive permalink

OSX上的bash命令是否不區分大小寫?我鍵入“哪個TR”,它顯示/ usr / bin / TR,儘管那裡沒有這樣的二進製文件。對於其他二進製文件,大寫時也是一樣。還是Terminal.app可能正在執行此翻譯?如何關閉此功能?

出於好奇,您為什麼要關閉此功能?
這是一個引人注目的問題。 Bash有一個** nocaseglob **選項來控制大小寫是否匹配範圍,但是這種小技巧比普通的`locale`和** completion-ignore-case ** / ** nocaseglob **更深
我想將其關閉的原因確實很愚蠢。在shell上工作時,我習慣於區分大小寫。我只是擔心此功能會使我絆倒。例如,我編寫了一個bash腳本,錯誤鍵入了“ lS”;該腳本將在OSX上正常運行。我將其移到我的cenTOS框中,然後中斷了。當然,這將很容易檢測和修復,但是如果我可以使腳本在兩個系統之間以相同的方式工作,則可以完全避免這種情況。我是偶然發現的,到目前為止還沒有什麼麻煩,因此我可能不會僅為此目的而進行更改文件系統的練習。
您之所以要關閉此功能,是因為不區分大小寫會導致某些應用程序出現問題,例如SVN。不區分大小寫的globbing很有用,但是如果您創建一個名為“ Foo”的文件,SVN將會非常混亂,然後存儲庫會以某種方式創建對“ foo”的引用。
禁用的另一個原因:自1980年以來,我的路徑中一直有腳本〜/ bin / CC。cc加上一些令人愉快的默認值。它從UNIX v6到v7,Eunice,BSD 4.1、4.2、4.3,SVr4,Xenix,Gould UTX,Linux,cygwin等都可以使用,並且在MacOS上首次失敗,無限遞歸。
我想知道是否可以利用HFS +的大小寫無關性來解決安全漏洞。谷歌搜索發現該問題已經遇到 http://article.gmane.org/gmane.linux.kernel/1853266 http://www.itworld.com/article/2868393/linus-torvalds-apples-hfs-is-probably-the-worst-file-system-ever.html 2015年1月 儘管已在Git中修復,但對於Mac來說,這是一個等待發生的漏洞 曾經從其他類似UNIX的用戶安裝過軟件的用戶 區分大小寫的系統。 因此,對於從區分大小寫的iOS移植到Mac OS X的代碼,這可能是一個潛在的安全漏洞。
這也把我搞砸了。在OSX上運行良好的構建和開發部署在Ubuntu上無法通過測試,因為我在gulp腳本中輸入的字母小寫而不是大寫。我不喜歡此功能,因為它可以容忍您的生產系統絕不會出現的錯誤。
這確實讓我感到震驚,因為在CentOS上工作時,無法在macOS終端上工作的東西對我來說不起作用,並且我一直盯著代碼,直到我意識到Mac上存在不區分大小寫的可能性。
五 答案:
DarkDust
2011-08-17 21:40:51 UTC
view on stackexchange narkive permalink

這實際上是磁盤文件系統的功能,而不是bash或Terminal.app。

HFS +(Mac文件系統)通常配置為不區分大小寫,但保留大小寫。這意味著文件系統會認為 foo FoO 相同,但是當您創建新文件時,它將記住哪些字母大寫,哪些字母大寫。 / p>

使用HFS +格式化磁盤時,可以選擇文件系統是否區分大小寫。如果選擇使用UFS(Unix FileSystem)格式化,則始終區分大小寫,即AFAIK。

要檢查磁盤是否區分大小寫,請運行:

  diskutil info <device>  

例如:

  diskutil info disk0s2  

查找名稱:線。如果讀取的內容類似於 Mac OS Extended(區分大小寫,日記),則表示它區分大小寫。如果它只是讀取 Mac OS Extended (不區分大小寫),那麼它只是區分大小寫,而不是區分大小寫

HFS +確實有點奇怪,能夠*同時*識別和忽略大小寫。我的答案中沒有保留您的大小寫注意事項,並且對於基於Unix的操作系統非常重要,在Foo和FOO是2個不同的文件的情況下,通常應該區分大小寫。我懷疑這種行為是在Mac OS 9 HFS和Mac OS X HFS +之間發生的,以及經典和新應用程序都應理解的要求。
在Unix之外,保留大小寫的情況並不罕見。例如,NTFS是類似的:默認情況下不區分大小寫,但是您可以對其進行格式化。我還認為*不區分大小寫是默認設置*是通過Mac OS 9來實現的,但是許多Mac和Windows開發人員在這方面很懶惰並且不關心正確的大小寫,因此幾乎不可能切換到區分大小寫默認情況下,它會破壞很多應用程序。來自Unix,一開始我也覺得很奇怪。
我沒有回頭再看,但是我很確定Mac OS自最初的1984 Mac(使用MFS-Macintosh File System-格式化其400k格式)以來就使用了保留大小寫(但不區分大小寫)的文件系統。軟盤)
我必須承認,我從未使用過Classic Mac OS,所以是在猜測。無論哪種方式,這都是答案,DarkDust比我說得更好,所以我認為應該接受這一點。
出於可用性方面的考慮,Mac OS的每個版本都不區分大小寫但保留。儘管UNIX傾向於精度(文件名的逐字節比較),但對於最終用戶而言,這可能是一個可用性夢night,他們不小心保存了“ Resume”和“ REsume”,然後在打開錯誤的版本並且所有更改都消失了時感到困惑。
感謝您對DarkDust的解釋,非常有用。有趣的是,我已經使用OSX多年了,但從未註意到,直到昨天我不小心輸入了“ LS”,但令我驚訝的是,我收到了我期望的來自“ ls”的輸出。
另一方面,當在命令行中鍵入“ HEAD”導致執行程序/ usr / bin / head(顯示文件的第一行)而不是/ usr時,它也可能是“可用性噩夢” / local / bin / HEAD(來自LWP:發出HTTP“ HEAD”請求)。
認為每個大寫字符都有一個小寫等效項,反之亦然,這是英語編程人員的典型情況,與語言環境無關。我不知道土耳其語採用了什麼解決方案,其中虛線的小寫字母“ i”對應於點綴的大寫字母“İ”,而無點的大寫字母“ I”對應於DOTLESS小寫字母“ı”,但是有任何解決方案會很不好那德國的“ß”又怎麼用大寫“ 2”的字母呢?並在大寫時經常忽略的口音?而且...區分大小寫消除了所有這些頭痛問題。
只是一個旁注。自2017年推出macOS 10.13(High Sierra)以來,mac已從HFS +轉移到Apple File System(APFS)。
FreddyBushBoy
2014-01-01 01:58:28 UTC
view on stackexchange narkive permalink

我通過遵循 http://blog.nickburwell.com/blog/2008/11/mac-os-x-terminal-case-insensitive-auto

 回顯“將完成設置-忽略情況設置為開” >>〜/ .inputrc  
這似乎是回答OP中“如何關閉此功能”部分的唯一答案。
stuffe
2011-08-17 20:48:18 UTC
view on stackexchange narkive permalink

看看您的文件系統,因為HFS上存在區分大小寫和不區分大小寫的變體。默認值是不區分大小寫的,在這種情況下,它不是BASH的情況,而是基礎文件系統。您可以通過以下方式進行測試:使用區分大小寫的選項格式化備用USB記憶棒,然後復製文件以重複測試等。

elves
2017-04-21 12:02:03 UTC
view on stackexchange narkive permalink

Bash絕對區分大小寫。

我剛剛在終端中輸入了 whoami ,大寫鎖定按鈕處於打開狀態。

我收到的回應與 WHOAMI 完全不同。

我可以看到有一個 WHOAMI 命令和哪個,但是用 ls 找不到。

這不是外殼區分大小寫,而是`whoami`程序本身。它實際上是與`id`相同的程序,但是會檢查它是以哪個名稱運行的,並且如果以“ whoami”的名稱運行,則會使用不同的輸出(等效於`id -un`)。*該*支票區分大小寫。比較“ id”,“ WHOAMI”,“ WhOaMi”,“ WhoAmI”等的輸出。此外,比較“ ls -li / usr / bin / whoami”和“ ls -li / usr / bin / WHOAMI”的輸出`,並註意inode編號(輸出中列出的第一件事)是相同的-它們是指定完全相同文件的兩種不同方式。
Izana
2020-01-08 01:37:30 UTC
view on stackexchange narkive permalink

這是您的文件系統內容。

我正在使用APFS,它也不區分大小寫,但保留大小寫。這篇帖子提供了有關H(ierarchical)FS和APFS的很好的解釋。

  #include <sys / stat.h>
    #include <iostream>

    int main(int argc,char ** argv){
      struct stat sb;
      int ret = stat(argv [0],&sb);
      std :: cout << ret << std :: endl;
    }
 
使用 stat

此程序的輸出:

 ➜./a.out ./test_dir/cat.png
0
➜./a.out ./test_dir/caT.png
0
 

一個簡單的bash測試

 ➜cp cat.png caT.png
cp:caT.png和cat.png相同(未復制)。
 

對於bash來說,如果您使用默認的HFS或APFS,我認為在Mac OS上它也不區分大小寫,因為命令可執行文件也是文件,並且在鍵入命令名稱時,該名稱將用於通過搜索路徑進行搜索以查找要執行的文件。

 ➜echo x X
X
➜eChO x X
X

 
這是不贊成投票的情況:為不贊成投票提供一個理由。該答案與其他答案同樣有效,並且在其他有用的背景下進行鏈接。


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...