【问题标题】:How to extend the "less" command behavior?如何扩展“less”命令行为?
【发布时间】:2010-10-20 08:41:17
【问题描述】:

一般情况下,我想大家只使用“less”命令来读取纯文本文件的内容。

但是在 Gentoo 上,less 命令行似乎比我在其他 Linux 发行版或 Cygwin、Mac OS X 上使用的命令行更强大... Gentoo 上的 less 命令能够列出压缩存档文件,ELF头和可执行文件的其他信息,也许更多...... 我不记得它是在什么平台上使用的,但我认为也可以使用某些版本的“less”来阅读 PDF 文件(或者这只是一个梦想?)。

所以我想知道是否有一种方法可以轻松地为 less 命令进行扩展,例如使其能够读取(以一种很好的方式显示)某种格式的二进制文件。我在 Google 上搜索了这方面的信息,但没有找到任何信息。

【问题讨论】:

    标签: unix binary


    【解决方案1】:

    你看过lesspipe.sh吗?

    实际上,lesspipe.sh 仅在管道传输到 less 之前处理文件或 url。顺便说一句,我没有使用这个,但我经常输入ps2ascii some.pdf | less 来阅读pdf文件。

    【讨论】:

      【解决方案2】:

      根据this页面和this页面,less已经支持PDF,至少在那个版本中

      我尝试减少几个不同的 PDF 文件,看起来有些是基于图形的,有些是基于文本的。我能够阅读基于文本的那些,但不是图形的,因为它们都是命令而不是太多的文本。

      【讨论】:

        【解决方案3】:

        刚刚在我的 Mac 上做了一个“少人”。 less 可以与输入预处理器一起使用。手册页有一个设置预处理器 shell 脚本以处理档案的示例。预处理器识别扩展名并将未压缩的文件输入 less。您可以使用环境变量 LESSOPEN 和 LESSCLOSE 指定预处理器脚本。

        也许您的全功能系统有一些由 LESSOPEN 指定的脚本。在您的环境中寻找 LESSOPEN。

        酷,我学到了一些新的东西来寻找答案。

        注意:我通常使用“readelf -h”来转储 ELF 标头。当我进行交叉编译并需要验证库格式时非常有用。

        【讨论】:

          【解决方案4】:

          尝试使用“man lessfile”和“man lesspipe”获取有关此行为的文档。

          在 Ubuntu 上,less 默认将 PDF 处理为纯文本。 (实际上我觉得这很烦人,因为当我输入“less something.pdf”时,通常是因为我想查看原始 PDF。不过,对于单文件情况,可以轻松地使用“less

          【讨论】:

            【解决方案5】:

            我对此进行了调查,因为我可以看到许多带有 less 的二进制文件,但有时,不支持二进制类型,添加支持会很棒...

            首先,我想报告一下,这实际上已记录在案:

            man lesspipe
            

            您最好使用 C 或 C++ 等语言创建脚本甚至二进制文件,并将可执行代码放入:

            ~/.lessfilter
            

            默认的lesspipe 脚本将运行该可执行文件,如果它存在并且是可执行的(x 权限位设置)。如果您输出结果然后成功退出(exit 0),则会显示该输出。如果您无法识别输入文件,您可以直接退出并返回错误 (exit 1)。

            这是一个显示 ELF 文件 headers 的示例(我在检查此类文件时希望看到的内容):

            #!/bin/bash -e
            # Detect file type using `file ...` instead of extension
            MIME=`file --brief --mime-type "$1"`
            case "${MIME}" in
            "application/x-sharedlib")
                objdump -x $1
                exit 0
                ;;
            esac
            exit 1
            

            您可以非常轻松地扩展该脚本,添加新案例并运行您想要生成您喜欢的输出的任何命令。

            这样,你甚至可以从默认脚本中劫持一些已经实现的功能。

            注意:实际上有一个名为 lesspipe 的 github 项目,它的文件版本比当前支持的 Debian 包要好得多。


            找到正确答案的步骤

            我认为查看/usr/bin/lesspipe 接近正确答案。但是,这似乎暗示您必须更新该脚本,并且每次更新相应的包时都会覆盖此操作。

            不过,看看脚本,它告诉我们我们可以拥有自己的扩展。

            首先,$LESSOPEN 变量很重要。这就是定义lesspipe 脚本位置的原因。它位于 Ubuntu 上的 /usr/bin 下,它可能位于不同 Unix 系统的其他位置。

            所以我们首先要查看脚本的位置:

            echo $LESSOPEN
            

            就我而言,我看到了:

            | /usr/bin/lesspipe %s
            

            也就是说,通过管道输出lesspipe 脚本。这应该是lesspipe 刚刚创建的临时文件名。如果没有输出文件名,则输入文件直接用less显示。

            现在,为了让我们扩展 lesspipe 脚本以支持新的二进制文件类型,请查看该脚本并注意到此部分:

                        if [ -x ~/.lessfilter ]; then
                                ~/.lessfilter "$1"
                                if [ $? -eq 0 ]; then
                                        if [ $BASENAME = $LESSFILE ]; then
                                                if [ -s $TMPFILE ]; then
                                                        echo $TMPFILE
                                                else
                                                        rm -f $TMPFILE
                                                fi
                                        fi
                                        exit 0
                                fi
                        fi
            

            这告诉我们可以在~/.lessfilter 下拥有自己的脚本。

            这是一个 shell 脚本,甚至是一个 ELF 二进制文件。任何可以执行的东西,真的,如果它产生了一些有效的输出,就可以用 0 退出。

            请注意,代码更进一步并在该事件中回显$TMPFILE。我不知道为什么会这样,因为$TMPFILE 通常是空的。我们在我们的脚本中所要做的(您可以在下面的lesspipe 脚本中看到相同的内容)就是将我们想要的任何内容写入标准输出(文件描述符1)并以0退出。其余的按预期工作并且它使您的脚本非常简单(与处理许多其他情况的 lesspipe 脚本相比,例如 - 作为输入,您可以忽略这些情况)。

            【讨论】:

              【解决方案6】:

              较少是开放的,如果您不喜欢现有的,只需获取更新的。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2019-08-21
                • 1970-01-01
                • 1970-01-01
                • 2017-08-17
                • 2011-03-26
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多