パイプで **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

関連情報