less(1)에서 텍스트 검색을 종료하고 Unix 파이프를 통해 계속 읽기

less(1)에서 텍스트 검색을 종료하고 Unix 파이프를 통해 계속 읽기
gunzip < 100terabytes.txt.gz | less

less(1)화면을 채우는 데 필요한 만큼의 행을 읽은 다음 중지합니다 read(2). 결과적으로 배관이 가득 차면 gunzip(1)막히게 됩니다.write(2)

아래로 스크롤하면 less(1)질문이 계속해서 내보내지고 read(2)파이프가 소비되면 gunzip(1)허용됩니다 write(2). 여기에서 앞뒤로 이동할 수 있는 완전한 유연성이 있습니다( gunzip < 100terabytes.txt.gz아직 완료되지 않았다고 가정).

여태까지는 그런대로 잘됐다.

less(1)텍스트 검색 시작 을 사용할 수 있습니다 /. 그러나 검색 문자열이 에서 발견되지 않으면 100terabytes.txt기본적 less(1)으로 응답하지 않게 됩니다. 검색 종료를 사용할 수 있습니다 Ctrl-C.하지만gunzip(1)와 사이의 파이프를 닫은 것 같습니다 less(1). 나 이거 싫어해. gunzip(1)텍스트 검색을 포기한 후 수동으로 아래로 스크롤하여 더 많은 줄을 사용하고 싶습니다 . 가능합니까?

그래요아니요조언을 구하세요.gunzip < 100terabytes.txt.gz | grep pattern | less

고쳐 쓰다

시도해 볼 수 있습니다od -v /dev/zero | less

답변1

를 누르면 Ctrl+C전체 쉘이 됩니다.일하다(프로세스 그룹) SIGINT를 수신하고 less이를 가로채서 검색을 중단하지만 gunzip종료됩니다. 이를 방지하려면 다음을 수행할 수 있습니다.

(trap '' INT; gunzip < file.gz) | less

이는 SIGINT를 무시하지만 gunzip이후에는 더 이상 중단할 수 없습니다.gunzip

에 대해서는 괜찮을 수 gunzip있습니다. 종료하기만 하면 다음번에 무언가를 쓸 때 SIGPIPE와 함께 죽기 때문입니다. 그러나 무언가를 출력하지 않고 그냥 멈추는 애플리케이션의 경우 이것은 더 큰 질문이 될 것입니다(여전히 가능합니다 . SIGTSTP 또는 SIGQUIT를 사용하는 less경우 ).gunzipCtrl+ZCtrl+\

또한 자체 SIGINT 핸들러를 설치 pv하거나 설치하는 것과 같은 일부 명령은 .pingtrap '' INT

입력을 저장하는 함수를 만들 수 있습니다. 예를 들면 다음과 같습니다.

iless() {
  (trap '' INT; "$@") | less
}

iless gunzip < file.gz

또는:

noint() (trap '' INT; "$@")

noint gunzip < file.gz | less

하지만 다음 사항에 유의하세요.

gunzip < file.gz | grep foo | less

당신은 그것을 작성해야합니다 :

noint gunzip < file.gz | notint grep foo | less

또는:

noint eval 'gunzip < file.gz | grep foo' | less

또는:

iless eval 'gunzip < file.gz | grep foo'

또 다른 방법은 프로세스 대체를 사용하는 것입니다.

less -f <(gunzip < file.gz | grep foo)

또는 ( 에는 없지만 zsh):

less < <(gunzip < file.gz | grep foo)

이러한 경우 쉘은 포그라운드 프로세스 그룹의 프로세스 교체 명령을 포함하지 않습니다( for 의 두 번째 경우 제외 zsh). 해당 프로세스 그룹은 쉘의 프로세스 그룹과 동일합니다. 이는 을 누를 때 SIGINT를 수신하지 않음을 의미합니다 Ctrl+C.

이러한 프로세스는 Ctrl+Z또는 의 영향을 받지 않습니다 Ctrl+\.

zsh, 및 에서 ksh93테스트되었습니다 bash.

답변2

정확한 답변은 아니지만 문제를 해결할 수 있습니다. 에서 man less:

       ESC-F  Like  F,  but  as soon as a line is found which matches the last
              search pattern, the terminal bell is rung and forward  scrolling
              stops.

이 작업은 중단될 수 있지만 ^C문제를 재현할 수 없기 때문에 파이프가 손상될지는 알 수 없습니다(이를 테스트하려면 매우 큰 입력 파일이 필요할 것 같습니다). 일반적으로 증가하는 파일에 대해 이 작업을 반복적으로 수행할 수 있고 여전히 작동하기 때문에 파이프라인이 손상되지 않는다고 생각합니다 F(여전히 파일이 증가하는 것을 볼 수 있음).^CF

문제는 less패턴이 발견되지 않은 경우 정지하지 않고 "마지막으로 검색한 패턴"을 입력하는 방법입니다. 아마도 ^K다음 옵션이 /도움이 될 것입니다.

          ^K     Highlight any text which matches the pattern on the  cur-
                 rent screen, but don't move to the first match (KEEP cur-
                 rent position).

편집: 또는 더 간단히 말하면 ?이 "마지막 검색 모드"를 "설정"하는 것입니다.

관련 정보