
실수로 빈 파일 이름을 사용하여 실행했는데 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
보다 자세한 구성 사용법을 권장하기 위해 버그를 공개하는 것도 좋은 생각일 수 있습니다 .