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

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

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

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

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

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

보시다시피 일부 줄에는 있어서는 안되는 오프셋이 있지만 제거할 수 없습니다. 인쇄되는 긴 문자열로 인해 발생한 것 같지 않습니다. 나는 그것이 무엇인지 모른다.

내가 겪고 있는 또 다른 문제는 새로 고침 시간이며 가끔 stderr 메시지가 표시되거나 일부 파일이 올바르게 읽히지 않을 때 전체 화면을 수동으로 지우고 다시 그려야 하는 경우도 grep있습니다 cat.

현재 이 스크립트를 부분적으로 다시 작성하고 있으며 화면에 데이터를 더 잘 인쇄할 수 있습니다. 조사해볼까 생각도 해봤 ncurses지만 그건 좀 너무 복잡해 보이고 유지 관리도 복잡해질 수 있었습니다.

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

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

어쩌면 Bash에서 이런 종류의 작업을 수행하는 더 좋은 방법이 있을 수도 있지만 모르겠습니다.

답변1

사용법은 column -t당신에게 적합해야합니다.

답변2

예를 들어 화면 왼쪽 상단에 "test"라고 쓰면 tput움직이는 커서를 사용할 수 있습니다 .tput cup 0 0; echo 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. 백그라운드 명령에서 오류를 인쇄합니다. /dev/null그냥 삭제하려면 나중에 처리할 수 있도록 stderr을 파일로 리디렉션하세요.

  2. 열 오류, 코드, 입력 데이터 및 원하는 출력을 표시하면 권장 사항을 제시할 수 있습니다. 이 버그는 버그 #1의 영향일 가능성이 높으므로 먼저 #1을 수정한 후 이 문제가 여전히 존재하는 경우 수정하세요.

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

또 다른 접근 방식은 다른 스크립트 해석기를 사용하는 것입니다. 익숙한 스크립트 해석기에 따라 많은 옵션이 있습니다. (awk, python, perl, 기타 쉘,...). 그러나 ncurses를 사용할 계획이 없다면 원칙은 bash다음과 유사합니다.두 번째 답변이상.

관련 정보