TUI
シェルに以下を表示するとします。
これを行うには、シェルで使用できるライブラリセットが必要です。ncurses
依存関係を作成するため、まだ使用されていないことは確実です。
TUI
Q:シェルでウィジェット/ウィンドウまたは他の部分を構築する方法は?
答え1
さて、私の考えには2つの質問のうちの1つを尋ねてみたいと思いますので、両方の質問にお答えします。
シェルスクリプトのncursesに似たインタフェースを作成するためにどのライブラリを使用できますか?
実際、私はシェルスクリプトにncursesを直接推奨しません。なぜなら、ncursesは実際にはシェル言語で使用するように設計されていないからです。代わりにお勧めします
dialog
。 Dialog は ncurses とシェルの間に位置し、使いやすくする shim ライブラリです。ncurses
これは機能的に2つの依存関係(1つはon、もう1つはon)を提供しますがdialog
、何らかの理由でこれに反対するようです。外部依存関係が必要ない場合は、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