web-dev-qa-db-ja.com

端末の特定のスペースにbashで何かを印刷します

コマンドラインで10分ごとにラップトップのバッテリ寿命を通知するスクリプトを作成しましたが、問題はコマンドラインにエコーすることです。端末の右上隅などに印刷したいのですが。

それは可能ですか?

例:これはターミナルウィンドウです。

=====================
|texttexttexttexttex|
|t                  |
|moretext           |
|somethingsomething |
|me@me:~$...        |
=====================

そしてコマンドの後、これは結果です:

=====================
|texttexttextBAT-50%|
|t                  |
|moretext           |
|somethingsomething |
|me@me:~$...        |
=====================

したがって、そこに書き込まれたものはすべて上書きされます。

8
Lhakryma DL

ターミナルエスケープシーケンス を使用してカーソルを移動します。実質的にすべての端末は、ここで十分な共通のエスケープシーケンスのセットを使用します。これは、ANSIによって標準化され、VT100で広く使用されています。ただし、 terminfo データベースを使用して、端末のエスケープシーケンスを検索できます。移植性と可読性の2つの利点があります。 tput ユーティリティを使用して terminfo capabilities を発行できます。

print_in_top_right () {
  local columns=$(tput cols)           # get the terminal width
  local text=${1:0:$columns}           # truncate the text to fit on a line if needed
  tput sc                              # Save the Cursor position
  tput cup 0 $((columns - ${#text}))   # move the CUrsor Position to the top line, with just enough space for $text on the right
  printf %s "$text"
  tput rc                              # Restore the Cursor position saved by sc
}

端末がスクロールするとすぐに、このテキストがスクロールします。端末にテキストを重ねて表示するための一般的な機能はありません。それが必要な場合は、この機能を備えたターミナルエミュレータが必要です。通常、この目的のために専用回線が予約されています。ほとんどのグラフィカルターミナルエミュレータでは、 xterm互換のエスケープシーケンスOSC 2OSC is ESC ])で設定できるウィンドウタイトルを確認できます。

set_window_title () {
  printf '\e]2;%s\007' "$1"
}

MSGを11行目に記述し、端末のcol 31にして、シェルプロンプトをウィンドウの下部に戻します。

echo "$( tput cup 10 30 )${MSG}$( tput cup ${LINES} 0))" && echo
2
Paul_Pedant

これは、_BATTERY=50_を想定して機能するはずです。

端末の列数を見つけて、カーソルをテキストに合わせて調整し、「BAT $ BATTERY%」を出力します

echo "$(tput cup 0 $(expr $(tput cols) - 7))BAT $BATTERY%" && echo

2
binarysta