端末の特定の位置にバックグラウンドプロセスの標準出力を表示します。

端末の特定の位置にバックグラウンドプロセスの標準出力を表示します。

新しい端末を開くか新しいログインを行うたびに実行されるコマンドがあります。

このプログラムは、コマンドプロンプトの前に表示される出力(カラー)を生成します。実行に数秒かかることがあり、これまで端末が使用できなくなります(バックグラウンドで実行されない限り)。

zshには既存のテキストを破壊せずに端末を再描画する高度な方法があるので、端末を使用する前に完了するのを待たずにこのコマンドを実行する方法を知りたいです。しかし、一度完了すると、最初からバックステージがなかったかのように出力が印刷されます。

実際、私は次のことをしたいと思います。

Command output:
... (running on background)
me@computer: somecommand
me@computer: someothercommand

コマンドが完了すると、次のようになります。

Command output:
 * Output foo
 * Multiple lines bar
 * and some yada
me@computer: somecommand
me@computer: someothercommand

起動時にプロセスをバックグラウンドに入れようとしましたが、出力が明確に表示されません。私は次のようなものを得ます:

Command output:
[2] 32207
me@computer: somecommand
me@computer: someother * Output foo
 * Multiple lines bar
 * and some yada
[2]  + done       command
me@computer: someothercommand

では、これは可能ですか? zshを使用せずにこれを行うことができるソリューションはありますか?

どんな指示や情報も歓迎します。

答え1

現在のプロンプト行の上の出力を受け入れたい場合は、これは簡単な解決策です。

bufferout () {
    local buffer
    while IFS= read -r line; do              # buffer stdin
        buffer="$buffer$line\n"
    done
    print -rn -- $terminfo[dl1]              # delete current line
    printf "$buffer"                         # print buffer
    kill -USR1 $$                            # send USR1 when done
}

TRAPUSR1 () {                                # USR1 signal handler
    zle -I                                   # invalidate prompt
    unhash -f TRAPUSR1 bufferout             # remove ourselves
}

./testout 2>&1 | bufferout &!                # run in background, disowned

ジョブが完了すると、現在のプロンプトと入力バッファが削除され、コマンド全体stdoutの合計が印刷されます。stderr

これは一度だけ実行され、後でそれ自体が削除されると仮定します。unhash -f同じシェルでこの機能を再利用するにはTRAPUSR1


この回答には以下が含まれます。コメントでClint Priestが提案した改善点。ありがとうございます!

関連情報