使用“zless”查看压缩文件时出现问题,但使用“zmore”或“gunzip -c”则不会

使用“zless”查看压缩文件时出现问题,但使用“zmore”或“gunzip -c”则不会

在我的 FreeBSD 13.2 系统上,该实用程序无法查看用或zless压缩的文本文件,警告它们可能是二进制文件,然后如果我说我想查看内容,则显示垃圾。奇怪的是,使用or似乎有效。gzipcompresszmoregunzip -c

$ zless znapzend.log.1.gz
"znapzend.log.1.gz" may be a binary file.  See it anyway?

(回答肯定则将二进制数据发送到终端。)

$ zless --version
less 608 (POSIX regular expressions)
Copyright (C) 1984-2022  Mark Nudelman

less comes with NO WARRANTY, to the extent permitted by law.
For information about the terms of redistribution,
see the file named README in the less distribution.
Home page: https://greenwoodsoftware.com/less
$ zmore --version
less 608 (POSIX regular expressions)
Copyright (C) 1984-2022  Mark Nudelman

less comes with NO WARRANTY, to the extent permitted by law.
For information about the terms of redistribution,
see the file named README in the less distribution.
Home page: https://greenwoodsoftware.com/less

这是什么原因呢?

答案1

简而言之:这是由于less在“安全”模式下运行时内部管道命令被禁用,即LESSOPEN无法以|if LESSSECUREis启动1

在研究了一段时间后,我查看了zlesszmore可执行文件本身。

在 FreeBSD 上,两者都是 shell 脚本,但 whilezmore是更传统的包装器gzip(用于解压缩)和less(用于查看解压缩的文档),zless是一个更短的 shell 脚本调用,less并设置环境变量LESSOPEN来调用脚本/usr/bin/lesspipe.sh

#!/bin/sh
#
# $FreeBSD$
#

export LESSOPEN="||/usr/bin/lesspipe.sh %s"
exec /usr/bin/less "$@"

然后,该lesspipe.sh脚本包含一条case语句,该语句根据输入文件的文件名后缀调用正确的解压缩实用程序,但这在这里并不重要。重点是LESSOPEN环境变量中使用了内部管道命令。

当环境变量LESSSECURE设置为时1less以“安全”模式运行。在这种情况下,实用程序会忽略|(pipe) 命令。

难题的最后一部分是记住我实际上LESSSECURE=1在 shell 的初始化文件中进行了设置。

相关内容