If you are using EShell the following works:
man grep: Add "man" to the list value of eshell-visual-commands and use *man grep instead of man grep at the command line of Eshell.
The commands in eshell-visual-commands are started in term-mode which allows paging if the command does do that.
man has an Eshell-own Elisp implementation eshell/man ...
One way I discovered is to construct the command send to the bash process in such a way that after the execution the bash process gets stopped:
(format "%s; kill -s STOP %s\n" command (process-id bash-process))
This way a process-sentinel can be used to detect when the execution is done and can enable the process again:
(defun sentinel (proc status)