使用 `less` 时会发出“终端功能不全”警告,但使用 `more` 时不会发出警告(后者也是 `less`)

使用 `less` 时会发出“终端功能不全”警告,但使用 `more` 时不会发出警告(后者也是 `less`)

less抱怨我的 值$TERM,而则不抱怨。除了之外more, 都很好。moreless

最初,我对工具突然不喜欢我的值感到困惑$TERM(我以为我tmux$TERM几次系统重启之前将 Tmux 配置为使用它),但一个更大的问题刚刚出现了:为什么两个字节相同的二进制文件的行为不同?

❯ less
WARNING: terminal is not fully functional
Missing filename ("less --help" for help)

❯ more
Missing filename ("less --help" for help)

❯ echo (which less) (which more)
/usr/bin/less /usr/bin/more

❯ ls -Al /usr/bin/less
-rwxr-xr-x  2 root  wheel  384848 May 13 06:29 /usr/bin/less*

❯ ls -Al /usr/bin/more
-rwxr-xr-x  2 root  wheel  384848 May 13 06:29 /usr/bin/more*

❯ openssl dgst -sha256 /usr/bin/less
SHA2-256(/usr/bin/less)= 8567f60723d396cb9c6e8d0a5f5206f321adbb2982d71e75cd6ec32be4256591

❯ openssl dgst -sha256 /usr/bin/more
SHA2-256(/usr/bin/more)= 8567f60723d396cb9c6e8d0a5f5206f321adbb2982d71e75cd6ec32be4256591

❯ echo $TERM
tmux

❯ tmux -V
tmux 3.3a

❯ echo $SHELL
/opt/local/bin/fish

这是在 macOS 中。如果这是 Mac 独有的黑魔法,我当然会将其移至 Ask Different。

答案1

如果使用不同的参数运行同一个程序,其行为可能会有所不同:在第一个命令中,它接收argv[] = {"less", NULL}命令行参数数组,而第二个命令使用 调用它argv[] = {"more", NULL},其中 argv 中的第 0 项始终是程序自己的名字(“正常”参数从 1 开始)。

这有时用于创建“多呼叫”程序,最著名的是 BusyBox,它在小型系统中提供几乎整个 /bin(例如在您的 Wi-Fi 路由器中)。

如果以 的形式调用“less”程序more,其参数数组将具有argv[0] == "more",这使得“POSIX more(1) 兼容性“Less 中的代码。(例如,它不是在环境变量中寻找其他选项,LESS而是在中寻找它们MORE。)

相关内容