저는 대규모 USB 플래시 테스트를 위해 (내부적으로 사용되는) Bash 스크립트를 작성하고 있습니다 f3
. 여러 열과 셀이 있는 테이블 형식의 인터페이스를 표시해야 합니다.
현재 나는 printf
with를 사용하고 있으며 다음과 같습니다.
로그 파일에 텍스트를 쓰는 각 드라이브에 대해 별도의 기능을 실행합니다. 이러한 로그 파일은 구문 분석되어 사용자에게 정보를 표시합니다.
보시다시피 일부 줄에는 있어서는 안되는 오프셋이 있지만 제거할 수 없습니다. 인쇄되는 긴 문자열로 인해 발생한 것 같지 않습니다. 나는 그것이 무엇인지 모른다.
내가 겪고 있는 또 다른 문제는 새로 고침 시간이며 가끔 stderr 메시지가 표시되거나 일부 파일이 올바르게 읽히지 않을 때 전체 화면을 수동으로 지우고 다시 그려야 하는 경우도 grep
있습니다 cat
.
현재 이 스크립트를 부분적으로 다시 작성하고 있으며 화면에 데이터를 더 잘 인쇄할 수 있습니다. 조사해볼까 생각도 해봤 ncurses
지만 그건 좀 너무 복잡해 보이고 유지 관리도 복잡해질 수 있었습니다.
echo
OR 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초마다 새로 고쳐지더라도 일반적으로 충분합니다. 어떤 속도를 달성하고 싶은지 말하지 않았습니다.
비슷한 것이 있습니다스택 교환 질문에는 두 가지 답변/제안이 있습니다.
- 프로그램을 사용하는
dialog
것은 배우는 또 다른 것입니다. - 화면 어딘가에 텍스트를 지우고, 재설정하고, 쓰기 위한 bash 함수의 생성을 보여줍니다. 에서 사용할 수 있지만
ncurses
echo(bash 내장 함수)를 사용하는 이점이 있는 유사한 기능 세트이므로/usr/bin/printf
오버헤드가 발생하지 않습니다. 형식화된 출력을 실행 중입니다.
문제를 차례로 해결하십시오.
백그라운드 명령에서 오류를 인쇄합니다.
/dev/null
그냥 삭제하려면 나중에 처리할 수 있도록 stderr을 파일로 리디렉션하세요.열 오류, 코드, 입력 데이터 및 원하는 출력을 표시하면 권장 사항을 제시할 수 있습니다. 이 버그는 버그 #1의 영향일 가능성이 높으므로 먼저 #1을 수정한 후 이 문제가 여전히 존재하는 경우 수정하세요.
성능(질문 편집)을 수행하고 코드를 추가하면 귀하가 수행 중인 작업을 확인하고 제안할 수 있습니다.
또 다른 접근 방식은 다른 스크립트 해석기를 사용하는 것입니다. 익숙한 스크립트 해석기에 따라 많은 옵션이 있습니다. (awk, python, perl, 기타 쉘,...). 그러나 ncurses를 사용할 계획이 없다면 원칙은 bash
다음과 유사합니다.두 번째 답변이상.