Estou escrevendo um script wrapper de shell que deve funcionar como um pager (recebendo entrada em stdin e executando saída em um tty).
Este wrapper prepara o ambiente e as linhas de comando e, em seguida, inicia dois processos em um pipeline: o primeiro é um filtro não interativo e o último é o pager real que precisa controlar um tty (ou melhor, gera o próprio pager real) :
#!/bin/bash
...
col -bx | bat "${bat_args[@]}" --paging=always
A árvore de processos resultante é assim:
<parent>
\- wrapper.sh
|- col -bx (dies)
\- bat ...
\- less ...
O col -bx
processo sai após filtrar a entrada e é colhido pelo shell.
É possível se livrar do processo shell, de modo que ele não permaneça enquanto o pager estiver em execução?
Pensei em uma solução alternativa usando substituição de processo:
exec bat "${bat_args[@]}" --paging=always < <(col -bx)
Porém, o col -bx
processo não é colhido pelo shell e permanece no estado Z. Existe uma maneira "certa" de escrever esse wrapper?