"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 is LESSOPEN로 시작할 수 없습니다 .|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쉘의 초기화 파일에서 실제로 이것을 설정했다는 것을 기억하는 것입니다.

관련 정보