新しい端末を開くか新しいログインを行うたびに実行されるコマンドがあります。
このプログラムは、コマンドプロンプトの前に表示される出力(カラー)を生成します。実行に数秒かかることがあり、これまで端末が使用できなくなります(バックグラウンドで実行されない限り)。
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が提案した改善点。ありがとうございます!