为何同一份less二进制文件以less和more调用时行为不同?
为何同一份less二进制文件以less和more调用时行为不同?
这事儿其实是less的一个有点“心机”的设计——它会根据调用它的程序名(也就是程序启动时拿到的argv[0]值)自动切换行为模式!
核心原因拆解
- 当你用
less这个名字调用它时,它会以完整的less原生模式运行,这时候会严格校验终端环境(比如$TERM变量的完整性),如果它判断你的终端配置达不到它的要求,就会弹出WARNING: terminal is not fully functional的提示。 - 当你用
more这个名字调用它时(不管是通过硬链接、软链接还是直接改名),它会自动切换到more兼容模式。这个模式下,它会模拟传统more工具的行为逻辑,同时放宽了终端环境的校验标准,自然就不会抛出终端相关的警告。
结合你的验证结果来看
从你给出的命令输出完全能确认:/usr/bin/less和/usr/bin/more是同一个二进制文件的硬链接(文件链接数都是2,SHA256哈希值完全一致),本质上运行的是同一个程序——只是程序启动时“看到”自己被叫做more,就自动切换了行为模式。
额外小验证
你可以试试这两个操作来印证这个逻辑:
- 用
less强制开启more模式:less -m,这时候它的行为会和直接调用more一致,也不会弹出终端警告; - 查看less的手册(
man less),里面会明确提到“当程序名为more时,自动启用more兼容模式”的相关说明。
至于你提到的Tmux的$TERM配置问题:less的原生模式对$TERM的定义要求更高(比如可能需要tmux-256color而非tmux),但more兼容模式下对终端的适配更宽松,这才出现了两种调用方式的差异。
备注:内容来源于stack exchange,提问作者Anton Strogonoff
相关产品推荐
相关产品推荐

