より良い表示メニューを得るために、選択コマンドを使用して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
で処理
select
b) コマンドに表示される項目の外観の変更
select
このコマンドを使用しない選択肢がありました。だから私はその道に行きません。
このselect
コマンドはオプションの列レイアウトを自動的に処理するため、非常に便利です。基本的に大文字と小文字を処理するだけです。だから少しではありません車輪を再発明するこれは、いくつかの簡単な状況のための優れたソリューションになることができます。
ア)処理STDERR
元の質問STDERR
に対する解決策はすでにありますSTDOUT
。
select choice in ...; do
...
done 2>&1
両方のファイルハンドルは同じ機能を提供するため、これを操作する理由はありません。STDERR
forを使用すると、select
コンテンツが破損することなくSTDOUT
リダイレクトなどの他の目的に使用できるため、本当に良い考えです。
select
b) コマンドに表示される項目の外観の変更
解決策は改善する次の構文を採用すると、ここの出力も非常に簡単です。
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 シーケンスで作業するのは難しいかもしれませんし、追加のテストが必要です。