차단하지 않고 끝까지 스크롤하는 횟수 감소

차단하지 않고 끝까지 스크롤하는 횟수 감소

less프로세스를 파이프 한 다음 프로세스의 끝을 스크롤하는 명령을 실행하고 싶습니다.현재의파이프 텍스트. 즉, 명령이 표준 출력을 닫지 않은 경우 Shift+G가 차단되므로 장기 실행 명령의 경우 완료될 때까지 끝이 표시되지 않습니다.

예를 들어:

i=0; while true; i=$((i+1)); do echo $i; sleep 0.001; done | less

페이지 매김을 시작할 때 Shift+G를 누르면 less아래로 스크롤되지 않고 무기한 차단됩니다.

걱정하지 마세요.완충기- 버퍼가 너무 많은 지연을 일으키지 않을 정도로 출력이 자주 발생합니다. 대신, 현재 버퍼의 끝으로 스크롤할 때 멈추지 않기를 원합니다.앞으로버퍼의 끝도 볼 수 없도록 디스플레이를 업데이트하세요.)

답변1

내가 처리하는 방법은 출력을 파일에 쓴 다음 파일에 페이지를 매기는 것입니다. 귀하의 예를 사용하면 다음과 같습니다.

i=0; while true; i=$((i+1)); do echo $i; sleep 0.001; done >/tmp/somefile
less /tmp/somefile

단점은 출력을 생성하는 프로세스에 따라 /tmp/somefile임의로 커질 수 있다는 것입니다.

파이프를 통해 쓰기/읽기 대신 파일을 사용하는 이유는 실용적입니다. 유틸리티 less는 파이프에서 읽는지 아니면 파일에서 읽는지에 따라 다른 응답을 갖습니다. 파일을 읽을 때 파일의 끝을 "알고" 즉시 찾을 수 있습니다. 나중에 파일이 커지면 또 다른 검색 end( G)가 끝점을 다시 결정하고 해당 새 지점을 다시 검색합니다. 반면에 파이프 끝을 찾으면 파이프가 닫힐 때까지 차단됩니다. (이 차단 효과는 파이프가 버퍼링되든 버퍼링되지 않든 상관없이 적용됩니다.) 일단 less차단되면 응답만 하며 Ctrl C, 이는 보고 싶은 출력을 생성한 프로세스에도 영향을 미칩니다. 불행히도 이것은 종종 역효과를 낳습니다.

답변2

이 옵션이 새로운 것인지는 모르겠지만 ESC-G문제에 대한 정확한 해결책인 것 같습니다. 매뉴얼에 따르면:

  ESC-G  Same  as  G,  except  if  no number N is specified and the input is standard input, goes to the last line which is currently buffered.

하지만 불행히도 CLI에서 less 에 전달하는 방법을 찾지 못했습니다.

관련 정보