![less(1)에서 텍스트 검색을 종료하고 Unix 파이프를 통해 계속 읽기](https://linux55.com/image/85578/less(1)%EC%97%90%EC%84%9C%20%ED%85%8D%EC%8A%A4%ED%8A%B8%20%EA%B2%80%EC%83%89%EC%9D%84%20%EC%A2%85%EB%A3%8C%ED%95%98%EA%B3%A0%20Unix%20%ED%8C%8C%EC%9D%B4%ED%94%84%EB%A5%BC%20%ED%86%B5%ED%95%B4%20%EA%B3%84%EC%86%8D%20%EC%9D%BD%EA%B8%B0.png)
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
경우 ).gunzip
Ctrl+ZCtrl+\
또한 자체 SIGINT 핸들러를 설치 pv
하거나 설치하는 것과 같은 일부 명령은 .ping
trap '' 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
(여전히 파일이 증가하는 것을 볼 수 있음).^C
F
문제는 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).
편집: 또는 더 간단히 말하면 ?
이 "마지막 검색 모드"를 "설정"하는 것입니다.