为什么 `man` 输出到 stdout 而不是 $PAGER (less)?

为什么 `man` 输出到 stdout 而不是 $PAGER (less)?

当我运行时man [program],手册页文本会在终端上输出(la cat,没有提供交互性的寻呼机),而不是打开手册页文件less(以便您可以滚动、搜索等):

➜ man git commit
GIT-COMMIT(1)                   Git Manual                  GIT-COMMIT(1)

NAME
       git-commit - Record changes to the repository

SYNOPSIS
[...the rest of the man page]

我已经验证echo $PAGER返回less.运行man -D -P less [program]仍然“像做的那样”输出到终端,而不像通常那样cat提供滚动或搜索等功能。less

使用调试标志-dman显示“ using /usr/bin/less as pager”。我对正在发生的事情感到茫然。

其他有用的信息:

➜ env | grep LESS       
LESS=-R -M
LESS_TERMCAP_mb=
LESS_TERMCAP_md=
LESS_TERMCAP_me=
LESS_TERMCAP_so=
LESS_TERMCAP_se=
LESS_TERMCAP_us=
LESS_TERMCAP_ue=
➜ echo $TERM     
xterm-256color

我确实只收到一个程序的错误。我不认为它直接相关,但请参阅这个 GH 问题详细信息。 tl;dr,出现的错误是troff: <standard input>:1: name expected (got '\ '): treated as missing

这也交叉发布到Manjaro 论坛在这里。

更新:

问题在于zpm-zsh/着色。我认为这样做\man会忽略该函数,但\只会忽略别名。删除此插件可以解决问题,但我想了解原因。

答案1

我运行的问题是与env.

哦我的 zsh 的彩色手册页env设置变量时使用:

function colored() {
    env \
        LESS_TERMCAP_mb=$(printf "\e[1;31m") \
        LESS_TERMCAP_md=$(printf "\e[1;31m") \
        LESS_TERMCAP_me=$(printf "\e[0m") \
        LESS_TERMCAP_se=$(printf "\e[0m") \
        LESS_TERMCAP_so=$(printf "\e[1;44;33m") \
        LESS_TERMCAP_ue=$(printf "\e[0m") \
        LESS_TERMCAP_us=$(printf "\e[1;32m") \
        PAGER="${commands[less]:-$PAGER}" \
        _NROFF_U=1 \
        PATH="$HOME/bin:$PATH" \
            "$@"
}

function man() {
    colored man "$@"
}

我还使用另一个插件,zpm-zsh/着色其路线env经过grv(通用调色剂)通过作为一个单独的函数调用env

function env () {
    =grc --colour=auto env "$@"
}

不管出于什么原因,都会做一些不喜欢的grc事情。man

解决方案:

1)不要env通过grc使用全局定义的函数来重新定义

2)env使用以下命令确保不是别名/函数command

function colored() {
    command env \
        LESS_TERMCAP_mb=$(printf "\e[1;31m") \
[....]
}

function man() {
    colored man "$@"
}

相关内容