web-dev-qa-db-ja.com

端末の右下隅に文字列を出力する

端末の右下隅に文字列を出力するにはどうすればよいですか?

5
PSkocik
string=whatever
stty size | {
  read y x
  tput sc # save cursor position
  tput cup "$((y - 1))" "$((x - ${#string}))" # position cursor
  printf %s "$string"
  tput rc # restore cursor.
}

これは、$stringのすべての文字が1つであると想定していますcell幅(そして$stringには制御文字(改行、タブなど)が含まれていません)。

stringにゼロ幅(文字の結合など)または倍幅のものが含まれる場合は、ksh93のprintf%Ls形式指定子を使用して、ベースまたは文字幅をフォーマットできます。

string='whatéver'
# aka string=$'\uFF57\uFF48\uFF41\uFF54\uFF45\u0301\uFF56\uFF45\uFF52'
stty size | {
  read y x
  tput sc # save cursor position
  tput cup "$((y - 1))" 0 # position cursor
  printf "%${x}Ls" "$string"
  tput rc # restore cursor.
}

しかし、それは最後の行の先頭部分を消去します。

8
tput cup $(tput lines) $[$(tput cols)-16]
printf "string"

または

tput cup $[$(tput lines)-1] $[$(tput cols)-16]
printf "string"

ここで、16は文字列用に予約する長さです。

4
Jonah