ls命令默认不解引用目录符号链接 如何配置默认解引用行为
问题现象
当使用ls命令查看指向目录的符号链接时,ls仅回显该符号链接自身的名称,复现示例如下:
➜ java-tutorial git:(main) ls -al ... lrwxr-xr-x 1 josalvatorre staff 124 Jul 9 16:17 bazel-bin -> /private/var/tmp/_bazel_josalvatorre/0614f10b8ea3a5a2198fe449cfe635ce/execroot/__main__/bazel-out/darwin_arm64-fastbuild/bin ... ➜ java-tutorial git:(main) ls /private/var/tmp/_bazel_josalvatorre/0614f10b8ea3a5a2198fe449cfe635ce/execroot/__main__/bazel-out/darwin_arm64-fastbuild/bin ProjectRunner ProjectRunner.jar-0.params ProjectRunner.jdeps _javac ProjectRunner-native-header.jar ProjectRunner.jar-1.params ProjectRunner.runfiles external ProjectRunner.jar ProjectRunner.jar_manifest_proto ProjectRunner.runfiles_manifest ➜ java-tutorial git:(main) ls bazel-bin bazel-bin
该表现和过往使用记忆不符,执行查阅到的命令时会出现非预期结果,当前环境为M1芯片Mac设备、zsh终端、oh-my-zsh配置框架。
后续追问
已知-H和-L两个解引用参数可以实现列出软链指向目录内容的预期效果,如何将该解引用行为设置为ls的默认行为?
原因说明
这个现象是不同版本ls的默认行为差异导致的,和终端、shell配置、芯片架构没有直接关系:
- macOS系统自带的是BSD版本的
ls,默认规则是:如果传入的路径参数是指向目录的符号链接,不会自动跟随链接进入目标目录,仅输出符号链接本身的名称 - 绝大多数Linux发行版默认搭载的是GNU coreutils版本的
ls,默认会对命令行直接传入的目录软链做解引用,列出目标目录内容,也就是记忆里的常规表现。
两个解引用参数的区别:
-H:仅对命令行直接传入的符号链接做解引用,遍历目录内容时遇到的符号链接不会自动跟随,行为和GNU版ls默认逻辑一致-L:对所有遇到的符号链接全部做解引用,不管是直接传入的参数还是目录遍历中发现的软链,使用时容易出现目录遍历循环、路径识别混乱的问题,日常使用不推荐作为默认参数。
设置默认解引用的方法
所有配置均针对zsh环境,根据使用的ls版本不同,配置方式略有区别:
继续使用系统自带BSD版
ls
编辑用户目录下的.zshrc文件,添加别名配置:alias ls='ls -H'保存后执行
source ~/.zshrc让配置立即生效。如果配置后不生效,检查.zshrc中oh-my-zsh的加载段,把自定义的别名配置放到oh-my-zsh加载逻辑的后面,避免被框架自带的别名覆盖。替换为GNU版
ls获得和Linux完全一致的行为
先通过homebrew安装coreutils工具集:brew install coreutils安装完成后GNU版
ls会以gls命令名存在,同样在.zshrc中添加别名替换默认ls:alias ls='gls --color=auto'执行
source ~/.zshrc生效后,不需要额外加参数就会默认对命令行传入的目录软链做解引用,和Linux环境下的ls行为完全对齐。
内容的提问来源于stack exchange,提问作者José Alvarado Torre
相关产品推荐
相关产品推荐

