menu baseado em texto estilo KSH usando STDERR

4

É possível formatar o STDERR para ter um menu mais bonito usando o comando select?

Eu tenho uma seleção simples

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

Eu tentei um truque como:

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

Mas não consigo usar seqüências de escape (ou seja, cores), por exemplo

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

As seqüências de escape não são escapadas e também o STDOUT é alterado porque eu também personalizei o PS3.

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' "

Tanto quanto eu entendo ( Mostrar apenas stderr na tela, mas escreva stdout e stderr para o arquivo ) não é possível separar o STDERR do STDOUT, então, existe uma maneira mais inteligente de criar menus dinâmicos baseados em texto usando apenas o STDOUT? (ou uma outra maneira de contornar meu problema)

    
por tmow 09.05.2012 / 09:10

1 resposta

0

Outra maneira é evitar selecionar e criar um menu. Faça um script de shell para cada opção de menu (action1.sh, xxx.sh e passwords.sh), configurá-los no menu.cfg:

1 action1 Do action 1
2 xxx Another nice item for you
3 passwords Very dangerous

E inicie um menu com um script que leia menu.cfg

#!/bin/ksh
formatmenu()
{
if [ $# -eq 2 ]
then
            printf "%d) %s\n" ${1} "$2" 
    else
            printf "    %s\n" "${1}"
    fi
}
showMenu()
{
    echo "Enter 0 to stop or choose beneath."
    cat menu.cfg|while read option proces description
    do
            formatmenu ${option} ${proces}
            formatmenu "${description}"
    done
}

getAction()
{
    showMenu
    while [ ${CHOICE} -eq -1 ]
    do
            read CHOICE?"Please enter a digit: "
            if [[ ${CHOICE} != +([0-9]) ]]
            then
                    CHOICE=-1
                    echo "Invalid, please enter a digit."
            fi
    done
}

performAction()
{
    if [ ${CHOICE} -eq 0 ]
    then
            return
    fi
    process=$(grep "^${CHOICE} " menu.cfg | cut -d\  -f2)


        echo "===${process}.sh==="
        . ${process}.sh
}

# Start

export CHOICE=-1
getAction
echo choice=${CHOICE} 
performAction
exit 0
    
por 16.02.2014 / 04:19