Existe-t-il un moyen de quitter "less" le mode de suivi sans arrêter d'autres process dans le tube?

Souvent, je me trouve dans le besoin d'avoir la sortie dans un tampon avec toutes les fonctionnalités (défilement, search, raccourcis, …) et je me suis habitué à less .

Cependant, la plupart des commands que j'utilise génèrent des sorties en continu. Utiliser less avec une sortie continue ne fonctionne pas vraiment comme prévu.

Par exemple:

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

Cela entraîne less de capturer la sortie jusqu'à ce qu'il atteigne la hauteur maximale du terminal et à ce point tout s'arrête (j'espère toujours accepter datatables), ce qui me permet d'utiliser les touches de déplacement pour faire défiler vers le haut et vers le bas. C'est l'effet désiré.

Étrangement, lorsque je rattrape le contenu généré (généralement avec PgDn ), il se bloque less et suit de nouveldatatables, ne me permettant pas d'utiliser les touches de déplacement jusqu'à ce que je termine avec ^ C et arrête la command d'origine. Ce n'est pas l'effet désiré.

Est-ce que j'utilise less incorrectement? Y a-t-il un autre programme qui fait ce que je souhaite? Est-il possible de "déverrouiller" à partir de ce mode?

Je vous remercie!

    Fonctionne bien pour moi quand on regarde un file qui est ajouté à mais pas quand l'input vient d'un tuyau (en utilisant la command F – control-C fonctionne bien alors).

    Voir la discussion à Suivez un tuyau en utilisant less? – ceci est un bug / défaut connu en less .

    Y at-il un moyen de sortir "less" suivre le mode sans ^ C?

    Non, mais vous pouvez arranger les choses pour que CTRLC n'affecte pas les autres process du canal, ce qui leur permet de s'exécuter.

    Solution A – se déplaçant less dans son propre groupe de process en utilisant le mode moniteur de shell ( set -m )

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

    L'idée vient de PSkocik et a été donnée dans sa réponse .

    Solution B – manipuler SIGINT ( CTRLC ) pour qu'il ne soit pas livré à d'autres process dans la conduite

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

    Solution donnée par geirha sur #bash IRC channel.