파이프에서 **less**(`+F`)를 사용하여 _follow_ 모드를 종료하는 방법은 무엇입니까?

파이프에서 **less**(`+F`)를 사용하여 _follow_ 모드를 종료하는 방법은 무엇입니까?

Bash에 다음과 같은 더미 명령이 있다고 가정합니다.

### dummy long_operation_cmd function, for easy reproduction:
function long_operation_cmd() {
  echo "operation 1"
  sleep 5
  echo "operation 2"
}

현재 다음과 같이 bash 스크립트를 실행 중입니다.

{
    long_operation_cmd
    echo '===ALL DONE==='
} > /tmp/logfile.tmp &
tail -f /tmp/logfile.tmp | sed '/^===ALL DONE===$/ q' \
&& rm /tmp/logfile.tmp

이를 통해 백그라운드에서 긴 작업을 안전하게 실행하고, 출력을 추적하고, Ctrl+C가 실행을 중단하지 않도록 할 수 있습니다.

가장 중요한 점은 작업이 완료되면 sed팔로우 모드에서 나갈 수 있다는 것입니다.

tail -f나는 으로 바꾸고 싶었는데 less +F, 이것이 내가 생각해낸 것입니다:

{
    long_operation_cmd
    echo '===ALL DONE==='
} > /tmp/logfile.tmp &
less +F -- /tmp/logfile.tmp \
&& rm /tmp/logfile.tmp

===ALL DONE===그런데 팔로우 모드에 도달했을 때(또는 작업이 완료되었을 때) long_operation_cmd자동으로 팔로우 모드에서 빠져 나오는 방법을 찾을 수 없습니다.

이 문제 해결에 대한 제안 사항이 있습니까?

답변1

"ALL DONE"이면 프로세스에 SIGINT 신호를 보낼 수 있습니다.

kill -int PID

하지만 이를 위해서는 PID를 알아야 합니다( less +F백그라운드에서도 실행 중입니까?).

답변2

다른 길을 가게 될 것 같습니다.

tail -fCtrl-C를 먼저 캡쳐한 후 줄여 보겠습니다 . 모든 것이 순조롭게 진행되면 실행하지 않지만 "실패" less하면 tail(Ctrl+C의 경우) 덜 시작합니다. 원할 경우 "F"를 계속해서 사용할 수 있습니다.

최종 결과는 다음과 같습니다.

{
    long_operation_cmd
    echo '===ALL DONE==='
} > /tmp/logfile.tmp &
(trap : INT; tail -f /tmp/logfile.tmp | sed '/^===ALL DONE===$/ q' ) \
|| less +G /tmp/logfile.tmp && rm /tmp/logfile.tmp

관련 정보