Esta é uma solução simples se você estiver disposto a aceitar a saída logo acima da linha de prompt atual.
TRAPUSR1 () { zle -I; unfunction TRAPUSR1 } # invalidate prompt on signal USR1
bufferout () {
local buffer
while read -r line; do # buffer lines from stdin
buffer="$buffer$line\n"
done
print -rn -- $terminfo[dl1] # delete current line
print -rn -- $terminfo[cr] # move cursor to BOL
printf "$buffer" # print buffer
kill -USR1 $$ # send USR1 when we're done
}
unsetopt monitor # don't monitor this job
./testout |& bufferout & disown # bg and disown to suppress notification
setopt monitor # restore job monitoring
Quando o trabalho estiver concluído, o prompt atual e o buffer de entrada serão removidos e a totalidade dos stdout
e stderr
do comando será impressa.
Você pode obter muito mais fantasia do que isso com o módulo zsh/curses
, mas duvido que ofereça uma vantagem significativa o suficiente para merecer o esforço.