"less"가 빈 파일 이름을 허용하고 일부 환경 변수를 표시하는 이유는 무엇입니까?

"less"가 빈 파일 이름을 허용하고 일부 환경 변수를 표시하는 이유는 무엇입니까?

실수로 빈 파일 이름을 사용하여 실행했는데 less실패할 것으로 예상했지만 놀랍게도 일부 환경 변수가 인쇄되었습니다.

$ less -XE ""
export LESSOPEN="| /usr/bin/lesspipe %s";
export LESSCLOSE="/usr/bin/lesspipe %s %s";

( -XE기본적으로 다음과 같이 동작합니다 cat.)

cat반면에 실패합니다.

$ cat ""
cat: '': No such file or directory

파일 이름을 완전히 생략하면 less오류가 발생합니다.

$ less -XE
Missing filename ("less --help" for help)

less이런 일을 하는가? 코드에 빈 파일 이름을 유발하는 버그가 있으면 가짜 출력이 표시되기 때문에 문제가 있다고 상상할 수 있습니다. (예를 들어, less "$(which nonexistent-script)".)

우리가 여기 있는 동안 왜 환경 변수를 인쇄합니까? 내 환경에서 나온 걸까요? 그것들은 동일합니다:

$ declare -p LESSOPEN LESSCLOSE 
declare -x LESSOPEN="| /usr/bin/lesspipe %s"
declare -x LESSCLOSE="/usr/bin/lesspipe %s %s"

확인했지만 man less,파일 이름매개변수가 명시적으로 문서화되지 않은 것 같습니다. 이에 대한 다른 언급은 이 행동과 관련이 없는 것 같습니다. 나는 또한less자주하는 질문.

답변1

근본적인 문제는 명령 less에 전달하는 파일 이름을 올바르게 인용하지 않는다는 것입니다 LESSOPEN."각 메타문자 앞에 백슬래시를 삽입하세요.", 즉 null 문자열을 전혀 처리하지 않는다는 의미입니다. 다음을 우회하면 예상대로 작동하는 것을 볼 수 있습니다 LESSOPEN.

$ less --no-lessopen ''
: No such file or directory

Ubuntu(그리고 Debian이라고 생각합니다)에서는 기본적으로 다음 LESSOPEN을 실행하여 구성됩니다.lesspipe 아무런 주장도 없이, 이는 자신을 핸들러로 설정하는 데 필요한 환경 변수를 인쇄합니다 LESSOPEN. 보다기본 .bashrc의 평가 표현식을 설명할 수 있습니까?. 따라서 null 인수로 실행할 때 less부적절한 인용으로 인해 전달되는 인수가 삭제되고 lesspipe해당 lesspipe구성이 인쇄됩니다.


추신

나는 에 대한 버그를 공개하는 것을 고려했지만 less이것은 나에게 큰 문제가 되지 않았습니다. 누군가가 주도권을 잡고 싶다면 꼭, 필요한 것이 있으면 알려주십시오. 한 가지 가능한 해결책(이전 버전과 호환되지 않음)은 less파일 이름을 전혀 인용하지 않고 대신 파일 이름을 LESSOPEN='| /usr/bin/lesspipe "%s"'.

lesspipe보다 자세한 구성 사용법을 권장하기 위해 버그를 공개하는 것도 좋은 생각일 수 있습니다 .

관련 정보