작은 파일의 경우 화면에 텍스트를 유지하려면 "less"를 사용하세요.

작은 파일의 경우 화면에 텍스트를 유지하려면 "less"를 사용하세요.

나는 오래 전에 일부 동료의 시스템에서 "more"를 모방하기 위해 less 명령을 사용자 정의하는 것을 본 적이 있다고 확신합니다. 내가 원하는 것은:

  • 파일이 짧은 경우(한 화면 미만) cat처럼 동작해야 합니다. 파일의 내용을 표시하고 종료합니다.

  • 파일이 한 화면보다 길면 평소대로 실행되어 사용자 입력을 기다리고 종료 시 화면을 지우고 이전 명령을 화면에 남겨 두어야 합니다.

-FX를 줄여서 실험해 보았지만 파일이 크면 화면에 많은 내용이 남게 됩니다.

답변1

내가 올바르게 이해했다면 대용량 파일에 대한 대체 화면 전환 동작을 유지하고 단일 화면에 맞고 스크롤이 필요하지 않은 작은 파일에 대해서만 -X 스위치를 켜기를 원할 것입니다.

이는 이제 문서에서 인용된 버전 530의 기본 동작입니다 less.NEWS소스 코드:

마이너 버전 487과 530 간의 주요 변경 사항

  • -F사용 및 파일이 한 화면에 맞는 경우 터미널 초기화 시퀀스를 출력하지 마십시오.

안타깝게도 2019년 현재 일부 배포판(예: Debian 10)은 여전히 ​​이전 버전을 사용하므로 이전 버전 less에서 전환하고 싶지 않은 경우원천, 유일한 해결책은 래퍼를 사용하는 것입니다.

다음은 그러한 래퍼의 예입니다. 알려진 제한사항은 다음과 같습니다.ㅏ):n( :p다음/이전 파일) 명령이 작동하지 않습니다 less. 명령줄의 모든 파일이 하나의 스트림으로 연결됩니다.비)/usr/bin/awk실제로 gawk(GNU Awk) 또는 Thomas Dickey가 아닌 이상 입력의 널 바이트를 처리할 수 없습니다..

#! /usr/bin/awk -f
BEGIN { "tput lines" | getline max; max -= 2 }
{ l[NR]=$0 }
NR>=max {
        for(i = 1; i <= NR; i++) print l[i] | "less";
        while(getline > 0) print | "less";
}
END { if (NR < max) for(i = 1; i <= NR; i++) print l[i] | "less -FX" }

답변2

이 문제를 해결하는 쉬운 방법은 없습니다.

less원래 화면을 깨끗하게 유지하기 위해 대체 화면을 사용하거나 사용하지 않을 수도 있습니다 -X.

less전체 페이지를 읽은 후 화면을 다시 가져와서 대체 화면을 사용하기 시작할 수는 없습니다 .

less올바른 모드에서 시작하여 데이터를 보내기 전에 적어도 한 페이지 또는 eof가 읽힐 때까지 기다려야 합니다 . 그것은 다음과 같습니다:

page_stdin() {
  awk -v l="${LINES:=$(tput lines)}" '
    cmd {print | cmd; next}
    {lines = lines $0 ORS}
    NR == l {cmd = "less"; printf "%s", lines | cmd}
    END {if (!cmd) printf "%s", lines | "less -FX"}'
}
mypager() {
  if [ "$#" -eq 0 ]; then
    page_stdin
  else
    for file do page_stdin < "$file"; done
  fi
}

(GNU를 사용하면 처음에 줄바꿈이 없으면 후행 줄바꿈을 추가하지 않음 으로써 awk바꿀 수 있습니다 ).ORSRT

cmd | mypager그러나 이는 전체 콘텐츠 페이지가 있거나 출력이 완료될 때까지 파이프된 명령의 출력이 표시되지 않음을 의미합니다 . (예를 들어 seq 200 | pv -qL40 | mypager와 비교해 보십시오 seq 200 | pv -qL40 | less).

그것은 당신이 그런 것을 사용하지 않는다고 가정하고 LESS=-s, 당신이 그것을 가지고 있지 않다면 화면보다 큰 줄에 속게 될 것이라는 점에 유의하십시오 LESS=-S.

답변3

이것을 터미널에 붙여넣으세요(또는 bashrc에 넣으세요):

less_cat(){
     [ "$(wc -l <"$1")" -ge "$LINES" ] && less "$1" || less -FX "$1"
}

이제 다음을 실행할 수 있습니다.

less_cat /etc/fstab
less_cat /var/log/messages 

그것은 당신이 원하는 것을 정확하게 할 것입니다.

노트:이 솔루션은 BASH/ZSH와 호환됩니다(설명 참조).

행운을 빌어요!

관련 정보