Um conjunto de bibliotecas como ncurses em um shell script

0

Suponha que você apresente o seguinte TUI no shell:

Eu preciso de um conjunto de bibliotecas que possam ser usadas no shell para fazer isso. Certamente, ncurses não foi usado porque faz uma dependência.

Pergunta: Como construir o widget / janela ou outro TUI no shell?

    
por PersianGulf 13.09.2014 / 16:18

2 respostas

5

Ok, eu sinto que você pode estar fazendo uma de duas perguntas, então vou tentar responder a ambos.

  1. Quais bibliotecas podem ser usadas para criar ncurses como interfaces para shell scripts?

    Na verdade, eu nunca recomendaria ncurses diretamente para scripts de shell, uma vez que não é para ser usado por linguagens shell. Em vez disso, eu recomendaria dialog . Dialog é uma biblioteca de shims que fica entre ncurses e o shell, tornando seu uso muito mais simples.

    Isso funcionalmente lhe daria duas dependências (uma em ncurses e outra em dialog ) com as quais você parece estar contra por algum motivo.

  2. Dado que não quero dependências externas, como posso criar minha própria biblioteca TUI semelhante a ncurses?

    Este é caminho fora do escopo de * nix.SE. Criar uma nova biblioteca TUI não será trivial (especialmente se você estiver tentando criá-la em shell puro). Tem havido muitos projetos para tentar criar novas bibliotecas para substituir parte do uso de ncurses (por exemplo, termbox é um dos os mais bem sucedidos).

    Se você pretende criar sua própria biblioteca, talvez queira examinar os projetos de nível inferior, como ncurses e termbox, e projetos de nível superior, como o diálogo. Observar o trabalho deles pode dar uma ideia de como começar.

Uma recomendação final:

Dependências em projetos externos, embora requeiram algum trabalho extra (para integração e suporte), não são uma coisa ruim. Isso significa que você pode se concentrar apenas na ferramenta que deseja fazer e deixar o trabalho de base para quem faz a infra-estrutura mais baixa. O Linux, em particular fora das plataformas * nix, tem uma longa história de interação de dependências.

Se o seu objetivo é aprender como o material de nível inferior é feito, ótimo vá em frente. Se, em vez disso, você estiver tentando criar uma ferramenta que se beneficiaria desse trabalho de baixo nível, apenas dependa de uma ferramenta externa. Você será mais feliz e todos serão os que olharem para o seu código.

    
por 13.09.2014 / 20:09
1
#/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
    
por 21.11.2016 / 14:53