Bash 터미널의 특정 공간에 무언가를 인쇄하십시오.

Bash 터미널의 특정 공간에 무언가를 인쇄하십시오.

10분마다 명령줄에 노트북의 배터리 수명을 알려주는 스크립트를 작성했는데 문제는 이를 명령줄에 반영한다는 것입니다. 예를 들어 터미널의 오른쪽 상단에 인쇄하고 싶습니다.

그게 가능합니까?

예: 터미널 창은 다음과 같습니다.

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

명령이 실행된 후 결과는 다음과 같습니다.

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

그러면 거기에 쓰여진 내용을 덮어쓰게 됩니다.

답변1

사용터미널 이스케이프 시퀀스커서를 이동합니다. 거의 모든 터미널은 ANSI에서 표준화되고 VT100에서 대중화된 공통 이스케이프 시퀀스 세트를 사용합니다. 하지만 당신은 사용할 수 있습니다용어 정보이식성과 가독성이라는 두 가지 이점을 갖춘 터미널의 이스케이프 시퀀스를 찾는 데이터베이스입니다. 당신은 그것을 사용할 수 있습니다tput방출 효과용어 정보 기능.

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 2( OSCESC ]).

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

답변2

터미널의 11행 31열에 MSG를 작성하고 창 하단에 쉘 프롬프트를 다시 넣으려면 다음을 수행하십시오.

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

답변3

이것은 당신에게 도움이 될 것입니다BATTERY=50

터미널의 열 번호를 찾은 다음 텍스트의 커서를 조정하고 "BAT $BATTERY%"를 인쇄합니다.

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

관련 정보