파이프라인의 다른 프로세스를 중지하지 않고 "less" 팔로우 모드를 종료할 수 있는 방법이 있습니까?

파이프라인의 다른 프로세스를 중지하지 않고 "less" 팔로우 모드를 종료할 수 있는 방법이 있습니까?

여러 번 나는 모든 기능(스크롤, 검색, 단축키...)이 포함된 버퍼에 출력을 저장해야 한다는 사실을 깨닫고 익숙해졌습니다 less.

그러나 내가 사용하는 대부분의 명령은 지속적으로 출력을 생성합니다. 연속 출력을 사용하면 less실제로 예상한 대로 작동하지 않습니다.

예를 들어:

while sleep 0.5
do
    echo "$(cat /dev/urandom | tr -cd 'a-zA-Z0-9' | head -c 100)"
done | less -R

이로 인해 less출력이 최대 터미널 높이에 도달할 때까지 캡처되며, 이 지점에서 모든 것이 중지되고(아직 데이터를 수용할 수 있기를 바랍니다) 이동 키를 사용하여 위아래로 스크롤할 수 있습니다. 이것이 원하는 효과입니다.

이상한 점은 생성된 콘텐츠(일반적으로 사용)를 따라잡으면 잠금이 PgDn발생 하고 새 데이터를 추적하여 원래 명령을 종료하고 중지할 때까지 이동 키를 사용할 수 없다는 것입니다. 이는 원하는 효과가 아닙니다.less^C

less제가 잘못 사용하고 있는 것은 아닐까요 ? 내 소원을 들어줄 수 있는 다른 프로그램이 있나요? 이 모드에서 "잠금 해제"가 가능합니까?

감사합니다!

답변1

^C를 사용하지 않고 "less" 팔로우 모드를 종료할 수 있는 방법이 있습니까?

예,시작버전 569부터 CTRL+를 사용하여 팔로우 모드를 종료 할 수 있으며 X, 이는 파이프라인의 다른 프로세스를 중지하지 않습니다.

이전 버전의 less( + 만 지원함)의 경우 +를 눌렀을 때 전송된 SIGINT 신호가 파이프의 다른 프로세스에 영향을 주지 않고 계속 실행되도록 CTRL배열하는 것이 가능했습니다 . C이는 다음 중 하나를 수행하여 달성할 수 있습니다.CTRLC

  • 다음을 사용하여 이러한 프로세스를 별도의 프로세스 그룹으로 이동하여 SIGINT가 파이프라인의 다른 프로세스에 도달하지 못하도록 방지합니다.설정값유용:

(setsid seq 10000000) | less +F

  • 다루다(포착) 파이프의 다른 프로세스로 전달되지 않도록 SIGINT:

(trap '' INT; seq 10000000) | less +F

  • 프로세스 대체를 사용하십시오(Bash, Zsh 및 Ksh에서는 구현되지만 Dash 등에서는 구현되지 않는 비 POSIX 기능).

less -f +F <(seq 10000000)

(seq 10000000 &) | less +F

프로세스 그룹 및 신호 처리에 대한 위 명령의 효과를 관찰하려면 ps -O ppid,pgrp,sid,ignored --forest -C bash,less,seq별도의 터미널에서 명령을 사용하는 것이 좋습니다.

답변2

추가할 파일을 볼 때는 잘 작동하지만 입력이 파이프에서 나올 때는 그렇지 않습니다( F-control-C 명령을 사용하면 잘 작동함).

토론 보기파이프라인을 따르고 더 적게 사용하시겠습니까?- 이것은 알려진 버그/단점입니다 less.

답변3

( your_input_pipeline & ) | less +F

그리고

{ your_input_pipeline & } | less +F

Bash에서 작동하는 것 같습니다. less종료 후 INT 신호가 둘러싸는 쉘로 전파된다는 점을 제외하면 Zsh 및 Dash에서도 작동합니다 . Ksh에서는 작동하지 않습니다.

테스트 구성:

GNU bash 5.0.17
dash 0.5.10.2-6 (package version in Ubuntu Linux)
zsh 5.8
less 551

답변4

아마도 가장 간단한 대답은 다음과 같습니다.

trap '' INT
your_input_pipeline | less +F
# you may want to restore or define new INT trap here
echo still in the shell

이는 또한 둘러싸는 쉘이 중단되는 것을 방지합니다. 이는 쉘이 Bash가 아닌 경우 다른 답변에서 발생할 수 있습니다.

관련 정보