如何让程序帮助文本自动通过less?

Mih*_*hai 6 bash

刚才,dpkg --help吐了三页的输出当着我的脸。我可能对前十行感兴趣,它们显示了一般用法和最常见的参数。

我希望这样,每当我--help以唯一参数运行程序(任何程序)时,如果输出长于$(tput lines),它将自动通过管道传输less。在 bash 中容易实现吗?

编辑:最后,对我来说最好的解决方案是切换到 zsh。您可以使用以下任一片段~/.zshrc;每个都有自己的权衡:

# Modify the input line before it runs
function lessify() {
    if [[ "$BUFFER" =~ " --help$" ]] ; then
        BUFFER="$BUFFER | less -FX"
    fi  
    zle accept-line
}

zle -N lessify_widget lessify
# Bind to the Enter key
bindkey '^M' lessify_widget
Run Code Online (Sandbox Code Playgroud)

或者

# Alias --help ; ignore rest of the line 
alias -g -- --help="--help | less -FX ; true "
Run Code Online (Sandbox Code Playgroud)

另外,在研究这个问题时,我浪费的时间可能比这节省的时间还要多。一点也不后悔。

Ste*_*itt 5

在 中bash,您可以使用调试功能执行此操作,尽管这是一个非常脆弱的解决方案,并且非常依赖于您的环境。

启用扩展调试(详见手册):

shopt -s extdebug
Run Code Online (Sandbox Code Playgroud)

创建一个帮助运行函数:

helprun() {
    if [ $# -eq 2 -a "$2" = "--help" ]; then
        $* | less -F
        return 1
    fi
}
Run Code Online (Sandbox Code Playgroud)

然后用它捕获所有命令:

trap "helprun \$BASH_COMMAND" DEBUG
Run Code Online (Sandbox Code Playgroud)

这将为helprun <command>每个命令运行,如果它是一个--help命令,则将其通过管道less传输,返回 1 以便该命令不执行(感谢extdebug)。如果不是,它只是正常运行。

可能有一些我没有在这里处理过的边缘情况......