STDERR KSHを使用したテキストベースのメニューデザイン

STDERR KSHを使用したテキストベースのメニューデザイン

より良い表示メニューを得るために、選択コマンドを使用してSTDERR形式を指定できますか?

私には簡単な選択肢があります

    select oChoice in $(<tempMenu.menu) ; do  
      case "$oChoice" in
          *) 
           break
          ;;
      esac
   done

私は次のトリックを試しました。

    exec 3>&1
    select ...
    ...
    done 2>&1 1>&3 | sed 's/^/NICE OUTPUT    /'

ただし、次のエスケープシーケンス(色など)は使用できません。

   ...
   done 22>&1 1>&3 | sed 's/^/\033[1;33m\033[44mNICE OUTPUT    /'
   or
   done 22>&1 1>&3 | sed 's/^/\\033[1;33m\\033[44mNICE OUTPUT    /'

エスケープシーケンスはエスケープされず、PS3もカスタマイズしたため、STDOUTが変更されます。

PS3="$(print \\n\\r)# $(print "\\033[1;33m\\033[44m")"$QUESTION"$(print "\\033[0m\\033[1;1m\\033[44m") `tput sc` $(print "")
#$(print "")
# $(print "")
# Status: $status $(print "")
# $(print "")
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  `tput rc` "

わたしが理解する限度では(画面にstderrのみを表示し、stdoutとstderrをファイルに書き込みます。)STDERRをSTDOUTから切り離すことはできません。それでは、STDOUTのみを使用して動的テキストベースのメニューを作成するよりスマートな方法はありますか? (または私の問題に対する他の解決策)

ベストアンサー1

古い質問に戻って少ない努力実装する。実際、2つの質問が1つに統合されました。

a)STDERRコマンドselectで処理

selectb) コマンドに表示される項目の外観の変更

selectこのコマンドを使用しない選択肢がありました。だから私はその道に行きません。

このselectコマンドはオプションの列レイアウトを自動的に処理するため、非常に便利です。基本的に大文字と小文字を処理するだけです。だから少しではありません車輪を再発明するこれは、いくつかの簡単な状況のための優れたソリューションになることができます。

ア)処理STDERR

元の質問STDERRに対する解決策はすでにありますSTDOUT

select choice in ...; do
...
done 2>&1

両方のファイルハンドルは同じ機能を提供するため、これを操作する理由はありません。STDERRforを使用すると、selectコンテンツが破損することなくSTDOUTリダイレ​​クトなどの他の目的に使用できるため、本当に良い考えです。

selectb) コマンドに表示される項目の外観の変更

解決策は改善する次の構文を採用すると、ここの出力も非常に簡単です。

select choice in $(...); do
...
done

$(...)任意のタスクを実行するために使用されます。化粧品select items

たとえば、ANSI端末で色を指定できます。

$(for i in *; do print "\[E31m$i\E[0m"; done)

または、シェーディング関数を呼び出します(他の状況で再利用可能)。

function colourise_diritems {
    typeset dir=$1 item

    for item in $dir/*; do
        if [[ -d $item ]]; then print "\E[31m$i\E[0m"
        elif [[ -f $item ]]; then print "\E[32m$item\E[0m"
        ...
        fi
    done
}

select choice in $(colourise_diritems $PWD); do
   ...
done

明らかにプロジェクトにタグを追加する場合は、上記の例で使用する前に結果をクリーンアップする必要がありますchoice

choice=${choice#\E[+([^m]*)m}
choice=${choice%\E[+([^m]*)m}

ANSIシーケンスを削除します。

ノート: ANSI シーケンスで作業するのは難しいかもしれませんし、追加のテストが必要です。

おすすめ記事