ncurses와 같은 쉘 스크립트의 라이브러리 세트

ncurses와 같은 쉘 스크립트의 라이브러리 세트

TUI셸에 다음을 표시한다고 가정합니다.

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

이를 수행하려면 셸에서 사용할 수 있는 라이브러리 세트가 필요합니다. ncurses종속성을 생성하기 때문에 아직 사용되지 않았 음이 확실합니다 .

TUI질문: 쉘에서 위젯/창 또는 기타 부분을 빌드하는 방법은 무엇입니까 ?

답변1

글쎄요, 제 생각에는 두 가지 질문 중 하나를 물어보실 것 같아서 두 가지 질문 모두에 답해 드리겠습니다.

  1. 쉘 스크립트에 대한 ncurses와 유사한 인터페이스를 생성하는 데 어떤 라이브러리를 사용할 수 있습니까?

    사실, 나는 쉘 스크립팅에 ncurses를 직접적으로 권장하지 않습니다. 왜냐하면 ncurses는 실제로 쉘 언어에서 사용하도록 설계되지 않았기 때문입니다. 대신 추천드리고 싶습니다dialog. Dialog는 ncurses와 쉘 사이에 위치하여 사용을 더 쉽게 만드는 shim 라이브러리입니다.

    ncurses이는 기능적으로 두 가지 종속성(하나는 on , 다른 하나는 on ) 을 제공하는데 dialog, 어떤 이유로든 이에 반대하는 것 같습니다.

  2. 외부 종속성이 필요하지 않은 경우 ncurses와 유사한 TUI 라이브러리를 어떻게 만들 수 있습니까?

    이것은방법범위를 벗어났습니다. *nix.SE. 새 TUI 라이브러리를 생성하는 것은 쉽지 않습니다(특히 순수 셸에서 생성하려는 경우). ncurses의 일부 사용을 대체하기 위해 새로운 라이브러리를 만들려는 많은 프로젝트가 있습니다(예:termbox더 성공적인 것 중 하나입니다).

    자신만의 라이브러리를 만들 계획이라면 ncurses 및 termbox와 같은 하위 수준 프로젝트와 대화 상자와 같은 상위 수준 프로젝트를 살펴보는 것이 좋습니다. 그들의 작업을 살펴보면 시작하는 방법에 대한 아이디어를 얻을 수 있습니다.


최종 조언:

일부 추가 작업(통합 및 지원을 위해)이 필요하지만 외부 프로젝트에 대한 종속성아니요나쁜 일이다. 즉, 만들고 싶은 도구에만 집중하고 기본 작업은 하위 인프라에서 작업하는 사람들에게 맡길 수 있습니다. Linux, 특히 *nix 플랫폼 외부에서는 종속성 상호 작용의 오랜 역사를 가지고 있습니다.

당신의 목표가 낮은 수준의 작업이 어떻게 수행되는지 이해하는 것이라면 그렇게 하십시오. 대신, 그러한 낮은 수준의 작업을 활용하는 도구를 만들려면 외부 도구에 의존하세요. 당신은 더 행복해질 것이고, 당신의 코드를 보는 모든 사람도 마찬가지일 것입니다.

답변2

#/bin/bash
      E='echo -e';e='echo -en';trap "R;exit" 2
    ESC=$( $e "\e")
   TPUT(){ $e "\e[${1};${2}H";}
  CLEAR(){ $e "\ec";}
  CIVIS(){ $e "\e[?25l";}
   DRAW(){ $e "\e%@\e(0";}
  WRITE(){ $e "\e(B";}
   MARK(){ $e "\e[7m";}
 UNMARK(){ $e "\e[27m";}
      R(){ CLEAR ;stty sane;$e "\ec\e[37;44m\e[J";};
   HEAD(){ DRAW
           for each in $(seq 1 13);do
           $E "   x                                          x"
           done
           WRITE;MARK;TPUT 1 5
           $E "BASH SELECTION MENU                       ";UNMARK;}
           i=0; CLEAR; CIVIS;NULL=/dev/null
   FOOT(){ MARK;TPUT 13 5
           printf "ENTER - SELECT,NEXT                       ";UNMARK;}
  ARROW(){ read -s -n3 key 2>/dev/null >&2
           if [[ $key = $ESC[A ]];then echo up;fi
           if [[ $key = $ESC[B ]];then echo dn;fi;}
     M0(){ TPUT  4 20; $e "Login info";}
     M1(){ TPUT  5 20; $e "Network";}
     M2(){ TPUT  6 20; $e "Disk";}
     M3(){ TPUT  7 20; $e "Routing";}
     M4(){ TPUT  8 20; $e "Time";}
     M5(){ TPUT  9 20; $e "ABOUT  ";}
     M6(){ TPUT 10 20; $e "EXIT   ";}
      LM=6
   MENU(){ for each in $(seq 0 $LM);do M${each};done;}
    POS(){ if [[ $cur == up ]];then ((i--));fi
           if [[ $cur == dn ]];then ((i++));fi
           if [[ $i -lt 0   ]];then i=$LM;fi
           if [[ $i -gt $LM ]];then i=0;fi;}
REFRESH(){ after=$((i+1)); before=$((i-1))
           if [[ $before -lt 0  ]];then before=$LM;fi
           if [[ $after -gt $LM ]];then after=0;fi
           if [[ $j -lt $i      ]];then UNMARK;M$before;else UNMARK;M$after;fi
           if [[ $after -eq 0 ]] || [ $before -eq $LM ];then
           UNMARK; M$before; M$after;fi;j=$i;UNMARK;M$before;M$after;}
   INIT(){ R;HEAD;FOOT;MENU;}
     SC(){ REFRESH;MARK;$S;$b;cur=`ARROW`;}
     ES(){ MARK;$e "ENTER = main menu ";$b;read;INIT;};INIT
  while [[ "$O" != " " ]]; do case $i in
        0) S=M0;SC;if [[ $cur == "" ]];then R;$e "\n$(w        )\n";ES;fi;;
        1) S=M1;SC;if [[ $cur == "" ]];then R;$e "\n$(ifconfig )\n";ES;fi;;
        2) S=M2;SC;if [[ $cur == "" ]];then R;$e "\n$(df -h    )\n";ES;fi;;
        3) S=M3;SC;if [[ $cur == "" ]];then R;$e "\n$(route -n )\n";ES;fi;;
        4) S=M4;SC;if [[ $cur == "" ]];then R;$e "\n$(date     )\n";ES;fi;;
        5) S=M5;SC;if [[ $cur == "" ]];then R;$e "\n$($e by oTo)\n";ES;fi;;
        6) S=M6;SC;if [[ $cur == "" ]];then R;exit 0;fi;;
 esac;POS;done

관련 정보