/usr/bin/MAKE 同时存在和不存在

/usr/bin/MAKE 同时存在和不存在

我使用的是 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 会进行不区分大小写的匹配。

相关内容