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

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

刚才,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

或者

# Alias --help ; ignore rest of the line 
alias -g -- --help="--help | less -FX ; true "

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

答案1

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

启用扩展调试(请参阅详细信息请参阅手册):

shopt -s extdebug

创建一个 helprun 函数:

helprun() {
    if [ "$#" -eq 2 ] && [ "$2" = '--help' ]; then
        "$@" | less -F
        return 1
    fi
}

然后用它捕获所有命令:

trap 'helprun $BASH_COMMAND' DEBUG

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

可能有一些边缘情况我没有处理过......

答案2

另一种方法是编写一个执行相同操作的脚本:

#!/bin/bash
$1 --help | less -F

Help例如,调用它,chmod +x Help使其成为可执行文件并将其放置在您的某个位置PATH,例如/bin/usr/bin。然后每次你想列出程序的帮助时,你Help <program>都可以使用<program> --help.

相关内容