我使用的是 macOS Monterey 12.0.1。当我运行终端应用程序时,它通知我“默认交互式 shell 现在是 zsh。”好的。
今天我跑去make
编写一个程序,但我的大写锁定键是打开的,所以我输入了MAKE
。令人惊讶的是,它成功了!
所以我检查了一下,确实有一个全大写的MAKE
:
$ ls -l /usr/bin/MAKE
-rwxr-xr-x 1 root wheel 137696 Oct 17 23:30 /usr/bin/MAKE
有意思!那么也许 macOS 有一些常用实用程序的全大写变体?我决定检查其他可能性:
$ cd /usr/bin
$ ls [A-Z]*
AssetCacheLocatorUtil DeRez IOMFB_FDR_Loader SafeEjectGPU
AssetCacheManagerUtil GetFileInfo ResMerger SetFile
AssetCacheTetheratorUtil IOAccelMemory Rez SplitForks
等一下...在哪里MAKE
?
$ ls -l MAKE
-rwxr-xr-x 1 root wheel 137696 Oct 17 23:30 MAKE
还在那儿。
$ ls -l M*
ls: M*: No such file or directory
不在那里!
有人知道这是怎么回事吗?它是不是隐藏在普通ls
和 shell 文件名通配符中?甚至ls -a
不显示它。
答案1
默认情况下,macOS 会创建保留大小写但不区分大小写的文件系统。因此“MAKE”与“make”匹配。
如果您希望严格区分大小写,则需要使用磁盘工具创建区分大小写的 APFS 文件系统并在该文件系统上安装 macOS。
编辑后添加:
还要注意,通配符(例如ls /usr/bin/M*
)的工作方式与指定精确的文件名(例如ls /usr/bin/MAKE
)不同,因为在前一种情况下,shell 会要求列出目录,然后自行进行匹配,因此它遵循bash
正常的区分大小写的通配符规则,但在后一种情况下,它要求操作系统的文件系统 API 匹配精确的文件名,因此在这种情况下,macOS 的文件系统 API 会进行不区分大小写的匹配。