我对此进行了调查,因为我可以看到许多带有 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 脚本相比,例如 - 作为输入,您可以忽略这些情况)。