「zless」を使用して圧縮ファイルを表示するのに問題がありますが、「zmore」または「gunzip -c」を使用しない場合、問題が発生します。

「zless」を使用して圧縮ファイルを表示するのに問題がありますが、「zmore」または「gunzip -c」を使用しない場合、問題が発生します。

私のFreeBSD 13.2システムでは、ユーティリティは圧縮されていないテキストファイルまたはzless圧縮されたテキストファイルの表示に失敗し、そのファイルがバイナリである可能性があるという警告を表示し、コンテンツを表示したい場合はゴミを表示します。奇妙なことに、使用または動作しているようです。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簡単に言うと、これは「安全」モードで実行されたときに内部パイプコマンドが無効になっているためです。つまり、if isLESSOPENで始めることはできません。|LESSSECURE1

しばらく調べた後、実行可能ファイル自体を調べzlessました。zmore

FreeBSDでは、両方ともシェルスクリプトですが、zmoreより伝統的なラッパーgzip(圧縮解除用)とless(圧縮解除された文書を表示するため)のzless短いシェルスクリプト呼び出しを実行しless、環境変数をLESSOPENCall the scriptに設定します/usr/bin/lesspipe.sh

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

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

lesspipe.shスクリプトには、case入力ファイルのファイル名サフィックスに基づいて正しい解凍ユーティリティを呼び出すステートメントが含まれていますが、ここでは重要ではありません。要点は、LESSOPEN内部パイプコマンドが環境変数に使用されることです。

環境変数LESSSECUREがに設定されている1場合は、less「安全」モードで実行されます。この場合、ユーティリティは|(パイプ)コマンドを無視します。

パズルの最後の部分は、LESSSECURE=1シェルの初期化ファイルで実際にこれを設定したことを覚えておくことです。

関連情報