![如何让程序帮助文本自动通过less管道?](https://linux22.com/image/61081/%E5%A6%82%E4%BD%95%E8%AE%A9%E7%A8%8B%E5%BA%8F%E5%B8%AE%E5%8A%A9%E6%96%87%E6%9C%AC%E8%87%AA%E5%8A%A8%E9%80%9A%E8%BF%87less%E7%AE%A1%E9%81%93%EF%BC%9F.png)
刚才,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
.