web-dev-qa-db-ja.com

シェルスクリプトのncursesのようなライブラリのセット

シェルに次のTUIを提示するとします。

enter image description here

それを行うためにシェルで使用できるライブラリのセットが必要です。確かに、ncursesは依存関係にあるため、使用されていません。

質問:ウィジェット/ウィンドウまたは別のTUIをシェルで構築するにはどうすればよいですか?

1
PersianGulf

さて、あなたは2つの質問のうちの1つを尋ねているように感じるので、両方に答えようとします。

  1. シェルスクリプトのインターフェイスのようなncursesを作成するために使用できるライブラリは何ですか?

    実際、シェル言語で使用することを意図していないため、シェルスクリプトに直接ncursesを推奨することはありませんでした。代わりに、 dialog をお勧めします。 Dialogは、ncursesとShellの間に位置するシムライブラリであり、その使用がはるかに簡単になります。

    これにより、機能的に2つの依存関係(1つはncursesに、もう1つはdialogに)が与えられますが、何らかの理由で反対しているようです。

  2. 外部依存関係が必要ない場合、TUIライブラリのような独自のncursesを作成するにはどうすればよいですか?

    これはway* nix.SEの範囲外です。新しいTUIライブラリの作成は簡単ではありません(特に、純粋なシェルで作成しようとしている場合)。 ncursesの使用の一部を置き換えるために新しいライブラリを作成しようとするプロジェクトはたくさんあります(たとえば、 termbox はより成功したものの1つです)。

    独自のライブラリを作成する場合は、ncursesやtermboxなどの低レベルのプロジェクトと、dialogなどの高レベルのプロジェクトを確認することをお勧めします。彼らの仕事を見ると、どのように始めればよいかがわかるかもしれません。


最終的な推奨事項:

外部プロジェクトへの依存は、(統合とサポートのために)追加の作業が必要ですが、ではありません悪いことではありません。つまり、作成したいツールにのみ集中でき、基盤を下のインフラストラクチャを実行している人に任せることができます。 Linuxは、特に* nixプラットフォーム以外では、依存関係の相互作用の長い歴史があります。

あなたの目標が低レベルのものがどのように行われるかを学ぶことであるならば、それは素晴らしいことです。代わりに、そのような低レベルの作業から利益を得るツールを作成しようとしている場合は、外部ツールに依存するだけです。あなたは幸せになるでしょうし、あなたのコードを見るすべての人も幸せになるでしょう。

8
HalosGhost
#/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
5
user201523