Bash에서 테이블과 같은 CLI 디스플레이를 만드는 가장 좋은 방법은 무엇입니까?

Bash에서 테이블과 같은 CLI 디스플레이를 만드는 가장 좋은 방법은 무엇입니까?

저는 대규모 USB 플래시 메모리 테스트를 위한 Bash 스크립트를 작업 중입니다( f3내부적으로 사용). 여러 열과 셀이 있는 테이블 형식의 인터페이스를 표시해야 합니다.

현재 나는 printfwith를 사용하고 있으며 다음과 같습니다.

여기에 이미지 설명을 입력하세요

로그 파일에 텍스트를 기록하는 각 드라이브에 대해 별도의 기능이 실행 중입니다. 이러한 로그 파일은 구문 분석되어 사용자에게 정보를 표시합니다.

보시다시피 일부 행에는 있어서는 안 되는 오프셋이 있지만 제거할 수 없습니다. 인쇄되는 긴 문자열로 인해 발생하는 것은 아닌 것 같습니다. 이게 뭔지 모르겠어요.

내가 겪고 있는 또 다른 문제는 새로 고침 시간이 필요하고 가끔 stderr 메시지가 나타나거나 grep일부 cat파일이 제대로 읽혀지지 않을 때 전체 화면을 수동으로 지우고 다시 그려야 한다는 것입니다.

나는 현재 이 스크립트를 부분적으로 다시 작성하고 있으며 화면에 데이터를 인쇄하는 것과 관련하여 더 나은 방법이 있습니다. 조사해 볼까 생각했지만 ncurses그건 너무 복잡한 것 같고 아마도 유지 관리하기가 너무 복잡해질 것 같습니다.

echo또는 print명령을 텍스트 파일로 덤프한 다음 이를 한 번에 실행하여 기본적으로 텍스트 "백버퍼"를 갖게 함으로써 새로 고침이 더 일관되고 더 빨라질 수 있는 방법이 있는지 궁금합니다 .

또한 사용자의 키 입력을 듣고 백그라운드에서 이에 반응할 수 있기를 원하지만 그게 우선순위는 아닙니다.

어쩌면 내가 모르는 Bash에서 이런 종류의 작업을 수행하는 더 좋은 방법이 있을까요?

답변1

사용하면 column -t효과가 있을 것입니다.

답변2

tput커서를 이동하는 데 사용할 수 있습니다 . 예를 들어 tput cup 0 0; echo test화면 왼쪽 상단에 "test"라고 쓰게 됩니다.

또는 버퍼링된 접근 방식을 사용하려면 파일에 줄을 덤프하고 화면을 지우고 파일을 분류할 수 있습니다.

# In program setup
TEMPFILE=$(mktemp) # Create temporary file
trap "rm -f $TEMPFILE" EXIT # Remove temporary on exit

# Main lopp
while true
do
  echo "TEST" >$TEMPFILE # Clear file and set first line with >
  date >>$TEMPFILE # Append lines to file with >>

  clear # Clear the screen
  cat $TEMPFILE # Dump the file
  sleep 1 # Just for testing to avoid high CPU
done

trap디버깅을 위해 임시 파일을 남겨두려면 해당 행을 주석 처리하세요 .

답변3

비록 몇 가지 사소한 버그와 성능 문제가 있기는 하지만, 계획했던 일을 거의 달성했다고 생각합니다. 개인적으로 저는 먼저 버그를 해결하려고 노력한 다음 성능을 개선할 수 있는 부분을 이해하려고 노력했습니다. 그러나 새로 고침 빈도와 관련하여 top 또는 watch와 같은 프로그램도 일반적으로 2~1초마다 새로 고침으로 실행되며 이는 일반적으로 충분합니다. 당신은 당신이 달성하려는 목표가 무엇인지 말하지 않습니다.

비슷한 것이 있습니다스택익스체인지 질문에는 두 가지 답변/제안이 있습니다.

  1. dialog다른 것을 배울 수 있는 프로그램을 사용하십시오 .
  2. 화면의 한 위치에서 텍스트를 지우고, 재설정하고, 쓰는 bash 함수의 생성을 보여줍니다. 이는 에서 사용할 수 있는 유사한 함수 세트이지만 ncursesecho(bash 내장 함수)를 사용하는 이점이 있습니다. /usr/bin/printf출력 형식을 지정하기 위해 실행하는 오버헤드를 부담하지 않습니다 .

문제를 차례로 해결하십시오.

  1. 백그라운드 명령에서 인쇄되는 동안 오류가 발생했습니다. 그냥 폐기하려는 경우 stderr를 리디렉션하거나 /dev/null나중에 처리하기 위해 파일로 리디렉션합니다.

  2. 열 버그, 코드, 입력 데이터 및 필수 출력을 표시하면 제안을 드릴 수 있습니다. 이 버그는 버그 #1의 영향일 수 있으므로 #1을 먼저 해결한 후 여전히 존재하는 경우 해결하세요.

  3. 성능(질문 편집)을 수행하고 코드를 추가하면 귀하가 수행 중인 작업을 확인하고 제안할 수 있습니다.

다른 방법은 다른 스크립트 인터프리터를 사용하는 것입니다. 어떤 스크립트에 익숙한지에 따라 선택할 수 있는 것이 너무 많습니다. (awk, python, perl, 기타 쉘, ...). 그러나 ncurses를 사용하지 않을 경우 원칙은 bash다음에 표시된 함수 정의 와 유사합니다.두 번째 답변위에.

관련 정보